{"title":"Webhooks API","slug":"webhooks","category":"api","summary":"Đăng ký HTTP callback cho sự kiện bộ nhớ, chat và tác vụ — nhận thông báo khi dữ liệu thay đổi.","audience":["human","llm"],"tags":["api","webhooks","automation","events"],"difficulty":"intermediate","updated":"2026-06-27","word_count":253,"read_minutes":1,"llm_context":"Auth: Mind Key\nRegister: POST /webhooks { url, events, secret? }\nList: GET /webhooks\nGet: GET /webhooks/:id\nUpdate: PUT /webhooks/:id { url?, events?, secret?, enabled? }\nDelete: DELETE /webhooks/:id\nEvents: memory.*, memory.store, memory.update, memory.delete, chat.*, chat.message_received, task.*, task.created, task.completed\nSecret: HMAC-SHA256 signed payload, sent in X-Synapse-Signature header\nPattern: register webhook → receive POST → process event → call Synapse API\n","lang":"vi","translated":true,"requested_lang":"vi","content_markdown":"\n# Webhooks API\n\nWebhook cho phép bạn nhận HTTP callback khi sự kiện xảy ra trong Synapse. Hoàn\nhảo để kích hoạt tự động hóa bên ngoài, gửi thông báo hoặc đồng bộ với hệ thống\nkhác.\n\n## Các endpoint\n\n### POST /webhooks\n\nĐăng ký webhook mới.\n\n```bash\ncurl -X POST https://synapse.schaefer.zone/webhooks \\\n  -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\n    \"url\": \"https://my-app.com/webhook\",\n    \"events\": \"memory.*\",\n    \"secret\": \"my-hmac-secret-min-8-chars\"\n  }'\n```\n\nPhản hồi:\n\n```json\n{\n  \"id\": \"wh_001\",\n  \"url\": \"https://my-app.com/webhook\",\n  \"events\": [\"memory.*\"],\n  \"enabled\": true,\n  \"created_at\": \"2026-06-27T...\"\n}\n```\n\n### GET /webhooks\n\nLiệt kê tất cả webhook cho mind hiện tại.\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks\n```\n\n### GET /webhooks/:id\n\nLấy một webhook đơn lẻ.\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks/wh_001\n```\n\n### PUT /webhooks/:id\n\nCập nhật webhook (URL, sự kiện, secret hoặc cờ enabled).\n\n```bash\ncurl -X PUT https://synapse.schaefer.zone/webhooks/wh_001 \\\n  -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"enabled\": false}'\n```\n\n### DELETE /webhooks/:id\n\nXóa một webhook.\n\n```bash\ncurl -X DELETE -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks/wh_001\n```\n\n## Loại sự kiện\n\n| Mẫu | Kích hoạt khi |\n|---------|------------|\n| `memory.*` | Bất kỳ sự kiện bộ nhớ nào |\n| `memory.store` | Bộ nhớ mới được lưu |\n| `memory.update` | Bộ nhớ được cập nhật |\n| `memory.delete` | Bộ nhớ bị xóa |\n| `chat.*` | Bất kỳ sự kiện chat nào |\n| `chat.message_received` | Tin nhắn mới từ con người |\n| `task.*` | Bất kỳ sự kiện tác vụ nào |\n| `task.created` | Tác vụ mới được tạo |\n| `task.completed` | Tác vụ được đánh dấu đã xong |\n| `*` | Tất cả sự kiện |\n\n## Payload Webhook\n\nKhi sự kiện kích hoạt, Synapse POST đến URL của bạn:\n\n```json\n{\n  \"event\": \"memory.store\",\n  \"timestamp\": \"2026-06-27T...\",\n  \"mind_id\": \"m_xyz789\",\n  \"data\": {\n    \"id\": \"mem_001\",\n    \"category\": \"fact\",\n    \"key\": \"user_name\",\n    \"content\": \"Michael Schäfer\"\n  }\n}\n```\n\n## Xác minh chữ ký\n\nNếu bạn đặt `secret`, Synapse ký mỗi payload bằng HMAC-SHA256:\n\n```\nX-Synapse-Signature: sha256=<hex-hmac>\n```\n\nXác minh trong trình xử lý của bạn:\n\n```python\nimport hmac, hashlib\n\ndef verify_signature(payload_body: bytes, signature: str, secret: str) -> bool:\n    expected = hmac.new(\n        secret.encode(),\n        payload_body,\n        hashlib.sha256\n    ).hexdigest()\n    return hmac.compare_digest(f\"sha256={expected}\", signature)\n```\n\n## Mẫu: Đồng bộ thời gian thực\n\n```python\n# Your webhook handler\n@app.post(\"/webhook\")\nasync def handle_webhook(request):\n    body = await request.body()\n    signature = request.headers.get(\"X-Synapse-Signature\", \"\")\n    if not verify_signature(body, signature, WEBHOOK_SECRET):\n        return 401\n\n    event = json.loads(body)\n    if event[\"event\"] == \"memory.store\":\n        # Sync to another system\n        sync_to_external(event[\"data\"])\n    elif event[\"event\"] == \"chat.message_received\":\n        # Trigger agent wake-up\n        notify_agent(event[\"data\"])\n```\n\n## Bước tiếp theo\n\n- [Cron & Scheduler](/docs/api/cron)\n- [Hướng dẫn tự động hóa Webhook](/docs/guides/webhook-automation)\n","content_html":"<h1>Webhooks API</h1>\n<p>Webhook cho phép bạn nhận HTTP callback khi sự kiện xảy ra trong Synapse. Hoàn\nhảo để kích hoạt tự động hóa bên ngoài, gửi thông báo hoặc đồng bộ với hệ thống\nkhác.</p>\n<h2>Các endpoint</h2>\n<h3>POST /webhooks</h3>\n<p>Đăng ký webhook mới.</p>\n<pre><code class=\"hljs language-bash\">curl -X POST https://synapse.schaefer.zone/webhooks \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n  -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{\n    &quot;url&quot;: &quot;https://my-app.com/webhook&quot;,\n    &quot;events&quot;: &quot;memory.*&quot;,\n    &quot;secret&quot;: &quot;my-hmac-secret-min-8-chars&quot;\n  }&#x27;</span></code></pre><p>Phản hồi:</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;id&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;wh_001&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;url&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;https://my-app.com/webhook&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;events&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span><span class=\"hljs-string\">&quot;memory.*&quot;</span><span class=\"hljs-punctuation\">]</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;enabled&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-literal\"><span class=\"hljs-keyword\">true</span></span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;created_at&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;2026-06-27T...&quot;</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><h3>GET /webhooks</h3>\n<p>Liệt kê tất cả webhook cho mind hiện tại.</p>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     https://synapse.schaefer.zone/webhooks</code></pre><h3>GET /webhooks/:id</h3>\n<p>Lấy một webhook đơn lẻ.</p>\n<pre><code class=\"hljs language-bash\">curl -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     https://synapse.schaefer.zone/webhooks/wh_001</code></pre><h3>PUT /webhooks/:id</h3>\n<p>Cập nhật webhook (URL, sự kiện, secret hoặc cờ enabled).</p>\n<pre><code class=\"hljs language-bash\">curl -X PUT https://synapse.schaefer.zone/webhooks/wh_001 \\\n  -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n  -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;enabled&quot;: false}&#x27;</span></code></pre><h3>DELETE /webhooks/:id</h3>\n<p>Xóa một webhook.</p>\n<pre><code class=\"hljs language-bash\">curl -X DELETE -H <span class=\"hljs-string\">&quot;Authorization: Bearer YOUR_MIND_KEY&quot;</span> \\\n     https://synapse.schaefer.zone/webhooks/wh_001</code></pre><h2>Loại sự kiện</h2>\n<table>\n<thead>\n<tr>\n<th>Mẫu</th>\n<th>Kích hoạt khi</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>memory.*</code></td>\n<td>Bất kỳ sự kiện bộ nhớ nào</td>\n</tr>\n<tr>\n<td><code>memory.store</code></td>\n<td>Bộ nhớ mới được lưu</td>\n</tr>\n<tr>\n<td><code>memory.update</code></td>\n<td>Bộ nhớ được cập nhật</td>\n</tr>\n<tr>\n<td><code>memory.delete</code></td>\n<td>Bộ nhớ bị xóa</td>\n</tr>\n<tr>\n<td><code>chat.*</code></td>\n<td>Bất kỳ sự kiện chat nào</td>\n</tr>\n<tr>\n<td><code>chat.message_received</code></td>\n<td>Tin nhắn mới từ con người</td>\n</tr>\n<tr>\n<td><code>task.*</code></td>\n<td>Bất kỳ sự kiện tác vụ nào</td>\n</tr>\n<tr>\n<td><code>task.created</code></td>\n<td>Tác vụ mới được tạo</td>\n</tr>\n<tr>\n<td><code>task.completed</code></td>\n<td>Tác vụ được đánh dấu đã xong</td>\n</tr>\n<tr>\n<td><code>*</code></td>\n<td>Tất cả sự kiện</td>\n</tr>\n</tbody></table>\n<h2>Payload Webhook</h2>\n<p>Khi sự kiện kích hoạt, Synapse POST đến URL của bạn:</p>\n<pre><code class=\"hljs language-json\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;event&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;memory.store&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;timestamp&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;2026-06-27T...&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;mind_id&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;m_xyz789&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;data&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n    <span class=\"hljs-attr\">&quot;id&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;mem_001&quot;</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;category&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;fact&quot;</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;key&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;user_name&quot;</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;content&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Michael Schäfer&quot;</span>\n  <span class=\"hljs-punctuation\">}</span>\n<span class=\"hljs-punctuation\">}</span></code></pre><h2>Xác minh chữ ký</h2>\n<p>Nếu bạn đặt <code>secret</code>, Synapse ký mỗi payload bằng HMAC-SHA256:</p>\n<pre><code class=\"hljs language-plaintext\">X-Synapse-Signature: sha256=&lt;hex-hmac&gt;</code></pre><p>Xác minh trong trình xử lý của bạn:</p>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-keyword\">import</span> hmac, hashlib\n\n<span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">verify_signature</span>(<span class=\"hljs-params\">payload_body: <span class=\"hljs-built_in\">bytes</span>, signature: <span class=\"hljs-built_in\">str</span>, secret: <span class=\"hljs-built_in\">str</span></span>) -&gt; <span class=\"hljs-built_in\">bool</span>:\n    expected = hmac.new(\n        secret.encode(),\n        payload_body,\n        hashlib.sha256\n    ).hexdigest()\n    <span class=\"hljs-keyword\">return</span> hmac.compare_digest(<span class=\"hljs-string\">f&quot;sha256=<span class=\"hljs-subst\">{expected}</span>&quot;</span>, signature)</code></pre><h2>Mẫu: Đồng bộ thời gian thực</h2>\n<pre><code class=\"hljs language-python\"><span class=\"hljs-comment\"># Your webhook handler</span>\n<span class=\"hljs-meta\">@app.post(<span class=\"hljs-params\"><span class=\"hljs-string\">&quot;/webhook&quot;</span></span>)</span>\n<span class=\"hljs-keyword\">async</span> <span class=\"hljs-keyword\">def</span> <span class=\"hljs-title function_\">handle_webhook</span>(<span class=\"hljs-params\">request</span>):\n    body = <span class=\"hljs-keyword\">await</span> request.body()\n    signature = request.headers.get(<span class=\"hljs-string\">&quot;X-Synapse-Signature&quot;</span>, <span class=\"hljs-string\">&quot;&quot;</span>)\n    <span class=\"hljs-keyword\">if</span> <span class=\"hljs-keyword\">not</span> verify_signature(body, signature, WEBHOOK_SECRET):\n        <span class=\"hljs-keyword\">return</span> <span class=\"hljs-number\">401</span>\n\n    event = json.loads(body)\n    <span class=\"hljs-keyword\">if</span> event[<span class=\"hljs-string\">&quot;event&quot;</span>] == <span class=\"hljs-string\">&quot;memory.store&quot;</span>:\n        <span class=\"hljs-comment\"># Sync to another system</span>\n        sync_to_external(event[<span class=\"hljs-string\">&quot;data&quot;</span>])\n    <span class=\"hljs-keyword\">elif</span> event[<span class=\"hljs-string\">&quot;event&quot;</span>] == <span class=\"hljs-string\">&quot;chat.message_received&quot;</span>:\n        <span class=\"hljs-comment\"># Trigger agent wake-up</span>\n        notify_agent(event[<span class=\"hljs-string\">&quot;data&quot;</span>])</code></pre><h2>Bước tiếp theo</h2>\n<ul>\n<li><a href=\"/docs/api/cron\">Cron &amp; Scheduler</a></li>\n<li><a href=\"/docs/guides/webhook-automation\">Hướng dẫn tự động hóa Webhook</a></li>\n</ul>\n","urls":{"html":"/docs/api/webhooks","text":"/docs/api/webhooks?format=text","json":"/docs/api/webhooks?format=json","llm":"/docs/api/webhooks?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}