Webhooks for Agents
Without Public Endpoints
Can't expose a server? KeyHook can.
Receive webhooks as Nostr DMs, emails, or pollable events.
// 1. Create a hook (returns webhook URL)
POST https://api.keyhook.world/hooks
→ "webhook_url": "https://api.keyhook.world/webhook/vgctbpvG0MFt"
// 2. External service hits your webhook
POST /webhook/vgctbpvG0MFt
{ "event": "payment.received", "amount": 50000 }
// 3. Agent polls for events
GET /hooks/vgctbpvG0MFt/events
→ { "events": [...], "count": 1 } Why KeyHook?
Inbound webhooks when you can't run a server
Unique Webhook URL
Get a dedicated endpoint. Configure any service to POST there — GitHub, Stripe, KeySpark, anything.
Nostr Delivery
Receive webhooks as encrypted Nostr DMs via KeyTalk. Real-time, decentralized, no polling needed.
Email Fallback
Get webhook payloads delivered to your KeyKeeper inbox. Perfect if you check email periodically.
Pollable Queue
Can't do real-time? Poll the REST API for pending events. Simple GET request, FIFO queue.
Signature Verification
We verify webhook signatures from known providers (GitHub, Stripe, etc.) before forwarding.
Agent-First
No browser needed. Register via API, configure via API, receive via API. Built for machines.
How It Works
From webhook to agent in 3 delivery modes
External Service
GitHub, Stripe, KeySpark, or any webhook sender
KeyHook
api.keyhook.world/webhook/{id}
Your Agent
Receives event, no public endpoint needed
💬 Nostr (Recommended)
Instant delivery via encrypted DM to your agent's npub. Subscribe to the KeyTalk relay and receive webhooks in real-time.
wss://relay.keytalk.world Webhook payload delivered to your KeyKeeper inbox as a structured email. Great for agents that batch-process.
[email protected] 📋 Poll Queue
Events stored in a FIFO queue. Your agent polls periodically. Simple, reliable, no real-time connection needed.
GET /hooks/{id}/events API Reference
Simple REST API. Create hooks, poll events, done.
/hooks Create Hook
Create a new webhook endpoint for your agent. Returns a unique webhook URL that external services can POST to.
curl -X POST https://api.keyhook.world/hooks \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "github-events",
"description": "GitHub webhook receiver",
"delivery_method": "poll"
}' {
"id": "vgctbpvG0MFt",
"webhook_url": "https://api.keyhook.world/webhook/vgctbpvG0MFt",
"name": "github-events",
"delivery_method": "poll",
"created_at": "2025-12-03T15:30:00Z"
} /hooks List Hooks
List all webhook endpoints you have created. Shows event counts and last triggered timestamps.
curl https://api.keyhook.world/hooks \
-H "Authorization: Bearer YOUR_API_KEY" {
"hooks": [
{
"id": "vgctbpvG0MFt",
"webhook_url": "https://api.keyhook.world/webhook/vgctbpvG0MFt",
"name": "github-events",
"event_count": 42,
"last_triggered_at": "2025-12-03T22:33:01Z"
}
]
} /hooks/{id}/events Poll Events
Retrieve webhook events. Use ?undelivered=true for new events only.
curl https://api.keyhook.world/hooks/vgctbpvG0MFt/events \
-H "Authorization: Bearer YOUR_API_KEY" {
"events": [
{
"id": "evt_1a2b3c",
"method": "POST",
"headers": { "content-type": "application/json" },
"body": { "event": "push", "repo": "owner/repo" },
"received_at": "2025-12-03T15:30:00Z"
}
],
"count": 1,
"has_more": false
} /webhook/{id} Receive Webhook
Public endpoint for external services. No authentication required.
curl -X POST https://api.keyhook.world/webhook/vgctbpvG0MFt \
-H "Content-Type: application/json" \
-d '{
"event": "push",
"repository": "owner/repo"
}' {
"received": true,
"event_id": "evt_4d5e6f"
} /hooks/{id} Delete Hook
Remove a webhook endpoint and all its events.
curl -X DELETE https://api.keyhook.world/hooks/vgctbpvG0MFt \
-H "Authorization: Bearer YOUR_API_KEY" {
"success": true,
"message": "Webhook deleted"
} Pricing
Pay per webhook. No subscriptions. No minimums.
Webhook Received
per webhook
Any size, any source
Nostr Delivery
included
Real-time DMs via KeyTalk
Queue Storage
retention
Then auto-deleted
Fund your KeyKeeper account via Lightning or on-chain. All Key* services share the same balance.
Ready to receive webhooks without running a server?
Join the Key* ecosystem. Get the inbound you need.