Apivalk follows and introduces modern best practices for OpenAPI
TBD
Was this page helpful?
⌘I
{"docsConfig":{"theme":"maple","$schema":"https://mintlify.com/docs.json","name":"Apivalk","colors":{"primary":"#6366F1","light":"#6366F1","dark":"#6366F1"},"logo":{"light":"https://mintcdn.com/dopodev/n-IShNTbGm8ntRim/img/logo.svg?fit=max\u0026auto=format\u0026n=n-IShNTbGm8ntRim\u0026q=85\u0026s=b4e1cdd1cd4ea8b4a7d3c7fe481bf9e0","dark":"https://mintcdn.com/dopodev/n-IShNTbGm8ntRim/img/logo.svg?fit=max\u0026auto=format\u0026n=n-IShNTbGm8ntRim\u0026q=85\u0026s=b4e1cdd1cd4ea8b4a7d3c7fe481bf9e0"},"favicon":"https://mintcdn.com/dopodev/n-IShNTbGm8ntRim/img/logo.svg?fit=max\u0026auto=format\u0026n=n-IShNTbGm8ntRim\u0026q=85\u0026s=b4e1cdd1cd4ea8b4a7d3c7fe481bf9e0","background":{"decoration":"gradient"},"navbar":{"primary":{"type":"button","label":"Main page","href":"https://apivalk.com"}},"footer":{"socials":{"github":"https://github.com/apivalk"}},"fonts":{"family":"Inter"},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"styling":{"latex":false},"navigation":{"global":{"anchors":[{"anchor":"Releases","icon":"newspaper","href":"https://github.com/apivalk/apivalk/releases"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"dopodev","hasAudioNarration":false,"actualSubdomain":"dopodev","customDomains":["docs.apivalk.com"],"gitSource":{"type":"github","owner":"apivalk","repo":"apivalk","deployBranch":"main","contentDirectory":"docs","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6ad5d72491471779d28bbb92","collectionId":"f83ee47d-1784-495a-817d-c8d8a6941b6a","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6ad5d72491471779d28bbb92"},"feedback":{"thumbs":true},"entitlements":{},"buildId":"6ad5d72491471779d28bbb92","clientVersion":"0.0.3965","searchFilterCounts":[{"language":"default","tag":"Documentation","count":70},{"language":"default","tag":"How-To Guides","count":15},{"language":"default","tag":"Documentation (OpenAPI)","count":8},{"language":"default","tag":"HTTP","count":8},{"language":"default","tag":"Getting started","count":6},{"language":"default","tag":"Middleware","count":6},{"language":"default","tag":"API Standards","count":6},{"language":"default","tag":"Concepts","count":4},{"language":"default","tag":"Resources","count":4},{"language":"default","tag":"Routing","count":4}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableAskAiSearchBar":true},"hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"concepts/best-openapi-practices","slug":"/concepts/best-openapi-practices","pageMetadata":{"title":"Best OpenAPI/REST Practices","description":"Apivalk follows and introduces modern best practices for OpenAPI","href":"/concepts/best-openapi-practices"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Apivalk follows and introduces modern best practices for OpenAPI\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{jsx:_jsx}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={p:`p`,..._provideComponents(),...props.components};return _jsx(_components.p,{children:`TBD`})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Best OpenAPI/REST Practices","description":"Apivalk follows and introduces modern best practices for OpenAPI","href":"/concepts/best-openapi-practices"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[],"codeExamples":{}},"jsLinks":[],"subdomain":"dopodev","siteName":"Apivalk","title":"Best OpenAPI/REST Practices - Apivalk","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-09-01T00:43:02.109Z","originalFileLocation":"concepts/best-openapi-practices.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Apivalk follows and introduces modern best practices for OpenAPI\">\u003cmeta data-mint-head name=\"application-name\" content=\"Apivalk\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Best OpenAPI/REST Practices - Apivalk\">\u003cmeta data-mint-head property=\"og:description\" content=\"Apivalk follows and introduces modern best practices for OpenAPI\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Apivalk\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.apivalk.com/concepts/best-openapi-practices\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://dopodev.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Best+OpenAPI%2FREST+Practices\u0026amp;description=Apivalk+follows+and+introduces+modern+best+practices+for+OpenAPI\u0026amp;theme=68ee9ada8ed14fab10bb10a0\u0026amp;signature=9f421a1285927cbbc54212c847e39a511bfb396828bf1c16711744bd8afee35d\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Best OpenAPI/REST Practices - Apivalk\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Apivalk follows and introduces modern best practices for OpenAPI\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://dopodev.mintlify.app/_mintlify/api/og/v2?division=Concepts\u0026amp;title=Best+OpenAPI%2FREST+Practices\u0026amp;description=Apivalk+follows+and+introduces+modern+best+practices+for+OpenAPI\u0026amp;theme=68ee9ada8ed14fab10bb10a0\u0026amp;signature=9f421a1285927cbbc54212c847e39a511bfb396828bf1c16711744bd8afee35d\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/dopodev/1pQahJhhas405mFM/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Apivalk\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#6366F1\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.apivalk.com/concepts/best-openapi-practices\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/concepts/best-openapi-practices.md\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.apivalk.com/#organization\",\"name\":\"Apivalk\",\"url\":\"https://docs.apivalk.com\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/dopodev/n-IShNTbGm8ntRim/img/logo.svg?fit=max\u0026auto=format\u0026n=n-IShNTbGm8ntRim\u0026q=85\u0026s=b4e1cdd1cd4ea8b4a7d3c7fe481bf9e0\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.apivalk.com#website\",\"name\":\"Apivalk\",\"url\":\"https://docs.apivalk.com\",\"publisher\":{\"@id\":\"https://docs.apivalk.com/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.apivalk.com/concepts/best-openapi-practices#webpage\",\"url\":\"https://docs.apivalk.com/concepts/best-openapi-practices\",\"name\":\"Best OpenAPI/REST Practices\",\"description\":\"Apivalk follows and introduces modern best practices for OpenAPI\",\"dateModified\":\"2026-09-01T00:43:02.109Z\",\"isPartOf\":{\"@id\":\"https://docs.apivalk.com#website\"},\"breadcrumb\":{\"@id\":\"https://docs.apivalk.com/concepts/best-openapi-practices#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.apivalk.com/concepts/best-openapi-practices#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Concepts\",\"item\":\"https://docs.apivalk.com/concepts/coding-standards\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Best OpenAPI/REST Practices\",\"item\":\"https://docs.apivalk.com/concepts/best-openapi-practices\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.apivalk.com/concepts/best-openapi-practices#article\",\"headline\":\"Best OpenAPI/REST Practices\",\"name\":\"Best OpenAPI/REST Practices\",\"description\":\"Apivalk follows and introduces modern best practices for OpenAPI\",\"url\":\"https://docs.apivalk.com/concepts/best-openapi-practices\",\"mainEntityOfPage\":{\"@id\":\"https://docs.apivalk.com/concepts/best-openapi-practices#webpage\"},\"dateModified\":\"2026-09-01T00:43:02.109Z\",\"publisher\":{\"@id\":\"https://docs.apivalk.com/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.apivalk.com#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"Apivalk\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"Apivalk","nav":{"global":{"anchors":[{"anchor":"Releases","icon":"newspaper","href":"https://github.com/apivalk/apivalk/releases"}]},"tabs":[{"tab":"Documentation","groups":[{"group":"Getting started","pages":[{"title":"Intro","href":""},{"title":"Configuration","href":"/configuration"},{"title":"Contributing","href":"/contributing"},{"title":"Deprecation \u0026 Upgrade","href":"/deprecating-upgrade"},{"title":"Installation","href":"/installation"},{"title":"Support Policy Release Cycle","href":"/support-policy-release-cycle"}]},{"group":"Concepts","pages":[{"title":"Coding Standards","href":"/concepts/coding-standards"},{"title":"Request Lifecycle","href":"/concepts/request-lifecycle"},{"title":"Structure","description":"Apivalk highly focuses SRP and therefore is also in generla designed to be like that. Controllers are invokable, you have a sepearte request and response","href":"/concepts/structure"},{"title":"Best OpenAPI/REST Practices","href":"/concepts/best-openapi-practices"}]},{"group":"HTTP","pages":[{"title":"Overview","description":"The HTTP layer in Apivalk provides a robust, type-safe, and structured way to handle the web request/response cycle. It bridges the gap between raw PHP superglobals and your business logic.","href":"/http/index"},{"title":"Controller","href":"/http/controller"},{"title":"Request","href":"/http/request"},{"title":"Response","href":"/http/response"},{"title":"Pagination","href":"/http/pagination"},{"title":"Filtering","href":"/http/filtering"},{"title":"Sorting","href":"/http/sorting"},{"title":"Localization","href":"/http/localization"}]},{"group":"Resources","pages":[{"title":"Resources","href":"/resources/index"},{"title":"Defining a Resource","href":"/resources/resource"},{"title":"Resource Controllers","href":"/resources/controllers"},{"title":"Resource Responses","href":"/resources/responses"}]},{"group":"Routing","pages":[{"title":"Routing","href":"/routing/index"},{"title":"Route","href":"/routing/route"},{"title":"Router","href":"/routing/router"},{"title":"Rate Limit","href":"/routing/rate-limit"}]},{"group":"Cache","pages":[{"title":"Overview","href":"/cache/index"},{"title":"Filesystem \u0026 Custom Cache","href":"/cache/filesystem-cache"}]},{"group":"Middleware","pages":[{"title":"Middleware","href":"/middleware/index"},{"title":"Request Validation","href":"/middleware/request-validation"},{"title":"Security Responsibilities","href":"/middleware/security-responsibilities"},{"title":"Authentication Middleware","href":"/middleware/authentication"},{"title":"Security Middleware","href":"/middleware/security"},{"title":"Rate Limit Middleware","href":"/middleware/rate-limit"}]},{"group":"Documentation (OpenAPI)","pages":[{"title":"Overview","href":"/documentation/index"},{"title":"Docblock Generator","href":"/documentation/docblock-generator"},{"title":"OpenAPI Generator","href":"/documentation/openapi-generator"},{"title":"Property","href":"/documentation/property"},{"title":"Property Collection","href":"/documentation/property-collection"},{"title":"Request","href":"/documentation/request"},{"title":"Response","href":"/documentation/response"},{"title":"Response Objects","href":"/documentation/response-objects"}]},{"group":"Core System","pages":[{"title":"Error Handling","href":"/core/error-handling"},{"title":"Events","href":"/core/events"},{"title":"Util","href":"/util"}]},{"group":"Security","pages":[{"title":"Overview","href":"/security/index"},{"title":"Identities","href":"/security/identity"},{"title":"Authenticators","href":"/security/authenticator"}]},{"group":"Customization","pages":[{"title":"Customization","href":"/customization/customization"}]},{"group":"How-To Guides","pages":[{"title":"How-To Guides","href":"/how-to/index"},{"title":"Configure Apivalk","href":"/how-to/configure"},{"title":"Build a public endpoint: GET /health","href":"/how-to/public-endpoint"},{"title":"Build a CRUD surface with a resource (Animal)","href":"/how-to/resource-crud"},{"title":"Build a full CRUD surface without resources","href":"/how-to/manual-crud"},{"title":"Model complex objects with PropertyCollection","href":"/how-to/complex-objects"},{"title":"Authenticate, authorize, and inspect identity","href":"/how-to/auth"},{"title":"Authenticate with JWT (JWKS)","href":"/how-to/jwt-auth"},{"title":"Authenticate with a custom API key header","href":"/how-to/api-key-auth"},{"title":"Add filtering to a list endpoint","href":"/how-to/filtering"},{"title":"Add sorting to a list endpoint","href":"/how-to/sorting"},{"title":"Add pagination to a list endpoint","href":"/how-to/pagination"},{"title":"Add rate limiting","href":"/how-to/rate-limiting"},{"title":"Write a custom middleware","href":"/how-to/custom-middleware"},{"title":"Generate OpenAPI and request docblocks","href":"/how-to/generate-openapi"}]},{"group":"API Standards","pages":[{"title":"REST API Standards Overview","href":"/open-api-best-practices/01-overview"},{"title":"RESTful design and naming","href":"/open-api-best-practices/02-rest-design-and-naming"},{"title":"Versioning and resource structure","href":"/open-api-best-practices/03-versioning-and-structure"},{"title":"Pagination, filtering, and sorting","href":"/open-api-best-practices/04-pagination-filtering-sorting"},{"title":"Response format and status codes","href":"/open-api-best-practices/05-responses-errors-status-codes"},{"title":"Localization and internationalization","href":"/open-api-best-practices/06-localization-i18n"}]}]}]},"title":"Best OpenAPI/REST Practices - Apivalk","buildId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","deploymentId":"dpl_849ArpqvBiCczQiT1Y1stNGpbqHT","dynamics":[],"chunks":[]}