Fig. D16 · Docs › API › Webhook delivery signed, retried, de-duplicated · 10 endpoints per user
Event
  • inbox.new_message
  • inbox.message_failed
  • inbox.read
  • account.status_change
  • account.health_update
  • account.trust_changed
  • account.power_changed
  • account.presence
  • notification.new
POST to your URLpublic http(s), no redirects followed
X-TGP-Event:     inbox.new_message
X-TGP-Delivery:  82a91c75-7446-4ebe-8f79-3013cceaa1d7
X-TGP-Timestamp: 1787308800
X-TGP-Signature: v1=<hex>

{ "id", "type", "created_at",
  "data": { account_id, conversation_id,
            message { direction: in | out },
            conversation { peer_type, muted } } }
verify: v1=HMAC-SHA256(secret, "{timestamp}." + raw_body) must equal X-TGP-Signature; reject timestamps older than a few minutes.
Any 2xx within 10 s delivered · record kept 7 days
Anything else, or timeout retried on the ladder below · same X-TGP-Delivery id, de-duplicate on it
Retry ladderfive consecutive failures switch the endpoint off; turning it back on resets the counter
first try +10 s +1 m +5 m +30 m +2 h failed kept 30 d spacing not to scale
register
POST /api/webhooks with url + events; empty events means all; the response carries the signing secret
durability
webhooks are the durable channel; the Socket.IO stream delivers once and drops what you missed while offline
catch up
GET /api/conversations/{id}/messages?after_msg_id=… closes any gap without re-reading