Built for the WhatsApp Agent API

Your WhatsApp agent.
Now with webhooks.

WhatsApp gives you long polling. We give you signed webhooks.
Connect your agent, add your endpoint, and get back to building.

From $7 / month · Every feature, every plan

Receive. Reply. Zero polling code.

Illustration: a customer sends your WhatsApp agent a message. Unpoll long-polls the WhatsApp Agent API, stores the message and delivers it to your app as a signed webhook. Your app replies with one API call to Unpoll, which sends the text back, and the customer sees the reply in WhatsApp.

your-app
POST /webhooks/whatsapp incoming
{
  "type": "message.received",
  "data": {
    "from": "user:50972923564215",
    "text": { "body": "Hello agent" }
  }
}
Signature verified · HTTP 204
POST /v1/agents/{id}/messages your reply
{
  "to": "user:50972923564215",
  "text": "Hi! I’m on it. What do you need?"
}
HTTP 200 · WhatsApp accepted
Your logic. Our delivery infrastructure.

Illustrative flow · Webhook delivery runs independently of polling, and replies go out through one API call with a per-agent key.

LESS INFRASTRUCTURE. MORE IDEAS.

Build the agent.
Skip the polling loop.

No always-on worker to babysit. No cursor to recover.
Just an HTTPS endpoint and the code you actually want to write.

  1. 01

    Connect your agent

    Add your WhatsApp Agent API token. Unpoll handles continuous polling and cursor tracking.

    Your token stays encrypted.
  2. 02

    Point us to your code

    Set your HTTPS webhook URL. Incoming messages arrive as signed events.

    Verify. Deduplicate. Acknowledge.
  3. 03

    Make something useful

    Run your logic, send a text reply, or mark a message read. We keep the events moving.

    Follow the quickstart
THE BORING PARTS, TAKEN CARE OF.

Your endpoint has a bad day.
Your events have a plan.

Events are stored before the cursor moves forward. Delivery runs separately, with a clear record of what happened.

Understand the delivery guarantees

Retries, built in.

Up to 8 attempts for eligible failures. Manual redelivery when you need another go.

A history you can follow.

Inspect responses, timing, and failures in your dashboard, with 7-day event history.

Signed. Stable. Verifiable.

HMAC-SHA256 signatures and stable event IDs. At-least-once delivery you can safely deduplicate.

Example deliverymessage.received503 · retry scheduled204 · delivered
FITS THE WAY YOU BUILD.

Receive an event.
Write the next line.

Your language. Your stack. Your bot logic. Reply through one straightforward API, using a per-agent key.

  • Send text replies
  • Mark messages as read
  • Download received media
Explore the API

Built for creator-only messaging on the WhatsApp Agent API. See the boundaries.

A reply, in your languagePOST /messages

Rust

let sent = client
    .post(format!("{base}/v1/agents/{agent_id}/messages"))
    .bearer_auth(api_key)
    .json(&json!({ "to": sender, "text": "Hello!" }))
    .send().await?
    .json::<Value>().await?;

Python

sent = requests.post(
    f"{base}/v1/agents/{agent_id}/messages",
    headers={"Authorization": f"Bearer {api_key}"},
    json={"to": sender, "text": "Hello!"},
).json()

Go

payload, _ := json.Marshal(map[string]string{"to": sender, "text": "Hello!"})
req, _ := http.NewRequest("POST", url, bytes.NewReader(payload))
req.Header.Set("Authorization", "Bearer "+apiKey)
req.Header.Set("Content-Type", "application/json")
response, _ := client.Do(req)

Node.js

const response = await fetch(url, {
  method: "POST",
  headers: { Authorization: `Bearer ${apiKey}`,
             "Content-Type": "application/json" },
  body: JSON.stringify({ to: sender, text: "Hello!" }),
});
const { message_id } = await response.json();

cURL

curl "$BASE_URL/v1/agents/$AGENT_ID/messages" \
  -H "Authorization: Bearer $UNPOLL_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"to":"user:50972923564215","text":"Hello!"}'
Illustrative request · excerptSee reply API →
SMALL START. ROOM TO GROW.

More agents.
Same peace of mind.

Every feature on every plan. Just choose your agent count.

Solo

A great place to start

Build your first integration.

$7/ month
1 connected agent
Choose Solo
  • Managed polling & signed webhooks
  • Automatic retries & manual redelivery
  • 7-day event & delivery history
  • Text replies, read receipts & media downloads

Builder

Run a few bots and projects.

$19/ month
Up to 5 connected agents
Choose Builder
  • Managed polling & signed webhooks
  • Automatic retries & manual redelivery
  • 7-day event & delivery history
  • Text replies, read receipts & media downloads

Studio

Manage more agents in one workspace.

$79/ month
Up to 25 connected agents
Choose Studio
  • Managed polling & signed webhooks
  • Automatic retries & manual redelivery
  • 7-day event & delivery history
  • Text replies, read receipts & media downloads

Prices in USD, billed monthly. All plans include every feature.

A FEW GOOD QUESTIONS.

Before you
plug it in.

All the details in the docs
Why do I need Unpoll?

The WhatsApp Agent API exposes updates through long polling. Unpoll runs that loop for you, stores new events, and sends signed webhooks to your app. You build the agent’s behavior without maintaining a polling worker.

Can my agent message anyone?

No. The WhatsApp Agent API supports creator-only messaging: an agent can message only the person who created it. Unpoll supports text replies, read receipts, and downloads of received media. It does not send media or provide broadcast messaging.

What happens if my endpoint goes offline?

Polling continues independently. Eligible failed deliveries retry up to 8 attempts; without Retry-After, persistent errors typically exhaust those attempts in roughly 1 to 3.5 minutes. For longer outages, manually redeliver retained failures from the dashboard. Read the retry policy.

Will I receive older messages when I connect?

Only updates timestamped after activation are eligible. Resuming a paused agent sets a new cutoff, so paused-period messages are skipped. Set up your webhook before messaging the agent: events received without an enabled endpoint are not backfilled. See the integration limits.

A LITTLE LESS POLLING. A LOT MORE BUILDING.

Good ideas deserve
less infrastructure.

Connect your first agent Or take a look at the integration guide