{"title":"Webhooks API","slug":"webhooks","category":"api","summary":"Registri callback HTTP per eventi memory, chat e task — riceva notifiche quando i dati cambiano.","audience":["human","llm"],"tags":["api","webhooks","automation","events"],"difficulty":"intermediate","updated":"2026-06-27","word_count":203,"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":"it","translated":true,"requested_lang":"it","content_markdown":"\n# Webhooks API\n\nI webhook permettono di ricevere callback HTTP quando si verificano eventi in\nSynapse. Perfetti per attivare automazione esterna, inviare notifiche o\nsincronizzare con altri sistemi.\n\n## Endpoint\n\n### POST /webhooks\n\nRegistra un nuovo webhook.\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\nRisposta:\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\nElenca tutti i webhook della mente corrente.\n\n```bash\ncurl -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks\n```\n\n### GET /webhooks/:id\n\nOttiene un singolo webhook.\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\nAggiorna un webhook (URL, eventi, secret o flag 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\nElimina un webhook.\n\n```bash\ncurl -X DELETE -H \"Authorization: Bearer YOUR_MIND_KEY\" \\\n     https://synapse.schaefer.zone/webhooks/wh_001\n```\n\n## Tipi di evento\n\n| Pattern | Si attiva quando |\n|---------|------------|\n| `memory.*` | Qualsiasi evento memory |\n| `memory.store` | Nuova memoria salvata |\n| `memory.update` | Memoria aggiornata |\n| `memory.delete` | Memoria eliminata |\n| `chat.*` | Qualsiasi evento chat |\n| `chat.message_received` | Nuovo messaggio dall'umano |\n| `task.*` | Qualsiasi evento task |\n| `task.created` | Nuova attività creata |\n| `task.completed` | Attività contrassegnata come completata |\n| `*` | Tutti gli eventi |\n\n## Payload del webhook\n\nQuando si verifica un evento, Synapse invia una POST alla sua URL:\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## Verifica della firma\n\nSe imposta un `secret`, Synapse firma ogni payload con HMAC-SHA256:\n\n```\nX-Synapse-Signature: sha256=<hex-hmac>\n```\n\nVerifichi nel suo handler:\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## Modello: sync in tempo reale\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## Prossimi passi\n\n- [Cron & Scheduler](/docs/api/cron)\n- [Guida automazione webhook](/docs/guides/webhook-automation)\n","content_html":"<h1>Webhooks API</h1>\n<p>I webhook permettono di ricevere callback HTTP quando si verificano eventi in\nSynapse. Perfetti per attivare automazione esterna, inviare notifiche o\nsincronizzare con altri sistemi.</p>\n<h2>Endpoint</h2>\n<h3>POST /webhooks</h3>\n<p>Registra un nuovo webhook.</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>Risposta:</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>Elenca tutti i webhook della mente corrente.</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>Ottiene un singolo webhook.</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>Aggiorna un webhook (URL, eventi, secret o flag 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>Elimina un 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>Tipi di evento</h2>\n<table>\n<thead>\n<tr>\n<th>Pattern</th>\n<th>Si attiva quando</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>memory.*</code></td>\n<td>Qualsiasi evento memory</td>\n</tr>\n<tr>\n<td><code>memory.store</code></td>\n<td>Nuova memoria salvata</td>\n</tr>\n<tr>\n<td><code>memory.update</code></td>\n<td>Memoria aggiornata</td>\n</tr>\n<tr>\n<td><code>memory.delete</code></td>\n<td>Memoria eliminata</td>\n</tr>\n<tr>\n<td><code>chat.*</code></td>\n<td>Qualsiasi evento chat</td>\n</tr>\n<tr>\n<td><code>chat.message_received</code></td>\n<td>Nuovo messaggio dall&#39;umano</td>\n</tr>\n<tr>\n<td><code>task.*</code></td>\n<td>Qualsiasi evento task</td>\n</tr>\n<tr>\n<td><code>task.created</code></td>\n<td>Nuova attività creata</td>\n</tr>\n<tr>\n<td><code>task.completed</code></td>\n<td>Attività contrassegnata come completata</td>\n</tr>\n<tr>\n<td><code>*</code></td>\n<td>Tutti gli eventi</td>\n</tr>\n</tbody></table>\n<h2>Payload del webhook</h2>\n<p>Quando si verifica un evento, Synapse invia una POST alla sua URL:</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>Verifica della firma</h2>\n<p>Se imposta un <code>secret</code>, Synapse firma ogni payload con HMAC-SHA256:</p>\n<pre><code class=\"hljs language-plaintext\">X-Synapse-Signature: sha256=&lt;hex-hmac&gt;</code></pre><p>Verifichi nel suo handler:</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>Modello: sync in tempo reale</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>Prossimi passi</h2>\n<ul>\n<li><a href=\"/docs/api/cron\">Cron &amp; Scheduler</a></li>\n<li><a href=\"/docs/guides/webhook-automation\">Guida automazione 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"]}