Poku needs a public URL to forward inbound events to your agent. How you set this up depends on where your agent is running.Documentation Index
Fetch the complete documentation index at: https://docs.pokulabs.com/llms.txt
Use this file to discover all available pages before exploring further.
Step 1: Get a public URL
Option A — Local machine (via ngrok)
If your agent is running on your local machine, use ngrok to create a public tunnel.- Create an account at ngrok.com.
-
After logging in, follow the installation instructions for your operating system. On macOS you can install via Homebrew:
-
Grab your authtoken from the ngrok dashboard and authenticate:
-
Start a tunnel pointed at the port your agent is listening on:
ngrok will output a forwarding URL:Copy this URL — you’ll need it in Step 3.
Option B — VPS (no ngrok needed)
If your agent is hosted on a VPS, it’s already on the public internet — no tunnel required. Recommended: Set up HTTPS using a reverse proxy such as nginx or Caddy with a free Let’s Encrypt certificate. This gives you a clean, secure URL:Step 2: Configure your agent
Set up your agent to accept incomingPOST requests at your chosen path. Poku sends a JSON body for each event. All events share the same wrapper:
message.received
Fired when an inbound SMS, WhatsApp, or Slack message is received on your number or workspace.
| Field | Type | Description |
|---|---|---|
payload.interactionId | string? | Present when the message is a reply to a Poku interaction |
payload.medium | string | Channel the message arrived on: sms, whatsapp, or slack |
payload.from | string | Sender’s phone number or Slack ID |
payload.to | string | Your Poku number or Slack channel that received the message |
payload.body | string | Text content of the message |
payload.mediaUrls | string[]? | Media attachments, if any (MMS) |
form.received
Fired when a recipient submits a form sent via SMS or WhatsApp.
| Field | Type | Description |
|---|---|---|
payload.interactionId | string | ID of the interaction the form belongs to |
payload.values | object | Key-value map of the submitted form fields |
call.conversation.ended
Fired when an outbound call completes.
| Field | Type | Description |
|---|---|---|
payload.interactionId | string | ID of the call interaction |
payload.summary | string | AI-generated summary of the conversation |
payload.from | string | Phone number that placed the call |
payload.to | string | Phone number that received the call |
Using OpenClaw? See the OpenClaw installation guide for the
openclaw.json webhook config.
Step 3: Register your webhook with Poku
Register your public URL from Step 1 with Poku so events get forwarded to your agent. Specify which event types you want to receive:headers field: