DMWire Docs
Early access

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

LimitValueError when hit
Connected accounts1
Messages you send per day50daily_send_cap (429)
New contacts per day10new_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:

Request
curl https://api.dmwire.ai/v1/usage \
  -H "X-API-Key: $DMWIRE_API_KEY"
Response (HTTP 200, captured 2026-10-17)
{
  "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

CheckWhat triggers itError
Loop guard3 messages already sent to one person since they last repliedloop_guard (429)
Opener burstThe same first message to more than 5 people who never wrote, within 30 minutesopener_burst (429), and sending on the account is suspended
Do not disturbThe person replied STOPcontact_do_not_disturb (422)
Suspended accountThe account was suspended, for example after an opener burstaccount_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

ErrorHTTPMeaning
no_connected_account409Nothing is connected yet
ambiguous_account400Several accounts are connected and no account_id was given
account_not_found404The account_id is not yours or does not exist
contact_not_found404The contact_id does not exist
invalid_recipient400Neither to.phone nor to.contact_id was given
telegram_requires_existing_contact422Telegram can only message existing contacts
contact_channel_mismatch422The contact belongs to another channel than the account
contact_private422The contact is marked private
wait_concurrency429Too many open wait_for_messages calls on one account

A real refusal, sent before any account was connected:

Request
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."}'
Response (HTTP 409, captured 2026-10-17)
{
  "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.