{"id":45,"date":"2026-02-14T10:08:00","date_gmt":"2026-02-14T10:08:00","guid":{"rendered":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/webhooks-reference\/"},"modified":"2026-02-14T10:08:00","modified_gmt":"2026-02-14T10:08:00","slug":"webhooks-reference","status":"publish","type":"post","link":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/webhooks-reference\/","title":{"rendered":"Webhooks reference"},"content":{"rendered":"<p class=\"has-large-font-size\">Complete reference for Lattica webhook events. For setup and signature verification, see <a href=\"\/zapier-and-webhooks\/\">Zapier and webhooks<\/a>.<\/p>\n<h2>Common payload structure<\/h2>\n<p>Every webhook delivery has the same envelope:<\/p>\n<pre><code>{\n  \"event\": \"task.created\",\n  \"delivered_at\": \"2026-04-12T10:14:22Z\",\n  \"workspace_id\": \"ws_8FjK4q\",\n  \"actor\": {\n    \"type\": \"user\",\n    \"id\": \"usr_a91kp2\",\n    \"name\": \"Priya Shah\"\n  },\n  \"data\": { ... event-specific payload ... }\n}<\/code><\/pre>\n<h2>Headers<\/h2>\n<table>\n<thead>\n<tr>\n<th>Header<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>X-Lattica-Event<\/code><\/td>\n<td>Event name, e.g. <code>task.created<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>X-Lattica-Signature<\/code><\/td>\n<td>HMAC-SHA256 of body, prefixed <code>sha256=<\/code><\/td>\n<\/tr>\n<tr>\n<td><code>X-Lattica-Delivery-Id<\/code><\/td>\n<td>Unique ID per delivery \u2014 log it, dedupe with it<\/td>\n<\/tr>\n<tr>\n<td><code>X-Lattica-Workspace<\/code><\/td>\n<td>Workspace ID<\/td>\n<\/tr>\n<tr>\n<td><code>X-Lattica-Webhook-Id<\/code><\/td>\n<td>The configured webhook endpoint&#8217;s ID<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Task events<\/h2>\n<ul>\n<li><code>task.created<\/code> \u2014 new task<\/li>\n<li><code>task.updated<\/code> \u2014 any field changed; payload includes <code>changes<\/code> object<\/li>\n<li><code>task.deleted<\/code> \u2014 soft-deleted (still recoverable for 30 days)<\/li>\n<li><code>task.completed<\/code> \u2014 moved into a status configured as terminal<\/li>\n<li><code>task.reopened<\/code> \u2014 moved back out of a terminal status<\/li>\n<li><code>task.assigned<\/code> \u2014 assignee set or changed<\/li>\n<li><code>task.unassigned<\/code> \u2014 assignee cleared<\/li>\n<li><code>task.due_soon<\/code> \u2014 fires 24h before due date<\/li>\n<li><code>task.overdue<\/code> \u2014 fires once when due date passes<\/li>\n<\/ul>\n<h2>Project events<\/h2>\n<ul>\n<li><code>project.created<\/code><\/li>\n<li><code>project.updated<\/code><\/li>\n<li><code>project.archived<\/code><\/li>\n<li><code>project.member_added<\/code><\/li>\n<li><code>project.member_removed<\/code><\/li>\n<\/ul>\n<h2>Comment events<\/h2>\n<ul>\n<li><code>comment.created<\/code><\/li>\n<li><code>comment.updated<\/code><\/li>\n<li><code>comment.deleted<\/code><\/li>\n<\/ul>\n<h2>Workspace events<\/h2>\n<ul>\n<li><code>member.invited<\/code><\/li>\n<li><code>member.joined<\/code><\/li>\n<li><code>member.removed<\/code><\/li>\n<li><code>member.role_changed<\/code><\/li>\n<li><code>billing.plan_changed<\/code><\/li>\n<li><code>billing.payment_failed<\/code><\/li>\n<\/ul>\n<h2>Sample: task.updated<\/h2>\n<pre><code>{\n  \"event\": \"task.updated\",\n  \"delivered_at\": \"2026-04-12T10:14:22Z\",\n  \"workspace_id\": \"ws_8FjK4q\",\n  \"actor\": { \"type\": \"user\", \"id\": \"usr_a91kp2\", \"name\": \"Priya Shah\" },\n  \"data\": {\n    \"task\": {\n      \"id\": \"task_d3Bk2e\",\n      \"title\": \"Customer onboarding call \u2014 Acme\",\n      \"status\": \"in_progress\",\n      \"assignee_id\": \"usr_a91kp2\",\n      \"due_date\": \"2026-04-15\"\n    },\n    \"changes\": {\n      \"status\": { \"from\": \"todo\", \"to\": \"in_progress\" }\n    }\n  }\n}<\/code><\/pre>\n<h2>Idempotency<\/h2>\n<p>Webhook deliveries are at-least-once. Use <code>X-Lattica-Delivery-Id<\/code> to dedupe on your side \u2014 store the ID after successful processing and reject duplicates.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Complete reference: payload structure, headers, all event types, sample payload, and idempotency guidance.<\/p>\n","protected":false},"author":0,"featured_media":46,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[7],"tags":[40,56,58,48],"class_list":["post-45","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-api-automations","tag-api","tag-developers","tag-events","tag-webhooks"],"_links":{"self":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/posts\/45","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/types\/post"}],"replies":[{"embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/comments?post=45"}],"version-history":[{"count":0,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/posts\/45\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/media\/46"}],"wp:attachment":[{"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/media?parent=45"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/categories?post=45"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/demo.fasterthemes.com\/mywiki-wordpress-theme\/wp-json\/wp\/v2\/tags?post=45"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}