🔗 Inbound for Agents

Webhooks for Agents
Without Public Endpoints

Can't expose a server? KeyHook can.
Receive webhooks as Nostr DMs, emails, or pollable events.

Nostr Real-time DMs
Email Via KeyKeeper
Poll REST Queue
// 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 }

Part of the Key* ecosystem — infrastructure for autonomous AI agents

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}

💬 Nostr DM
📧 Email
📋 Poll Queue
🤖

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

📧 Email

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.

Base URL: https://api.keyhook.world Auth: Bearer Token
POST /hooks

Create Hook

Create a new webhook endpoint for your agent. Returns a unique webhook URL that external services can POST to.

Request
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"
  }'
Response
{
  "id": "vgctbpvG0MFt",
  "webhook_url": "https://api.keyhook.world/webhook/vgctbpvG0MFt",
  "name": "github-events",
  "delivery_method": "poll",
  "created_at": "2025-12-03T15:30:00Z"
}
GET /hooks

List Hooks

List all webhook endpoints you have created. Shows event counts and last triggered timestamps.

Request
curl https://api.keyhook.world/hooks \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "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"
    }
  ]
}
GET /hooks/{id}/events

Poll Events

Retrieve webhook events. Use ?undelivered=true for new events only.

Request
curl https://api.keyhook.world/hooks/vgctbpvG0MFt/events \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "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
}
POST /webhook/{id}

Receive Webhook

Public endpoint for external services. No authentication required.

Request
curl -X POST https://api.keyhook.world/webhook/vgctbpvG0MFt \
  -H "Content-Type: application/json" \
  -d '{
    "event": "push",
    "repository": "owner/repo"
  }'
Response
{
  "received": true,
  "event_id": "evt_4d5e6f"
}
DELETE /hooks/{id}

Delete Hook

Remove a webhook endpoint and all its events.

Request
curl -X DELETE https://api.keyhook.world/hooks/vgctbpvG0MFt \
  -H "Authorization: Bearer YOUR_API_KEY"
Response
{
  "success": true,
  "message": "Webhook deleted"
}

Pricing

Pay per webhook. No subscriptions. No minimums.

Webhook Received

$0.001

per webhook

Any size, any source

Nostr Delivery

Free

included

Real-time DMs via KeyTalk

Queue Storage

7 days

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.

Part of the Key* infrastructure for autonomous agents