{"_id":"@openapi-spec/router","_rev":"6-805eb9d45252075763689921b1ce0e09","name":"@openapi-spec/router","dist-tags":{"latest":"0.7.1"},"versions":{"0.0.0-stage":{"name":"@openapi-spec/router","version":"0.0.0-stage","_id":"@openapi-spec/router@0.0.0-stage","stub":true,"maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"dist":{"shasum":"507a7314a9dcaba27846bdd59f88e9060c289a69","tarball":"https://registry.npmjs.org/@openapi-spec/router/-/router-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-B6gT4oqIM/t8SRXKgis3KK5H6NQ8lsO0Kdh+L3Chy9HreBGG+MEZJI2Jm/XnAVeaePtoOIaIjk9FQdWjw+JJrg==","signatures":[{"sig":"MEQCIDHUK3kZXD8yoZFivAyadPwOKXN2DMmCI+idd8+nTdToAiAwplRLEFmCplalwMl+r8lNV0hB10tG0f7drH56LyAgcQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":342},"_npmUser":{"name":"dinwwwh","email":"dinwwwh@gmail.com"},"description":"Temporary package placeholder for staged publishing","directories":{}},"0.4.0":{"name":"@openapi-spec/router","version":"0.4.0","keywords":["oas","openapi","openapi-spec","path-template","router","routing","typescript"],"license":"MIT","_id":"@openapi-spec/router@0.4.0","maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"homepage":"https://github.com/middleapi/openapi-spec","dist":{"shasum":"b9176ddbabd44ee8e804cea18a64aaced4ccaa2d","tarball":"https://registry.npmjs.org/@openapi-spec/router/-/router-0.4.0.tgz","fileCount":5,"integrity":"sha512-nXz4TuPR+sgR+79tQhiPbyrRsHuhtmRhtzNjOPcjDxQf91zGGVYFzBtlgNA2nALR1bppaSQONts4qOFmma88WQ==","signatures":[{"sig":"MEYCIQC2R4woJ6Pbl1ZE3rEWo+7S8AjYF8KU/qRHJ3HqaoeHeQIhAMwQAAtu/sAq6vd5AATwOqRD+dx4Y47Tv+Xa0X/cda9m","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCYs3BtbH1p/kS/P3QM3Y9ZMsQisZvmPMi7DiJAr2yhAQIhAPIGPyiYp0qEslLZsEsYEReIpfeAm0IJV4qOkx/ba/+C","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33891},"type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./package.json":"./package.json"},"funding":["https://github.com/sponsors/dinwwwh","https://opencollective.com/middleapi"],"scripts":{},"unbuild":{"declaration":"node16"},"_npmUser":{"name":"dinwwwh","email":"dinwwwh@gmail.com"},"repository":{"url":"git+https://github.com/middleapi/openapi-spec.git","type":"git","directory":"packages/router"},"description":"Fast HTTP router for OpenAPI path templates, with {name} and {+name} params, built for oRPC","directories":{},"sideEffects":false,"_hasShrinkwrap":false,"devDependencies":{"rou3":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/router_0.4.0_1793172595053_0.3691686971609238","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@openapi-spec/router","version":"0.5.0","keywords":["oas","openapi","openapi-spec","path-template","router","routing","typescript"],"license":"MIT","_id":"@openapi-spec/router@0.5.0","maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"homepage":"https://github.com/middleapi/openapi-spec","dist":{"shasum":"7492f328b889fc1a5b0542ebdb02a34e026a11c5","tarball":"https://registry.npmjs.org/@openapi-spec/router/-/router-0.5.0.tgz","fileCount":5,"integrity":"sha512-tUaYXgsCdUD2E5zbjN/wGmy/JEg4BJsAHomBHVwUt7loGx9wQAyQGJQhUjO5bLb4ULGa8Bsg0/YR+s8TWXRoTA==","signatures":[{"sig":"MEUCIDE0THoiM7+FtDxULKHVJgs2heOxOzlGw/gH6QpqMTB1AiEAxS3QyXxipreYuDLTTFpR7Z12azEpyx/t/mzJjEh8n/o=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDaE/NtuDhwja7l8gFp2wS5C+YY4vUu+sDwzUL5dkeh8QIhAOMaWj+eG2RqASz4tB/RALpRxzFl+Y1t15/AosRjClDZ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openapi-spec%2frouter@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37087},"type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./package.json":"./package.json"},"funding":["https://github.com/sponsors/dinwwwh","https://opencollective.com/middleapi"],"scripts":{},"unbuild":{"declaration":"node16"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"4edf9aa3-0f2f-4904-8a43-86d96f274fc5"}},"repository":{"url":"git+https://github.com/middleapi/openapi-spec.git","type":"git","directory":"packages/router"},"description":"Fast HTTP router for OpenAPI path templates, with {name} and {+name} params, built for oRPC","directories":{},"sideEffects":false,"_hasShrinkwrap":false,"devDependencies":{"rou3":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/router_0.5.0_1793501537594_0.3314624555872626","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@openapi-spec/router","version":"0.6.0","keywords":["oas","openapi","openapi-spec","path-template","router","routing","typescript"],"license":"MIT","_id":"@openapi-spec/router@0.6.0","maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"homepage":"https://github.com/middleapi/openapi-spec","dist":{"shasum":"3b580fc458ac8cbc7663ffd80a53ed0a2700e231","tarball":"https://registry.npmjs.org/@openapi-spec/router/-/router-0.6.0.tgz","fileCount":5,"integrity":"sha512-CioJ7X0ROAc7uLCKPNMDdtZZaOPwG6faK1yJNVFP6CBoc63KzNZYjwFcRqfX7sO/mmtfSDvBgyUt4Z3c2dXPuQ==","signatures":[{"sig":"MEUCIFQvC3piMaMW0WkSvVLXG7/BccRHdI8/WAu066Dy4vc/AiEAlzanD8Fp4mhpHwTeTmROYYkC2Mp1vCezYsLdZvfslaA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIDXpQE5GNP+D/aS3khadAKIfLFYT+C0CkQyt4lmcWbDOAiBTLQILTNbXyl5KEQ1R8V+p+DmvTc9pEiySVuFowEYdgQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openapi-spec%2frouter@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":37087},"type":"module","exports":{".":{"types":"./dist/index.d.mts","import":"./dist/index.mjs","default":"./dist/index.mjs"},"./package.json":"./package.json"},"funding":["https://github.com/sponsors/dinwwwh","https://opencollective.com/middleapi"],"scripts":{},"unbuild":{"declaration":"node16"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"4edf9aa3-0f2f-4904-8a43-86d96f274fc5"}},"repository":{"url":"git+https://github.com/middleapi/openapi-spec.git","type":"git","directory":"packages/router"},"description":"Fast HTTP router for OpenAPI path templates, with {name} and {+name} params, built for oRPC","directories":{},"sideEffects":false,"_hasShrinkwrap":false,"devDependencies":{"rou3":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/router_0.6.0_1793529377901_0.47720248336619264","host":"s3://npm-registry-packages-npm-production"}},"0.7.0":{"name":"@openapi-spec/router","version":"0.7.0","keywords":["oas","openapi","openapi-spec","path-template","router","routing","typescript"],"license":"MIT","_id":"@openapi-spec/router@0.7.0","maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"homepage":"https://github.com/middleapi/openapi-spec","dist":{"shasum":"ce1794349ddf69122c5ed2e11f8af1ccf4e0f853","tarball":"https://registry.npmjs.org/@openapi-spec/router/-/router-0.7.0.tgz","fileCount":5,"integrity":"sha512-G3ZYcSJB1jJFkJ+A76KrGeK9lLYZwmmHSahbEZ8KBrGBdUqG+vqq+FSj6f4Qo25a+J71S9Sufc2ldNB75AjvRQ==","signatures":[{"sig":"MEYCIQD9dp3/1W9L5+Jg64DoFOmGv/i+oCqUl9xUIOQS/BpE9wIhAO9O4tfYnvzvXdu/P+69iyQsjos7EuSmUuTrDrBs8062","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCS+e8a0JKmnAi9I9+mjd2J0/5Nv2yFuNiXihQFAmJf5gIhAL4MqRDtvBF3t0ROIug2UWkTZJIMGg3N78Z/6vO2w6yv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openapi-spec%2frouter@0.7.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45250},"type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"funding":["https://github.com/sponsors/dinwwwh","https://opencollective.com/middleapi"],"scripts":{},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"4edf9aa3-0f2f-4904-8a43-86d96f274fc5"}},"repository":{"url":"git+https://github.com/middleapi/openapi-spec.git","type":"git","directory":"packages/router"},"description":"Fast HTTP router for OpenAPI path templates, with {name} and {+name} params, built for oRPC","directories":{},"sideEffects":false,"_hasShrinkwrap":false,"devDependencies":{"rou3":"^1.0.0"},"_npmOperationalInternal":{"tmp":"tmp/router_0.7.0_1793953084439_0.7131320132373068","host":"s3://npm-registry-packages-npm-production"}},"0.7.1":{"_id":"@openapi-spec/router@0.7.1","dist":{"shasum":"e10bedbaa8f01d86eccdc6ab2269f4bb67cd2bfb","tarball":"https://registry.npmjs.org/@openapi-spec/router/-/router-0.7.1.tgz","fileCount":5,"integrity":"sha512-yG6JfQM2BqJrj2DCce3L64JvJKah9ssgKoweTxx3IdsP0F0Xm4lDgBzV2NP3pF1kamDbFxXkP7N2T7fJn5WLSA==","signatures":[{"sig":"MEUCICbrg4jIwVIo9lPfMOol9YFIaTKue3A8P4G4w+p2yddLAiEAlTf3ZtiSMFgbQeyZPz1oSZ7jIJOQZuhLFFMR6Xn3gGE=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDcx5j02lWgOpidw/K+zM5paXNZQn7SkYkIUU3XYHh9XAIgSZfRgMwcDeCvIwWTf1yOpg02QHKsusbEOXpv7qaWMco="}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@openapi-spec%2frouter@0.7.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":45250},"name":"@openapi-spec/router","type":"module","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js"},"./package.json":"./package.json"},"funding":["https://github.com/sponsors/dinwwwh","https://opencollective.com/middleapi"],"license":"MIT","scripts":{},"version":"0.7.1","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"4edf9aa3-0f2f-4904-8a43-86d96f274fc5"}},"homepage":"https://github.com/middleapi/openapi-spec","keywords":["oas","openapi","openapi-spec","path-template","router","routing","typescript"],"repository":{"url":"git+https://github.com/middleapi/openapi-spec.git","type":"git","directory":"packages/router"},"description":"Fast HTTP router for OpenAPI path templates, with {name} and {+name} params, built for oRPC","directories":{},"maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"sideEffects":false,"_hasShrinkwrap":false,"devDependencies":{"rou3":"^1.0.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/router_0.7.1_1793971544555_0.6012080844297447"}}},"time":{"created":"2026-10-28T07:28:39.349Z","modified":"2026-11-06T13:25:45.218Z","0.0.0-stage":"2026-10-28T07:28:39.349Z","0.4.0":"2026-10-28T07:29:55.139Z","0.5.0":"2026-11-01T02:52:17.668Z","0.6.0":"2026-11-01T10:36:17.982Z","0.7.0":"2026-11-06T08:18:04.551Z","0.7.1":"2026-11-06T13:25:44.645Z"},"license":"MIT","homepage":"https://github.com/middleapi/openapi-spec","keywords":["oas","openapi","openapi-spec","path-template","router","routing","typescript"],"repository":{"url":"git+https://github.com/middleapi/openapi-spec.git","type":"git","directory":"packages/router"},"description":"Fast HTTP router for OpenAPI path templates, with {name} and {+name} params, built for oRPC","maintainers":[{"name":"dinwwwh","email":"dinwwwh@gmail.com"}],"readme":"<h1 align=\"center\">OpenAPI Spec</h1>\n\n<div align=\"center\">\n  <a href=\"https://codecov.io/gh/middleapi/openapi-spec\">\n    <img alt=\"codecov\" src=\"https://codecov.io/gh/middleapi/openapi-spec/branch/main/graph/badge.svg\">\n  </a>\n  <a href=\"https://www.npmjs.com/package/@openapi-spec/router\">\n    <img alt=\"monthly downloads\" src=\"https://img.shields.io/npm/dm/%40openapi-spec%2Frouter?logo=npm\" />\n  </a>\n  <a href=\"https://app.codspeed.io/middleapi/openapi-spec?utm_source=badge\">\n    <img src=\"https://img.shields.io/endpoint?url=https://codspeed.io/badge.json\" alt=\"CodSpeed\" />\n  </a>\n  <a href=\"https://github.com/middleapi/openapi-spec/blob/main/LICENSE\">\n    <img alt=\"MIT License\" src=\"https://img.shields.io/github/license/middleapi/openapi-spec?logo=open-source-initiative\" />\n  </a>\n  <a href=\"https://discord.gg/TXEbwRBvQn\">\n    <img alt=\"Discord\" src=\"https://img.shields.io/discord/1308966753044398161?color=7389D8&label&logo=discord&logoColor=ffffff\" />\n  </a>\n  <a href=\"https://deepwiki.com/middleapi/openapi-spec\">\n    <img alt=\"Ask DeepWiki\" src=\"https://img.shields.io/badge/Ask-DeepWiki-blue\" />\n  </a>\n</div>\n\n`@openapi-spec/router` matches HTTP requests against [OpenAPI](https://spec.openapis.org/) path templates such as `/planets/{id}` and `/files/{+path}`, with no route syntax of its own to translate them into. It is built for how [oRPC](https://orpc.dev) routes [OpenAPI procedures](https://orpc.dev/docs/openapi/routing): small, with no dependencies, and faster than [rou3](https://github.com/h3js/rou3) on the route sets oRPC builds.\n\n## Usage\n\n```ts\nimport { createPrefixMatcher, Router } from '@openapi-spec/router'\n\nconst router = new Router<string>()\n\nrouter.add('GET', '/planets', 'list')\nrouter.add('GET', '/planets/{id}', 'find')\nrouter.add('GET', '/files/{+path}/raw', 'raw')\n\nrouter.match('GET', '/planets/earth')\n// { data: 'find', params: { id: 'earth' } }\n\nrouter.match('GET', '/files/docs/a%20b.md/raw')\n// { data: 'raw', params: { path: 'docs/a b.md' } }\n\nrouter.match('GET', '/planets/')\n// { data: 'list', params: undefined }\n\nrouter.match('POST', '/planets')\n// undefined\n\n// Whether a request can reach a route under a prefix, such as one of a lazy router\nconst underUser = createPrefixMatcher('/users/{userId}')\n\nunderUser('/users/din/settings') // true\nunderUser('/projects/42') // false\n```\n\n`match` takes the request method and its percent-encoded path, without the query string, as `new URL(request.url).pathname` gives it. Methods match exactly, so pass them in the case the routes use.\n\n## Path templates\n\n- `{name}` as a whole segment is a param. It matches one non-empty segment. Names are made of letters, digits, `_`, and `-`.\n- `{+name}` as a whole segment is a catch-all param. It matches one or more segments, slashes included, and its value cannot be empty. A path can have one, and segments can follow it, as in `/files/{+path}/raw`. Adding a path with more than one throws a `TypeError`.\n- Any other text is literal, including braces that are not a whole segment, as in `/a/{id}.json`, and characters other routers treat as syntax, such as `:`, `*`, `?`, `(`, and `.`.\n- Literal text matches however the route or the request percent-encodes it: `/café` matches `/caf%C3%A9`, and `/v1^beta` matches `/v1%5Ebeta`. A `%2F` stays inside its segment. Text whose percent-encoding is malformed is compared as written.\n- Param values are percent-decoded. A catch-all param joins its decoded segments with `/`.\n- One trailing slash is ignored, in routes and in requests. Other empty segments are kept: `/a//b` does not match `/a/b`.\n\n## Priority\n\nWhen more than one route matches, segments compare from left to right. At each segment a literal beats a param, which beats a catch-all param, and a route that fails further on falls back to the next candidate:\n\n```ts\nrouter.add('GET', '/users/me', 'me')\nrouter.add('GET', '/users/{id}', 'user')\nrouter.add('GET', '/users/{id}/posts', 'posts')\nrouter.add('GET', '/{+path}', 'fallback')\n\nrouter.match('GET', '/users/me') // 'me'\nrouter.match('GET', '/users/m%65') // 'me'\nrouter.match('GET', '/users/me/posts') // 'posts', with { id: 'me' }\nrouter.match('GET', '/users/me/likes') // 'fallback'\n```\n\nCatch-all params that start at the same segment compare the segments after them from the last one, so `/files/{+path}/raw` beats `/files/{+path}` for `/files/a/raw`. A route with the same method and segments as one added earlier, even with other param names, is ignored.\n\n## Performance\n\nA request path without `%` that matches a route without params is found with one lookup. Other paths are split into segments once and walk a tree of literal, param, and catch-all children, so the work grows with the number of segments, not the number of routes. A tree that holds, at many segments in a row, both literals and params a request could take can fall back many times before it finds a match, as with any router that backtracks.\n\n`add` keeps each route with params as written, and the tree is built as requests reach it: a method's first request that needs the tree adds each route's segments up to its first param, and the segments from each param on wait until a request reaches that point. A process that starts cold and serves a few requests pays only for the methods it serves and the params their requests reach.\n\nPaths with params cost more than static ones, since each of their segments is sliced out and matched on its own. Radix-tree routers such as [memoirist](https://github.com/SaltyAom/memoirist) and [find-my-way](https://github.com/delvedor/find-my-way) compare the path in place and can be faster on them.\n\n[Benchmarks](https://github.com/middleapi/openapi-spec/tree/main/packages/router/benches) compare it with [rou3](https://github.com/h3js/rou3) on route sets like oRPC's. [CodSpeed](https://app.codspeed.io/middleapi/openapi-spec) runs them on every pull request to catch regressions.\n\n## Sponsors\n\nLike what we build over at [middleapi](https://github.com/middleapi)? You can help keep it going through [GitHub Sponsors](https://github.com/sponsors/dinwwwh) or [Open Collective](https://opencollective.com/middleapi). Every bit helps! 🚀\n\n<table>\n  <tr>\n   <td width=\"2000\"><a href=\"https://screenshotone.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"The screenshot API for developers\"><img src=\"https://avatars.githubusercontent.com/u/97035603?v=4\" width=\"64\" align=\"left\" hspace=\"12\" alt=\"ScreenshotOne.com\"/><b>ScreenshotOne.com</b></a><br /><sub>The screenshot API for developers</sub></td>\n  </tr>\n  <tr>\n   <td width=\"2000\"><a href=\"https://yuzu.health/careers?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"We&#39;re hiring NYC based engineers\"><img src=\"https://avatars.githubusercontent.com/u/102488956?v=4\" width=\"64\" align=\"left\" hspace=\"12\" alt=\"Yuzu\"/><b>Yuzu</b></a><br /><sub>We&#39;re hiring NYC based engineers</sub></td>\n  </tr>\n  <tr>\n   <td width=\"2000\"><a href=\"https://misskey.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Decentralized microblogging SNS born on Earth\"><img src=\"https://github.com/MisskeyIO.png\" width=\"64\" align=\"left\" hspace=\"12\" alt=\"MisskeyHQ\"/><b>MisskeyHQ</b></a><br /><sub>Decentralized microblogging SNS born on Earth</sub></td>\n  </tr>\n</table>\n\n### Organization Sponsors\n\n<table>\n  <tr>\n   <td align=\"center\"><a href=\"https://lnmarkets.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"LN Markets\"><img src=\"https://avatars.githubusercontent.com/u/70597625?v=4\" width=\"209\" alt=\"LN Markets\"/><br />LN Markets</a></td>\n  </tr>\n</table>\n\n### Sponsors\n\n<table>\n  <tr>\n   <td align=\"center\"><a href=\"https://github.com/hrmcdonald?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Reece McDonald\"><img src=\"https://avatars.githubusercontent.com/u/39349270?v=4\" width=\"167\" alt=\"Reece McDonald\"/><br />Reece McDonald</a></td>\n   <td align=\"center\"><a href=\"https://soymilk.party/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"あわわわとーにゅ\"><img src=\"https://avatars.githubusercontent.com/u/17376330?u=de3353804be889f009f7e0a1582daf04d0ab292d&amp;v=4\" width=\"167\" alt=\"あわわわとーにゅ\"/><br />あわわわとーにゅ</a></td>\n   <td align=\"center\"><a href=\"https://github.com/nicognaW?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"nk\"><img src=\"https://avatars.githubusercontent.com/u/66731869?u=4699bda3a9092d3ec34fbd959450767bcc8b8b6d&amp;v=4\" width=\"167\" alt=\"nk\"/><br />nk</a></td>\n   <td align=\"center\"><a href=\"https://supastarter.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"supastarter\"><img src=\"https://avatars.githubusercontent.com/u/110960143?v=4\" width=\"167\" alt=\"supastarter\"/><br />supastarter</a></td>\n   <td align=\"center\"><a href=\"https://github.com/herrfugbaum?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"herrfugbaum\"><img src=\"https://avatars.githubusercontent.com/u/12859776?u=644dc1666d0220bc0468eb0de3c56b919f635b16&amp;v=4\" width=\"167\" alt=\"herrfugbaum\"/><br />herrfugbaum</a></td>\n  </tr>\n  <tr>\n   <td align=\"center\"><a href=\"https://laststance.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Ryota Murakami\"><img src=\"https://avatars.githubusercontent.com/u/5501268?u=599389e03340734325726ca3f8f423c021d47d7f&amp;v=4\" width=\"167\" alt=\"Ryota Murakami\"/><br />Ryota Murakami</a></td>\n   <td align=\"center\"><a href=\"https://cra.mr/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"David Cramer\"><img src=\"https://avatars.githubusercontent.com/u/23610?v=4\" width=\"167\" alt=\"David Cramer\"/><br />David Cramer</a></td>\n   <td align=\"center\"><a href=\"https://valerii15298.github.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Valerii Petryniak\"><img src=\"https://avatars.githubusercontent.com/u/44531564?u=88ac74d9bacd20401518441907acad21063cd397&amp;v=4\" width=\"167\" alt=\"Valerii Petryniak\"/><br />Valerii Petryniak</a></td>\n   <td align=\"center\"><a href=\"https://letstri.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Valerii Strilets\"><img src=\"https://avatars.githubusercontent.com/u/13253748?u=c7b10399ccc8f8081e24db94ec32cd9858e86ac3&amp;v=4\" width=\"167\" alt=\"Valerii Strilets\"/><br />Valerii Strilets</a></td>\n   <td align=\"center\"><a href=\"https://blacklight.sh/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Kyle Mistele\"><img src=\"https://avatars.githubusercontent.com/u/18430555?u=3afebeb81de666e35aaac3ed46f14159d7603ffb&amp;v=4\" width=\"167\" alt=\"Kyle Mistele\"/><br />Kyle Mistele</a></td>\n  </tr>\n  <tr>\n   <td align=\"center\"><a href=\"https://github.com/christ12938?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"christ12938\"><img src=\"https://avatars.githubusercontent.com/u/25758598?v=4\" width=\"167\" alt=\"christ12938\"/><br />christ12938</a></td>\n   <td align=\"center\"><a href=\"https://github.com/Ryanjso?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Ryan Soderberg\"><img src=\"https://avatars.githubusercontent.com/u/39172778?u=5ed913c31d57e7221b75784abcad48c7ebddde27&amp;v=4\" width=\"167\" alt=\"Ryan Soderberg\"/><br />Ryan Soderberg</a></td>\n   <td align=\"center\"><a href=\"https://github.com/itigoore01?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"shota\"><img src=\"https://avatars.githubusercontent.com/u/11831107?u=c976a6dc7e055eb026304c46c99100ed22b0c8e0&amp;v=4\" width=\"167\" alt=\"shota\"/><br />shota</a></td>\n   <td align=\"center\"><a href=\"https://github.com/Nic13Gamer?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Nicholas\"><img src=\"https://avatars.githubusercontent.com/u/54724556?u=56a7ab430ce7a80d648ab6eba051d454a818ed0b&amp;v=4\" width=\"167\" alt=\"Nicholas\"/><br />Nicholas</a></td>\n   <td align=\"center\"><a href=\"https://github.com/ellis-driscoll?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Ellis Driscoll\"><img src=\"https://avatars.githubusercontent.com/u/70685966?u=c5f95bc33b5991d9744abe00052542e4a2ed3cb9&amp;v=4\" width=\"167\" alt=\"Ellis Driscoll\"/><br />Ellis Driscoll</a></td>\n  </tr>\n  <tr>\n   <td align=\"center\"><a href=\"https://github.com/hoangbn?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Hoang Nguyen\"><img src=\"https://avatars.githubusercontent.com/u/38968280?u=c90084c6de65c56facabab7ba13a72a49ddbc3e4&amp;v=4\" width=\"167\" alt=\"Hoang Nguyen\"/><br />Hoang Nguyen</a></td>\n   <td align=\"center\"><a href=\"https://opencollective.com/guest-ac41de3b?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Orestis Ioannou\"><img src=\"https://images.opencollective.com/guest-ac41de3b/avatar/460.png\" width=\"167\" alt=\"Orestis Ioannou\"/><br />Orestis Ioannou</a></td>\n   <td align=\"center\"><a href=\"https://automatio.ai/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Stefan Smiljkovic\"><img src=\"https://avatars.githubusercontent.com/u/1984909?u=b7bf5bc40ed49df3c22f69d2da7b8d78709c49ed&amp;v=4\" width=\"167\" alt=\"Stefan Smiljkovic\"/><br />Stefan Smiljkovic</a></td>\n  </tr>\n</table>\n\n### Backers\n\n<table>\n  <tr>\n   <td align=\"center\"><a href=\"https://github.com/rhinodavid?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"David Walsh\"><img src=\"https://avatars.githubusercontent.com/u/5778036?u=b5521f07d2f88c3db2a0dae62b5f2f8357214af0&amp;v=4\" width=\"139\" alt=\"David Walsh\"/><br />David Walsh</a></td>\n   <td align=\"center\"><a href=\"https://github.com/IPv4Addr?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"IPv4Addr\"><img src=\"https://avatars.githubusercontent.com/u/100147665?u=59996b72f69bb53063cb7e9ff8b8f898616cd94d&amp;v=4\" width=\"139\" alt=\"IPv4Addr\"/><br />IPv4Addr</a></td>\n   <td align=\"center\"><a href=\"https://robbevaes.be/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Robbe Vaes\"><img src=\"https://avatars.githubusercontent.com/u/44748019?u=e0232402c045ad4eac7cbd217f1f47e083103b89&amp;v=4\" width=\"139\" alt=\"Robbe Vaes\"/><br />Robbe Vaes</a></td>\n   <td align=\"center\"><a href=\"https://github.com/aidansunbury?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Aidan Sunbury\"><img src=\"https://avatars.githubusercontent.com/u/64103161?v=4\" width=\"139\" alt=\"Aidan Sunbury\"/><br />Aidan Sunbury</a></td>\n   <td align=\"center\"><a href=\"https://github.com/soonoo?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"soonoo\"><img src=\"https://avatars.githubusercontent.com/u/5436405?u=5d0b4aa955c87e30e6bda7f0cccae5402da99528&amp;v=4\" width=\"139\" alt=\"soonoo\"/><br />soonoo</a></td>\n   <td align=\"center\"><a href=\"https://kevinporten.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Kevin Porten\"><img src=\"https://avatars.githubusercontent.com/u/1839345?u=dc2263d5cfe0d927ce1a0be04a1d55dd6b55405c&amp;v=4\" width=\"139\" alt=\"Kevin Porten\"/><br />Kevin Porten</a></td>\n  </tr>\n  <tr>\n   <td align=\"center\"><a href=\"https://github.com/pumpkinlink?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Denis\"><img src=\"https://avatars.githubusercontent.com/u/11864620?u=5f47bbe6c65d0f6f5cf011021490238e4b0593d0&amp;v=4\" width=\"139\" alt=\"Denis\"/><br />Denis</a></td>\n   <td align=\"center\"><a href=\"https://github.com/christopher-kapic?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Christopher Kapic\"><img src=\"https://avatars.githubusercontent.com/u/59740769?u=e7ad4b72b5bf6c9eb1644c26dbf3332a8f987377&amp;v=4\" width=\"139\" alt=\"Christopher Kapic\"/><br />Christopher Kapic</a></td>\n   <td align=\"center\"><a href=\"http://ballingt.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Tom Ballinger\"><img src=\"https://avatars.githubusercontent.com/u/458879?u=4b045ac75d721b6ac2b42a74d7d37f61f0414031&amp;v=4\" width=\"139\" alt=\"Tom Ballinger\"/><br />Tom Ballinger</a></td>\n   <td align=\"center\"><a href=\"https://lee-sam.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Sam\"><img src=\"https://avatars.githubusercontent.com/u/102863520?u=3c89611f549d5070be232eb4532f690c8f2e7a65&amp;v=4\" width=\"139\" alt=\"Sam\"/><br />Sam</a></td>\n   <td align=\"center\"><a href=\"https://github.com/Titoine?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Titoine\"><img src=\"https://avatars.githubusercontent.com/u/3514286?u=1bb1e86b0c99c8a1121372e56d51a177eea12191&amp;v=4\" width=\"139\" alt=\"Titoine\"/><br />Titoine</a></td>\n   <td align=\"center\"><a href=\"https://rigtch.fm/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Igor Makowski\"><img src=\"https://avatars.githubusercontent.com/u/56691628?u=ee8c879478f7c151b9156aef6c74243fa3e247a8&amp;v=4\" width=\"139\" alt=\"Igor Makowski\"/><br />Igor Makowski</a></td>\n  </tr>\n  <tr>\n   <td align=\"center\"><a href=\"https://blog.cwang.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"hanayashiki\"><img src=\"https://avatars.githubusercontent.com/u/26056783?u=06c3b9205a16fd41a871e82da1cc2a09306d53f5&amp;v=4\" width=\"139\" alt=\"hanayashiki\"/><br />hanayashiki</a></td>\n   <td align=\"center\"><a href=\"https://dubinets.io/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Lev Dubinets\"><img src=\"https://avatars.githubusercontent.com/u/3114081?u=f547f5d5012cab54851f1b1ad72d10e537f78fc2&amp;v=4\" width=\"139\" alt=\"Lev Dubinets\"/><br />Lev Dubinets</a></td>\n   <td align=\"center\"><a href=\"https://kellychan.im/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Kelly Peilin Chan\"><img src=\"https://avatars.githubusercontent.com/u/520852?u=6b0f7105f694e7b5cacf410a3f04c7044b469dc8&amp;v=4\" width=\"139\" alt=\"Kelly Peilin Chan\"/><br />Kelly Peilin Chan</a></td>\n   <td align=\"center\"><a href=\"https://guyariely.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Guy Ariely\"><img src=\"https://avatars.githubusercontent.com/u/42813496?u=edb6b7f563bf28e160a290832e7da57c0506f8ca&amp;v=4\" width=\"139\" alt=\"Guy Ariely\"/><br />Guy Ariely</a></td>\n   <td align=\"center\"><a href=\"https://paulsenon.com/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"PaulSenon\"><img src=\"https://avatars.githubusercontent.com/u/19531087?u=6385741eb91d200b8c513ec6045482e301767ca6&amp;v=4\" width=\"139\" alt=\"PaulSenon\"/><br />PaulSenon</a></td>\n   <td align=\"center\"><a href=\"https://piscis.dev/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Alex\"><img src=\"https://avatars.githubusercontent.com/u/326163?u=b245f368bd940cf51d08c0b6bf55f8257f359437&amp;v=4\" width=\"139\" alt=\"Alex\"/><br />Alex</a></td>\n  </tr>\n  <tr>\n   <td align=\"center\"><a href=\"https://opensource.gubanov.eu/?ref=middleapi&amp;utm_source=middleapi&amp;utm_medium=sponsor\" target=\"_blank\" rel=\"noopener sponsored\" title=\"Andrey Gubanov\"><img src=\"https://avatars.githubusercontent.com/u/1082083?u=c5f2daf7ebece498e85c83367bb37b4e10e2649d&amp;v=4\" width=\"139\" alt=\"Andrey Gubanov\"/><br />Andrey Gubanov</a></td>\n  </tr>\n</table>\n\nWith thanks to [40 past sponsors](https://htmlpreview.github.io/?https://github.com/middleapi/static/blob/main/sponsors.svg) who helped get openapi-spec here.\n\n## Open Source Programs\n\n[middleapi](https://github.com/middleapi) is supported by these open source programs:\n\n<table>\n  <tr>\n   <td align=\"center\"><a href=\"https://claude.com/contact-sales/claude-for-oss\" target=\"_blank\" rel=\"noopener\" title=\"Claude for Open Source\"><img src=\"https://cdn.simpleicons.org/claude\" width=\"64\" alt=\"Claude\"/><br />Claude</a></td>\n   <td align=\"center\"><a href=\"https://pullfrog.com/for-oss\" target=\"_blank\" rel=\"noopener\" title=\"Pullfrog for OSS\"><img src=\"https://avatars.githubusercontent.com/in/1768019?s=128&amp;v=4\" width=\"64\" alt=\"Pullfrog\"/><br />Pullfrog</a></td>\n  </tr>\n</table>\n\n## License\n\nDistributed under the MIT License. See [LICENSE](https://github.com/middleapi/openapi-spec/blob/main/LICENSE) for more information.\n","readmeFilename":""}