{"title":"Webhooks API","slug":"webhooks","category":"api","summary":"메모리, 채팅, 작업 이벤트에 대한 HTTP 콜백 등록 — 데이터 변경 시 알림을 받습니다.","audience":["human","llm"],"tags":["api","webhooks","automation","events"],"difficulty":"intermediate","updated":"2026-06-27","word_count":175,"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":"ko","translated":true,"requested_lang":"ko","content_markdown":"\n# Webhooks API\n\n웹훅을 사용하면 Synapse에서 이벤트가 발생할 때 HTTP 콜백을 받을 수\n있습니다. 외부 자동화 트리거, 알림 전송, 또는 다른 시스템으로의 동기화에\n적합합니다.\n\n## 엔드포인트\n\n### POST /webhooks\n\n새 웹훅을 등록합니다.\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\n응답:\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\n현재 마인드의 모든 웹훅을 나열합니다.\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks\n```\n\n### GET /webhooks/:id\n\n단일 웹훅을 가져옵니다.\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\n웹훅을 업데이트합니다 (URL, 이벤트, 시크릿, 또는 활성화 플래그).\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\n웹훅을 삭제합니다.\n\n```bash\ncurl -X DELETE -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks/wh_001\n```\n\n## 이벤트 유형\n\n| 패턴 | 발생 시점 |\n|---------|------------|\n| `memory.*` | 모든 메모리 이벤트 |\n| `memory.store` | 새 메모리 저장 |\n| `memory.update` | 메모리 업데이트 |\n| `memory.delete` | 메모리 삭제 |\n| `chat.*` | 모든 채팅 이벤트 |\n| `chat.message_received` | 사람이 보낸 새 메시지 |\n| `task.*` | 모든 작업 이벤트 |\n| `task.created` | 새 작업 생성 |\n| `task.completed` | 작업 완료 표시 |\n| `*` | 모든 이벤트 |\n\n## 웹훅 페이로드\n\n이벤트가 발생하면 Synapse가 귀하의 URL로 POST합니다:\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## 서명 검증\n\n`secret`을 설정하면 Synapse가 각 페이로드를 HMAC-SHA256으로 서명합니다:\n\n```\nX-Synapse-Signature: sha256=<hex-hmac>\n```\n\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## 패턴: 실시간 동기화\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## 다음 단계\n\n- [Cron 및 Scheduler](/docs/api/cron)\n- [웹훅 자동화 가이드](/docs/guides/webhook-automation)\n","content_html":"<h1>Webhooks API</h1>\n<p>웹훅을 사용하면 Synapse에서 이벤트가 발생할 때 HTTP 콜백을 받을 수\n있습니다. 외부 자동화 트리거, 알림 전송, 또는 다른 시스템으로의 동기화에\n적합합니다.</p>\n<h2>엔드포인트</h2>\n<h3>POST /webhooks</h3>\n<p>새 웹훅을 등록합니다.</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>응답:</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>현재 마인드의 모든 웹훅을 나열합니다.</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>단일 웹훅을 가져옵니다.</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>웹훅을 업데이트합니다 (URL, 이벤트, 시크릿, 또는 활성화 플래그).</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>웹훅을 삭제합니다.</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>이벤트 유형</h2>\n<table>\n<thead>\n<tr>\n<th>패턴</th>\n<th>발생 시점</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>memory.*</code></td>\n<td>모든 메모리 이벤트</td>\n</tr>\n<tr>\n<td><code>memory.store</code></td>\n<td>새 메모리 저장</td>\n</tr>\n<tr>\n<td><code>memory.update</code></td>\n<td>메모리 업데이트</td>\n</tr>\n<tr>\n<td><code>memory.delete</code></td>\n<td>메모리 삭제</td>\n</tr>\n<tr>\n<td><code>chat.*</code></td>\n<td>모든 채팅 이벤트</td>\n</tr>\n<tr>\n<td><code>chat.message_received</code></td>\n<td>사람이 보낸 새 메시지</td>\n</tr>\n<tr>\n<td><code>task.*</code></td>\n<td>모든 작업 이벤트</td>\n</tr>\n<tr>\n<td><code>task.created</code></td>\n<td>새 작업 생성</td>\n</tr>\n<tr>\n<td><code>task.completed</code></td>\n<td>작업 완료 표시</td>\n</tr>\n<tr>\n<td><code>*</code></td>\n<td>모든 이벤트</td>\n</tr>\n</tbody></table>\n<h2>웹훅 페이로드</h2>\n<p>이벤트가 발생하면 Synapse가 귀하의 URL로 POST합니다:</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>서명 검증</h2>\n<p><code>secret</code>을 설정하면 Synapse가 각 페이로드를 HMAC-SHA256으로 서명합니다:</p>\n<pre><code class=\"hljs language-plaintext\">X-Synapse-Signature: sha256=&lt;hex-hmac&gt;</code></pre><p>핸들러에서 검증:</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>패턴: 실시간 동기화</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>다음 단계</h2>\n<ul>\n<li><a href=\"/docs/api/cron\">Cron 및 Scheduler</a></li>\n<li><a href=\"/docs/guides/webhook-automation\">웹훅 자동화 가이드</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"]}