Skip to content

Overview

The WhatSetter public API lets you connect your CRM and tools to your WhatSetter workspace: push leads into lists, read leads and conversations, send WhatsApp messages through the anti-ban engine, manage campaigns, and receive signed webhooks. An MCP server is also available for AI agents at mcp.whatsetter.com. It uses the same API keys.

Authentication

Every request needs an API key, created from your WhatSetter dashboard (Settings → API) or by your account manager. Pass it as a Bearer token:

Authorization: Bearer ws_live_xxxxxxxxxxxxxxxxxxxx

A key belongs to one workspace (team) and carries scopes. Keep it secret. It is shown once at creation and can be revoked at any time.

Errors

All errors use one envelope:

{ "error": { "code": "validation_error", "message": "…" } }
HTTP code meaning
401 missing_api_key / invalid_api_key key absent, unknown or revoked
403 insufficient_scope key lacks the required scope
404 not_found resource doesn’t exist (or belongs to another workspace)
422 validation_error bad parameter or body
429 rate_limited / quota_exceeded slow down / daily WhatsApp quota reached
500 internal_error our fault, retry later

Rate limits

Requests are limited per workspace (all keys combined), by plan:

Plan Requests / minute
Free 60
Starter 120
Business 300
Scale 1000

Every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset. On 429 rate_limited, honor the Retry-After header. (WhatsApp sending has its own separate daily anti-ban quota: see POST /messages.)

Idempotency

POST /messages is retry-safe: pass an Idempotency-Key header (any unique string ≤200 chars, e.g. a UUID per send intent). A key that already produced a response replays it (with X-Idempotent-Replay: true) instead of sending a second WhatsApp message. A retry fired while the first is still processing gets 409 request_in_flight. If a send times out (502), retrying with the SAME key is safe (it will never double-deliver); retrying WITHOUT a key may. Always use an Idempotency-Key when sending.

Pagination

List endpoints return pagination.has_more and pagination.next_cursor. Pass cursor=<next_cursor> to fetch the next page. limit is 1–100 (default 25).

Information

  • OpenAPI version: 3.1.0

Security scheme type: http

Bearer format: ws_live_…