{"id":17641189,"url":"https://github.com/webhookx-io/webhookx","last_synced_at":"2026-02-06T11:47:44.310Z","repository":{"id":248728961,"uuid":"829540769","full_name":"webhookx-io/webhookx","owner":"webhookx-io","description":"an open-source webhooks gateway for message receiving, processing, and delivering.","archived":false,"fork":false,"pushed_at":"2025-03-05T09:17:00.000Z","size":453,"stargazers_count":136,"open_issues_count":7,"forks_count":13,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-03-05T09:20:48.322Z","etag":null,"topics":["cloud-native","docker","gateway","golang","webhooks","webhookx"],"latest_commit_sha":null,"homepage":"https://webhookx.io","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/webhookx-io.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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}},"created_at":"2024-07-16T16:29:33.000Z","updated_at":"2025-02-28T10:18:13.000Z","dependencies_parsed_at":"2024-09-14T23:13:59.067Z","dependency_job_id":"59221acd-1696-48ab-9579-207453284135","html_url":"https://github.com/webhookx-io/webhookx","commit_stats":null,"previous_names":["webhookxhq/webhookx"],"tags_count":14,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookx-io%2Fwebhookx","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookx-io%2Fwebhookx/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookx-io%2Fwebhookx/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/webhookx-io%2Fwebhookx/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/webhookx-io","download_url":"https://codeload.github.com/webhookx-io/webhookx/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242833107,"owners_count":20192683,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["cloud-native","docker","gateway","golang","webhooks","webhookx"],"created_at":"2024-10-23T07:01:13.407Z","updated_at":"2026-02-06T11:47:44.300Z","avatar_url":"https://github.com/webhookx-io.png","language":"Go","readme":"# WebhookX\n\n[![release](https://img.shields.io/github/v/release/webhookx-io/webhookx?color=green)](https://github.com/webhookx-io/webhookx/releases) [![test-workflow](https://github.com/webhookx-io/webhookx/actions/workflows/test.yml/badge.svg)](https://github.com/webhookx-io/webhookx/actions/workflows/test.yml) [![lint-workflow](https://github.com/webhookx-io/webhookx/actions/workflows/lint.yml/badge.svg)](https://github.com/webhookx-io/webhookx/actions/workflows/lint.yml) [![codecov](https://codecov.io/gh/webhookx-io/webhookx/graph/badge.svg?token=O4AQNRBJRF)](https://codecov.io/gh/webhookx-io/webhookx) [![Mentioned in Awesome Go](https://awesome.re/mentioned-badge.svg)](https://github.com/avelino/awesome-go)\n\n[![Join Slack](https://img.shields.io/badge/Join_WebhookX_👋-green?logo=slack\u0026label=Slack)](https://join.slack.com/t/webhookx/shared_invite/zt-3ekjrpig4-1T~kOq8aUh7XXA5xiSGtXw) [![Twitter](https://img.shields.io/twitter/follow/WebhookX.svg?style=social)](https://twitter.com/intent/follow?screen_name=WebhookX)\n\nWebhookX is an open-source webhook gateway for receiving, validating, transforming, and delivering events at scale.\n\n**Docs:** https://docs.webhookx.io  \n**OpenAPI:** https://openapi.webhookx.io\n\n\n## Architecture\n\n\u003cp align=\"center\"\u003e\n\u003cimg src=\"./docs/architecture.png\" alt=\"webhookx architecture\" width=\"100%\" /\u003e\n\u003c/p\u003e\n\n## Posts\n\n- [Introducing WebAssembly Plugin](https://docs.webhookx.io/blog/engineering/introducing-webassembly-plugin)\n- [Function: A Way of Handling Webhook Verification Chaos](https://docs.webhookx.io/blog/engineering/function-a-way-of-handling-webhook-verification-chaos)\n\n\n\n## Features\n\n- **Admin API:** RESTful management API on port `:9601`.\n- **Reliable delivery:** Automatic retries with configurable delays.\n- **Fan out:** Route events to multiple endpoints based on event type.\n- **Rate limiting:** Protect ingestion and delivery from overload.\n- **Declarative configuration:** GitOps-friendly configuration files.\n- **Multi tenancy:** Workspace isolation for configuration entities.\n- **Plugins:** Extensible inbound and outbound processing.\n- **Observability:** OpenTelemetry metrics and tracing.\n- **Secret management:** Reference secrets from external providers.\n\n**Built-in plugins**\n- `webhookx-signature`: Sign outbound requests with HMAC (SHA-256)  by adding `Webhookx-Signature` and `Webhookx-Timestamp` headers.\n- `wasm`: Transform outbound requests using AssemblyScript, Rust, or TinyGo. See `plugins/wasm`.\n- `function`: Customize inbound behavior with JavaScript (signature verification or request body transformation).\n- `event-validation`: Validate event data against JSON Schema.\n- Security Plugins: `hmac-auth`, `basic-auth`, `key-auth`, `connect-auth`.\n\n\n\n## Installation\n\nThe WebhookX binary includes both server and CLI command.\n\n### macOS\n\n```shell\nbrew tap webhookx-io/webhookx \u0026\u0026 brew install webhookx\n```\n\n### Linux | Windows\n\nDownload the binary distribution on [releases](https://github.com/webhookx-io/webhookx/releases).\n\n## Get started\n\n\u003e [!TIP]\n\u003e This quick start is for evaluation only. For production deployment, see the [documentation](https://docs.webhookx.io/docs/).\n\n### 1. Start WebhookX using Docker Compose\n\nThe  [`docker-compose.yml`](https://github.com/webhookx-io/webhookx/blob/main/docker-compose.yml) provides a simple all-in-one (standalone) deployment for quick start.\n\n```\ncurl -O https://raw.githubusercontent.com/webhookx-io/webhookx/main/docker-compose.yml \u0026\u0026 docker compose -f docker-compose.yml up\n```\n\nOnce it's running, you will see an HTTP 200 response.\n\n```\ncurl http://localhost:9601\n```\n\n```http\nHTTP/1.1 200 OK\nContent-Type: application/json; charset=utf-8\nServer: WebhookX/{version}\n\n{\n    \"version\": \"{version}\",\n    \"message\": \"Welcome to WebhookX\",\n  \t\"configuration\": {}\n}\n```\n\n\n\n### 2. Configure entities\n\nLet's use a sample declarative configuration [webhookx.sample.yml](https://github.com/webhookx-io/webhookx/blob/main/webhookx.sample.yml) in this quick start.\n\n\u003e You may need to install CLI `webhookx` first, see [Installation](#Installation).\n\n```\nwebhookx admin sync webhookx.sample.yml\n```\n\nThis command sends the configuration file to WebhookX via the Admin API.\n\nOnce it is set up, you're ready to send events to WebhookX.\n\n\n\n### 3. Send events\n\n\u003e The Ingestion is exposed on port  `:9600`\n\n```\ncurl -X POST http://localhost:9600 \\\n--header 'Content-Type: application/json' \\\n--data '{\n    \"event_type\": \"charge.succeeded\",\n    \"data\": {\n        \"key\": \"value\"\n    }\n}'\n```\n\nThis sends a `charge.succeeded` event with `data`. WebhookX routes it to endpoints defined in `webhookx.sample.yml`.\n\n\n\n### 4. Inspect delivery results\n\n\u003e [!TIP]\n\u003e\n\u003e Attempt objects represent delivery results and include inspection details.\n\n\u003e The Admin is exposed on port  `:9601`\n\nRetrieve the attempt list:\n\n```\ncurl http://localhost:9601/workspaces/default/attempts\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eHTTP Response\u003c/summary\u003e\n\n```json\n{\n  \"total\": 1,\n  \"data\": [\n    {\n      \"id\": \"338lax8Xe774EhimzBukip37Zne\",\n      \"event_id\": \"338las8UmbKJZl3aikM44ZWh71P\",\n      \"endpoint_id\": \"338lQch7qdBqKvlVxXHcPTjLDTn\",\n      \"status\": \"SUCCESSFUL\",\n      \"attempt_number\": 1,\n      \"scheduled_at\": 1758706646768,\n      \"attempted_at\": 1758706646819,\n      \"trigger_mode\": \"INITIAL\",\n      \"exhausted\": false,\n      \"error_code\": null,\n      \"request\": {\n        \"method\": \"POST\",\n        \"url\": \"https://httpbin.org/anything\",\n        \"headers\": null,\n        \"body\": null\n      },\n      \"response\": {\n        \"status\": 200,\n        \"latency\": 2402,\n        \"headers\": null,\n        \"body\": null\n      },\n      \"created_at\": 1758706646769,\n      \"updated_at\": 1758706649223\n    }\n  ]\n}\n```\n\u003c/details\u003e\n\nTo inspect `request.headers`, `request.body`, `response.headers`, and `response.body`, use:\n\n```\nhttp://localhost:9601/workspaces/default/attempts/338lax8Xe774EhimzBukip37Zne\n```\n\n\u003cdetails\u003e\n\u003csummary\u003eHTTP Response\u003c/summary\u003e\n\n```json\n{\n  \"id\": \"338lax8Xe774EhimzBukip37Zne\",\n  \"event_id\": \"338las8UmbKJZl3aikM44ZWh71P\",\n  \"endpoint_id\": \"338lQch7qdBqKvlVxXHcPTjLDTn\",\n  \"status\": \"SUCCESSFUL\",\n  \"attempt_number\": 1,\n  \"scheduled_at\": 1758706646768,\n  \"attempted_at\": 1758706646819,\n  \"trigger_mode\": \"INITIAL\",\n  \"exhausted\": false,\n  \"error_code\": null,\n  \"request\": {\n    \"method\": \"POST\",\n    \"url\": \"https://httpbin.org/anything\",\n    \"headers\": {\n      \"Content-Type\": \"application/json; charset=utf-8\",\n      \"User-Agent\": \"WebhookX/{version}\",\n      \"Webhookx-Delivery-Id\": \"338lax8Xe774EhimzBukip37Zne\",\n      \"Webhookx-Event-Id\": \"338las8UmbKJZl3aikM44ZWh71P\",\n      \"Webhookx-Signature\": \"v1=37e25342d983c26d783eafe50fe170eaac731383439568e3354315c2e84c5173\",\n      \"Webhookx-Timestamp\": \"1758706646\",\n      \"X-Apikey\": \"secret\"\n    },\n    \"body\": \"{\\n        \\\"key\\\": \\\"value\\\"\\n    }\"\n  },\n  \"response\": {\n    \"status\": 200,\n    \"latency\": 2402,\n    \"headers\": {\n      \"Access-Control-Allow-Credentials\": \"true\",\n      \"Access-Control-Allow-Origin\": \"*\",\n      \"Content-Length\": \"778\",\n      \"Content-Type\": \"application/json\",\n      \"Date\": \"Wed, 24 Sep 2025 09:37:29 GMT\",\n      \"Server\": \"gunicorn/19.9.0\"\n    },\n    \"body\": \"{\\n  \\\"args\\\": {}, \\n  \\\"data\\\": \\\"{\\\\n        \\\\\\\"key\\\\\\\": \\\\\\\"value\\\\\\\"\\\\n    }\\\", \\n  \\\"files\\\": {}, \\n  \\\"form\\\": {}, \\n  \\\"headers\\\": {\\n    \\\"Accept-Encoding\\\": \\\"gzip\\\", \\n    \\\"Content-Length\\\": \\\"30\\\", \\n    \\\"Content-Type\\\": \\\"application/json; charset=utf-8\\\", \\n    \\\"Host\\\": \\\"httpbin.org\\\", \\n    \\\"User-Agent\\\": \\\"WebhookX/{version}\\\", \\n    \\\"Webhookx-Delivery-Id\\\": \\\"338lax8Xe774EhimzBukip37Zne\\\", \\n    \\\"Webhookx-Event-Id\\\": \\\"338las8UmbKJZl3aikM44ZWh71P\\\", \\n    \\\"Webhookx-Signature\\\": \\\"v1=37e25342d983c26d783eafe50fe170eaac731383439568e3354315c2e84c5173\\\", \\n    \\\"Webhookx-Timestamp\\\": \\\"1758706646\\\", \\n    \\\"X-Amzn-Trace-Id\\\": \\\"Root=1-68d3bbd7-195b190632c27c547358dbee\\\", \\n    \\\"X-Apikey\\\": \\\"secret\\\"\\n  }, \\n  \\\"json\\\": {\\n    \\\"key\\\": \\\"value\\\"\\n  }, \\n  \\\"method\\\": \\\"POST\\\", \\n  \\\"origin\\\": \\\"0.0.0.0\\\", \\n  \\\"url\\\": \\\"https://httpbin.org/anything\\\"\\n}\\n\"\n  },\n  \"created_at\": 1758706646769,\n  \"updated_at\": 1758706649223\n}\n\n```\n\n\u003c/details\u003e\n\n\n\n\nFor the full API, see [openapi.webhookx.io](https://openapi.webhookx.io).\n\n\n\n## CLI\n\n```\nUsage:\n  webhookx [command]\n\nAvailable Commands:\n  admin       Admin commands\n  completion  Generate the autocompletion script for the specified shell\n  db          Database commands\n  help        Help about any command\n  start       Start server\n  version     Print the version\n\nFlags:\n  -h, --help      help for webhookx\n      --verbose   Verbose logging.\n\nUse \"webhookx [command] --help\" for more information about a command.\n```\n\n- [CLI Reference](https://docs.webhookx.io/docs/cli)\n\n\n\n## Runtime dependencies\n\nRequires the following runtime dependencies:\n\n- PostgreSQL (\u003e=13): lower versions may work but are not fully tested.\n- Redis (\u003e=6.2): minimum required version.\n\n\n\n## Status and Compatibility\n\nThe project is currently under active development, hence breaking changes may be introduced in minor releases.\n\nThe public API will strictly follow semantic versioning after `v1.0.0`.\n\n\n\n## Contributing\n\nWe welcome pull requests and aim to keep contribution flow smooth and well-documented.\n\nThank you for contributing to WebhookX.\n\n\n\n## Stay Ahead\n\nStar WebhookX on GitHub to get release updates.\n\n\u003cimg src=\"./docs/star.gif\" alt=\"star\" width=\"100%\"/\u003e\n\n\n\n## License\n\nWebhookX is under the Apache 2.0 license. See the [LICENSE](https://github.com/webhookx-io/webhookx/blob/main/LICENSE) file for details.\n","funding_links":[],"categories":["Go","Recently Updated","Webhooks Server","\u003ca name=\"Go\"\u003e\u003c/a\u003eGo"],"sub_categories":["[Dec 24, 2024](/content/2024/12/24/README.md)","Routers","Utility/Miscellaneous","路由器"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebhookx-io%2Fwebhookx","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fwebhookx-io%2Fwebhookx","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fwebhookx-io%2Fwebhookx/lists"}