{"id":13836112,"url":"https://github.com/fastify/fastify-http-proxy","last_synced_at":"2026-04-01T19:39:01.019Z","repository":{"id":29283549,"uuid":"115331824","full_name":"fastify/fastify-http-proxy","owner":"fastify","description":"Proxy your http requests to another server, with hooks","archived":false,"fork":false,"pushed_at":"2026-03-20T08:38:05.000Z","size":386,"stargazers_count":388,"open_issues_count":11,"forks_count":107,"subscribers_count":19,"default_branch":"main","last_synced_at":"2026-03-21T01:24:52.702Z","etag":null,"topics":["api-gateway","fastify","fastify-plugin","http-proxy","proxy"],"latest_commit_sha":null,"homepage":"https://npmjs.com/package/@fastify/http-proxy","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fastify.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null},"funding":{"github":"fastify","open_collective":"fastify"}},"created_at":"2017-12-25T11:10:54.000Z","updated_at":"2026-03-20T08:34:19.000Z","dependencies_parsed_at":"2023-01-14T14:35:27.375Z","dependency_job_id":"95db0a2e-e022-4a1e-b709-957f1a261338","html_url":"https://github.com/fastify/fastify-http-proxy","commit_stats":{"total_commits":295,"total_committers":66,"mean_commits":4.46969696969697,"dds":0.7084745762711864,"last_synced_commit":"328eb59e93e88b3cdad5ae6d41112568fb866480"},"previous_names":["mcollina/fastify-http-proxy"],"tags_count":70,"template":false,"template_full_name":null,"purl":"pkg:github/fastify/fastify-http-proxy","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fastify%2Ffastify-http-proxy","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fastify%2Ffastify-http-proxy/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fastify%2Ffastify-http-proxy/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fastify%2Ffastify-http-proxy/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fastify","download_url":"https://codeload.github.com/fastify/fastify-http-proxy/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fastify%2Ffastify-http-proxy/sbom","scorecard":{"id":393366,"data":{"date":"2025-08-11","repo":{"name":"github.com/fastify/fastify-http-proxy","commit":"bd35915c1319e776aa8780eded7bbc4f8ca52bff"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":7.1,"checks":[{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Maintained","score":7,"reason":"7 commit(s) and 2 issue activity found in the last 90 days -- score normalized to 7","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Code-Review","score":4,"reason":"Found 10/24 approved changesets -- score normalized to 4","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":10,"reason":"GitHub workflow tokens follow principle of least privilege","details":["Warn: jobLevel 'contents' permission set to 'write': .github/workflows/ci.yml:23","Info: topLevel 'contents' permission set to 'read': .github/workflows/ci.yml:18"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/fastify/fastify-http-proxy/ci.yml/main?enable=pin","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Vulnerabilities","score":10,"reason":"0 existing vulnerabilities detected","details":null,"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}},{"name":"License","score":9,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Warn: project license file does not contain an FSF or OSI license."],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Security-Policy","score":10,"reason":"security policy file detected","details":["Info: security policy file detected: github.com/fastify/.github/SECURITY.md:1","Info: Found linked content: github.com/fastify/.github/SECURITY.md:1","Info: Found disclosure, vulnerability, and/or timelines in security policy: github.com/fastify/.github/SECURITY.md:1","Info: Found text in security policy: github.com/fastify/.github/SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"SAST","score":-1,"reason":"internal error: internal error: Client.Checks.ListCheckRunsForRef: error during graphqlHandler.setupCheckRuns: non-200 OK status code: 502 Bad Gateway body: \"\u003chtml\u003e\\r\\n\u003chead\u003e\u003ctitle\u003e502 Bad Gateway\u003c/title\u003e\u003c/head\u003e\\r\\n\u003cbody\u003e\\r\\n\u003ccenter\u003e\u003ch1\u003e502 Bad Gateway\u003c/h1\u003e\u003c/center\u003e\\r\\n\u003chr\u003e\u003ccenter\u003enginx\u003c/center\u003e\\r\\n\u003c/body\u003e\\r\\n\u003c/html\u003e\\r\\n\"","details":null,"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}}]},"last_synced_at":"2025-08-18T18:22:51.512Z","repository_id":29283549,"created_at":"2025-08-18T18:22:51.512Z","updated_at":"2025-08-18T18:22:51.512Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31291164,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-01T13:12:26.723Z","status":"ssl_error","status_checked_at":"2026-04-01T13:12:25.102Z","response_time":53,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["api-gateway","fastify","fastify-plugin","http-proxy","proxy"],"created_at":"2024-08-04T15:00:35.798Z","updated_at":"2026-04-01T19:39:01.011Z","avatar_url":"https://github.com/fastify.png","language":"JavaScript","readme":"# @fastify/http-proxy\n\n[![CI](https://github.com/fastify/fastify-http-proxy/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/fastify/fastify-http-proxy/actions/workflows/ci.yml)\n[![NPM version](https://img.shields.io/npm/v/@fastify/http-proxy.svg?style=flat)](https://www.npmjs.com/package/@fastify/http-proxy)\n[![neostandard javascript style](https://img.shields.io/badge/code_style-neostandard-brightgreen?style=flat)](https://github.com/neostandard/neostandard)\n\nProxy your HTTP requests to another server, with hooks.\nThis [`fastify`](https://fastify.dev) plugin forwards all requests\nreceived with a given prefix (or none) to an upstream. All Fastify hooks are still applied.\n\n`@fastify/http-proxy` is built on top of\n[`@fastify/reply-from`](https://npm.im/@fastify/reply-from), which enables single route proxying.\n\nThis plugin can be used in a variety of circumstances, for example, if you have to proxy an internal domain to an external domain (useful to avoid CORS problems) or to implement your own API gateway for a microservices architecture.\n\n## Requirements\n\nFastify 5.x.\nSee [@fastify/http-proxy v9.x](https://github.com/fastify/fastify-http-proxy/tree/v9.x) for Fastify 4.x compatibility.\n\n## Install\n\n```\nnpm i @fastify/http-proxy fastify\n```\n\n## Example\n\n```js\nconst Fastify = require('fastify');\nconst server = Fastify();\n\nserver.register(require('@fastify/http-proxy'), {\n  upstream: 'http://my-api.example.com',\n  prefix: '/api', // optional\n  http2: false, // optional\n});\n\nserver.listen({ port: 3000 });\n```\n\nThis will proxy any request starting with `/api` to `http://my-api.example.com`. For instance, `http://localhost:3000/api/users` will be proxied to `http://my-api.example.com/users`.\n\nIf you want to have different proxies on different prefixes you can register multiple instances of the plugin as shown in the following snippet:\n\n```js\nconst Fastify = require('fastify');\nconst server = Fastify();\nconst proxy = require('@fastify/http-proxy');\n\n// /api/x will be proxied to http://my-api.example.com/x\nserver.register(proxy, {\n  upstream: 'http://my-api.example.com',\n  prefix: '/api', // optional\n  http2: false, // optional\n});\n\n// /rest-api/123/endpoint will be proxied to http://my-rest-api.example.com/123/endpoint\nserver.register(proxy, {\n  upstream: 'http://my-rest-api.example.com',\n  prefix: '/rest-api/:id/endpoint', // optional\n  rewritePrefix: '/:id/endpoint', // optional\n  http2: false, // optional\n});\n\n// /auth/user will be proxied to http://single-signon.example.com/signon/user\nserver.register(proxy, {\n  upstream: 'http://single-signon.example.com',\n  prefix: '/auth', // optional\n  rewritePrefix: '/signon', // optional\n  http2: false, // optional\n});\n\n// /user will be proxied to http://single-signon.example.com/signon/user\nserver.register(proxy, {\n  upstream: 'http://single-signon.example.com',\n  rewritePrefix: '/signon', // optional\n  http2: false, // optional\n});\n\nserver.listen({ port: 3000 });\n```\n\nNotice that in this case, it is important to use the `prefix` option to tell the proxy how to properly route the requests across different upstreams.\n\nAlso, notice paths in `upstream` are ignored, so you need to use `rewritePrefix` to specify the target base path.\n\nFor other examples, see [`example.js`](examples/example.js).\n\n## Request tracking\n\n`@fastify/http-proxy` can track and pipe the `request-id` across the upstreams. Using the [`hyperid`](https://www.npmjs.com/package/hyperid) module and the [`@fastify/reply-from`](https://github.com/fastify/fastify-reply-from) built-in options a fairly simple example would look like this:\n\n```js\nconst Fastify = require('fastify');\nconst proxy = require('@fastify/http-proxy');\nconst hyperid = require('hyperid');\n\nconst server = Fastify();\nconst uuid = hyperid();\n\nserver.register(proxy, {\n  upstream: 'http://localhost:4001',\n  replyOptions: {\n    rewriteRequestHeaders: (originalReq, headers) =\u003e ({\n      ...headers,\n      'request-id': uuid(),\n    }),\n  },\n});\n\nserver.listen({ port: 3000 });\n```\n\n## Options\n\nThis `fastify` plugin supports _all_ the options of\n[`@fastify/reply-from`](https://github.com/fastify/fastify-reply-from) plus the following.\n\n_Note that this plugin is fully encapsulated, and non-JSON payloads will\nbe streamed directly to the destination._\n\n### `upstream`\n\nAn URL (including protocol) that represents the target server to use for proxying.\n\n### `prefix`\n\nThe prefix to mount this plugin on. All the requests to the current server starting with the given prefix will be proxied to the provided upstream.\n\nParametric path is supported. To register a parametric path, use the colon before the parameter name.\n\nThe prefix will be removed from the URL when forwarding the HTTP\nrequest.\n\n### `rewritePrefix`\n\nRewrite the prefix to the specified string. Default: `''`.\n\n### `preHandler`\n\nA `preHandler` to be applied on all routes. Useful for performing actions before the proxy is executed (e.g. check for authentication).\n\n### `proxyPayloads`\n\nWhen this option is `false`, you will be able to access the body but it will also disable direct pass through of the payload. As a result, it is left up to the implementation to properly parse and proxy the payload correctly.\n\nFor example, if you are expecting a payload of type `application/xml`, then you would have to add a parser for it like so:\n\n```javascript\nfastify.addContentTypeParser('application/xml', (req, done) =\u003e {\n  const parsedBody = parsingCode(req);\n  done(null, parsedBody);\n});\n```\n\n### `preValidation`\n\nSpecify preValidation function to perform the validation of the request before the proxy is executed (e.g. check request payload).\n\n```javascript\nfastify.register(proxy, {\n  upstream: `http://your-target-upstream.com`,\n  preValidation: async (request, reply) =\u003e {\n    if (request.body.method === 'invalid_method') {\n      return reply.code(400).send({ message: 'payload contains invalid method' });\n    }\n  },\n});\n```\n\n### `config`\n\nAn object accessible within the `preHandler` via `reply.context.config`.\nSee [Config](https://fastify.dev/docs/latest/Reference/Routes/#config) in the Fastify\ndocumentation for information on this option. Note: this is merged with other\nconfiguration passed to the route.\n\n### `replyOptions`\n\nObject with [reply options](https://github.com/fastify/fastify-reply-from#replyfromsource-opts) for `@fastify/reply-from`.\n\n### `internalRewriteLocationHeader`\n\nBy default, `@fastify/http-proxy` will rewrite the `location` header when a request redirects to a relative path.\nIn other words, the [prefix](https://github.com/fastify/fastify-http-proxy#prefix) will be added to the relative path.\n\nIf you want to preserve the original path, this option will disable this internal operation. Default: `true`.\n\nNote that the [rewriteHeaders](https://github.com/fastify/fastify-reply-from#rewriteheadersheaders-request) option of [`@fastify/reply-from`](http://npm.im/fastify-reply-from) will retrieve headers modified (reminder: only `location` is updated among all headers) in parameter but with this option, the headers are unchanged.\n\n### `httpMethods`\n\nAn array that contains the types of the methods. Default: `['DELETE', 'GET', 'HEAD', 'PATCH', 'POST', 'PUT', 'OPTIONS']`.\n\n### `routes`\n\nAn array that contains the routes to handle. Default: `['/', '/*']`.\n\n### `preRewrite`\n\nA function that will be executed before rewriting the URL. It receives the URL, the request parameters and the prefix and must return the new URL.\n\nThe function cannot return a promise.\n\n```javascript\n// `/api/abc` will be proxied to `http://api-upstream.com/api2/xyz`\nfastify.register(proxy, {\n  upstream: `http://api-upstream.com`,\n  prefix: '/api',\n  rewritePrefix: '/api2/',\n  preRewrite (url, params, prefix) {\n    return url.replace('abc', 'xyz');\n  }\n})\n```\n\n### `websocket`\n\nThis module has _partial_ support for forwarding websockets by passing a\n`websocket` boolean option.\n\nA few things are missing:\n\n1. request id logging\n2. support `ignoreTrailingSlash`\n3. forwarding more than one subprotocols. Note: Only the first subprotocol is being forwarded\n\nPull requests are welcome to finish this feature.\n\n### `wsUpstream`\n\nWorking only if property `websocket` is `true`.\n\nAn URL (including protocol) that represents the target websockets to use for proxying websockets.\nAccepted both `https://` and `wss://`.\n\nNote that if property `wsUpstream` not specified then proxy will try to connect with the `upstream` property.\n\n### `wsServerOptions`\n\nThe options passed to [`new ws.Server()`](https://github.com/websockets/ws/blob/HEAD/doc/ws.md#class-websocketserver).\n\n### `wsClientOptions`\n\nThe options passed to the [`WebSocket` constructor](https://github.com/websockets/ws/blob/HEAD/doc/ws.md#class-websocket) for outgoing websockets.\n\nIt also supports an additional `rewriteRequestHeaders(headers, request)` function that can be used to write the headers before\nopening the WebSocket connection. This function should return an object with the given headers.\nThe default implementation forwards the `cookie` header.\n\n### `wsReconnect`\n\n**Experimental.** (default: `disabled`)\n\nReconnection feature detects and closes broken connections and reconnects automatically, see [how to detect and close broken connections](https://github.com/websockets/ws#how-to-detect-and-close-broken-connections).\nThe connection is considered broken if the target does not respond to the ping messages or no data is received from the target.\n\nThe `wsReconnect` option contains the configuration for the WebSocket reconnection feature.\nTo enable the feature, set the `wsReconnect` option to an object with the following properties:\n\n- `pingInterval`: The interval between ping messages in ms (default: `30_000`).\n- `maxReconnectionRetries`: The maximum number of reconnection retries (`1` to `Infinity`, default: `Infinity`).\n- `reconnectInterval`: The interval between reconnection attempts in ms (default: `1_000`).\n- `reconnectDecay`: The decay factor for the reconnection interval (default: `1.5`).\n- `connectionTimeout`: The timeout for establishing the connection in ms (default: `5_000`).\n- `reconnectOnClose`: Whether to reconnect on close, as long as the connection from the related client to the proxy is active (default: `false`).\n- `logs`: Whether to log the reconnection process (default: `false`).\n\nSee the example in [examples/reconnection](examples/reconnection).\n\n### `wsHooks`\n\nOn websocket events, the following hooks are available, note **the hooks are all synchronous**.\nThe `context` object is passed to all hooks and contains the `log` property.\n\n- `onIncomingMessage`: A hook function that is called when the request is received from the client `onIncomingMessage(context, source, target, { data, binary })` (default: `undefined`).\n- `onOutgoingMessage`: A hook function that is called when the response is received from the target `onOutgoingMessage(context, source, target, { data, binary })` (default: `undefined`).\n- `onConnect`: A hook function that is called when the connection is established `onConnect(context, source, target)` (default: `undefined`).\n- `onDisconnect`: A hook function that is called when the connection is closed `onDisconnect(context, source)` (default: `undefined`).\n- `onReconnect`: A hook function that is called when the connection is reconnected `onReconnect(context, source, target)` (default: `undefined`). The function is called if reconnection feature is enabled.\n- `onPong`: A hook function that is called when the target responds to the ping `onPong(context, source, target)` (default: `undefined`). The function is called if reconnection feature is enabled.\n\n## Decorators\n\n### `reply.fromParameters(url[, params[, prefix]])`\n\nIt can be used to get the final URL and options that `@fastify/http-proxy` would have used to invoke `reply.from`.\n\nA typical use is to override the request URL:\n\n```javascript\npreHandler (request, reply, done) {\n  if (request.url !== '/original') {\n    done()\n    return\n  }\n\n  const { url, options } = reply.fromParameters('/updated', { ...request.params, serverId: 42 })\n  reply.from(url, options)\n}\n```\n\n## Benchmarks\n\nThe following benchmarks were generated on a dedicated server with an Intel(R) Core(TM) i7-7700 CPU @ 3.60GHz and 64GB of RAM:\n\n| **Framework**         | req/sec |\n| :-------------------- | :------ |\n| `express-http-proxy`  | 2557    |\n| `http-proxy`          | 9519    |\n| `@fastify/http-proxy` | 15919   |\n\nThe results were gathered on the second run of `autocannon -c 100 -d 5\nURL`.\n\n## TODO\n\n- [ ] Perform validations for incoming data\n- [ ] Finish implementing websocket\n\n## License\n\nLicensed under [MIT](./LICENSE).\n","funding_links":["https://github.com/sponsors/fastify","https://opencollective.com/fastify"],"categories":["\u003ch2 align=\"center\"\u003eAwesome Fastify\u003c/h2\u003e","JavaScript"],"sub_categories":["\u003ch2 align=\"center\"\u003eEcosystem\u003c/h2\u003e"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffastify%2Ffastify-http-proxy","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffastify%2Ffastify-http-proxy","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffastify%2Ffastify-http-proxy/lists"}