AXME
Stop building webhook infrastructure — migrate to intent lifecycle in a weekend
HMAC, idempotency, backoff, and DLQ for every integration pair — or one durable intent with delivery modes you choose per client.
Step-by-step guide to replacing webhook endpoints, polling loops, and retry middleware with AXME's durable intent model.
Every backend team eventually builds the same stack: HMAC verification, idempotency keys, exponential backoff, dead-letter queues, and a reconciliation job when callbacks arrive twice. That is 200+ lines per integration pair — before you count polling loops and status tables for long-running work.
MIGRATE
Webhooks → AXME concept map
Concept mapping for migration planning.
| Capability | Webhooks | AXME |
|---|---|---|
Durable execution Resume after crash or deploy. | Build your own | ✓Native intent lifecycle |
Native HITL Human approvals without glue. | Custom per gate | ✓8 task types built in |
Fleet governance Observe and stop agents. | Cobble observability | ✓Mesh control plane |
Open protocol No vendor lock-in. | Varies | ✓AXP open source |
LLM-friendly Non-deterministic code OK. | Often blocked | ✓Yes |
Time to production Prototype to durable ship. | Months | ✓Days |
TRADE-OFFS
What you gain — and what you give up.
Honest evaluation before cutover.
Webhook endpoint
→ Delivery mode (stream, poll, push, inbox).
Polling loop
→ WAITING_FOR_TOOL / durable wait.
Retry + DLQ
→ Intent lifecycle policies.
Idempotency table
→ Intent dedupe at submit.
MIGRATION PATH
Recommended phases.
Parallel running before full cutover.
1. Inventory
List webhook pairs, pollers, and shared state tables.
2. Pilot intent
One flow: submit + wait instead of callback URL.
3. Parallel run
AXME and legacy webhooks both active; compare audit.
4. Retire endpoints
Delete per-workflow routes; keep external ingress as signals only.
Webhook retry stack → one intent
DIY webhooks
@app.post("/webhooks/orders")
def receive(req):
verify_hmac(req) # + idempotency table
process_order(req.json())
# sender: backoff, jitter, DLQ...AXME
intent_id = client.send_intent({
"intent_type": "intent.order.process.v1",
"payload": {"order_id": "ORD-142"},
})
result = client.wait_for(intent_id)Migration FAQ
- Can I run AXME alongside existing webhooks?
- Yes — parallel running is the recommended first phase; retire endpoints when intent history is trusted.
- What about systems that only support webhooks?
- Use push delivery — AXME handles retry and signing; you implement one handler, not a farm per workflow.
- Do receivers still need HTTP servers?
- Only if they choose push — stream, poll, and inbox modes avoid receiver-side endpoints.
Related resources
Ship your first durable agent — in under 10 minutes.
Free tier. No credit card. Self-host or hosted — your choice.