Limits and account safety
Your agent can send fast. Messaging apps punish accounts that do. DMWire sits in between and refuses sends that look like spam, before the app takes your number away. These limits are server side: no setting turns them off.
Daily limits in early access
| Limit | Value | Error when hit |
|---|---|---|
| Connected accounts | 1 | |
| Messages you send per day | 50 | daily_send_cap (429) |
| New contacts per day | 10 | new_contact_cap (429) |
Days are UTC days. A new contact is someone who has never written to the account. Check what is left with get_usage:
curl https://api.dmwire.ai/v1/usage \
-H "X-API-Key: $DMWIRE_API_KEY"{
"plan": "free",
"status": "active",
"day": "2026-10-17",
"sends": 0,
"sends_cap": 50,
"new_contacts": 0,
"new_contacts_cap": 10,
"accounts_total": 0,
"accounts_connected": 0,
"accounts_cap": 1
}list_accounts shows the same numbers per account, with ramp_day for a WhatsApp number's warm up.
The WhatsApp warm up
A freshly linked WhatsApp number cannot start chats with new contacts on its first two active days. After that its new contact allowance grows by about one a day until it reaches the early access cap of 10. Replies to people who wrote first are not limited by the warm up. See WhatsApp.
Safety checks on every send
| Check | What triggers it | Error |
|---|---|---|
| Loop guard | 3 messages already sent to one person since they last replied | loop_guard (429) |
| Opener burst | The same first message to more than 5 people who never wrote, within 30 minutes | opener_burst (429), and sending on the account is suspended |
| Do not disturb | The person replied STOP | contact_do_not_disturb (422) |
| Suspended account | The account was suspended, for example after an opener burst | account_suspended (403) |
The loop guard catches two agents talking to each other, or an agent stuck in a retry loop. The opener burst stop exists because that pattern is what gets WhatsApp numbers banned; suspending sends on the account protects the number. A suspended account stays suspended until we review it. To ask for a review, use the form on dmwire.ai with the email your invite went to, and we get back to you.
Other refusals your agent may see
| Error | HTTP | Meaning |
|---|---|---|
no_connected_account | 409 | Nothing is connected yet |
ambiguous_account | 400 | Several accounts are connected and no account_id was given |
account_not_found | 404 | The account_id is not yours or does not exist |
contact_not_found | 404 | The contact_id does not exist |
invalid_recipient | 400 | Neither to.phone nor to.contact_id was given |
telegram_requires_existing_contact | 422 | Telegram can only message existing contacts |
contact_channel_mismatch | 422 | The contact belongs to another channel than the account |
contact_private | 422 | The contact is marked private |
wait_concurrency | 429 | Too many open wait_for_messages calls on one account |
A real refusal, sent before any account was connected:
curl \
-X POST https://api.dmwire.ai/v1/messages \
-H "X-API-Key: $DMWIRE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"to": {"phone": "+31612345678"}, "text": "Hi Ana, your order is ready for pickup."}'{
"error_code": "no_connected_account",
"error": "No connected WhatsApp or Telegram account"
}Every daily limit refusal carries retry_after_s, the seconds until the limit resets. A good agent tells you about the refusal instead of retrying.
Webhooks for limits
If you use webhooks, account.limit_reached fires the first time a daily limit is hit, and account.restricted when an account is stopped from sending.
Last checked against the live service on 2026-10-17.