SMS

Pricing and limits

What each SMS, verification and number costs, read at runtime, and the sending limits that keep bulk marketing off the platform.

Pricing

Prices are set at runtime and can change without a release, so read them rather than hardcoding them. Each field's name gives its unit: the _cents fields are CAD cents, the _millicents fields (email and push) are CAD millicents, thousandths of a cent, and the auth_plans overage_tenth_cents_per_user is tenths of a cent. Sending is billed per segment: message_cost_cents × the segments the carrier splits the body into. Segments are counted the way the carrier counts them: typographic quotes, dashes and ellipses are smart-encoded to GSM-7 (160 characters, then 153 per segment), while emoji and most accented letters force Unicode segments (70, then 67). The charge is settled to the carrier's segment count after the send. A message the carrier rejects outright costs nothing, and so does a send to a reserved exchange (555-XXXX and similar), which is refused here; a message the carrier accepts but cannot deliver keeps its charge. A body over 10 segments is refused with 422 MESSAGE_TOO_LONG before any charge. verification_cost_cents covers a typical one-segment OTP; a long or non-GSM app_name can add a segment. phone_number_activation_fee_cents is the one-time fee on a local number, charged together with the first month and not refunded on release. For a toll-free number, phone_number_tollfree_monthly_cost_cents is the monthly rent and phone_number_tollfree_activation_fee_cents the one-time activation fee, 0 when there is none (its search result shows the same as activation_fee_cents); tollfree_verification_fee_cents is the one-time fee per toll-free verification application, paid by card when it is first submitted. inbound_message_cost_cents is charged per segment of every SMS received on a provisioned number, sender and carrier included, except STOP, START and HELP keywords; a received message is debited even if it takes the balance below zero, which pauses sending until the next top-up.

bash
# Current prices. Public: no API key needed.
# SMS, verification and number prices are CAD cents; email and push
# prices are CAD millicents (thousandths of a cent: 250 is $0.0025, or
# $2.50 per 1,000); an auth plan's overage is tenths of a cent per user
# (25 is $0.025).
# The email_* fields appear while email is available, push_* while push is.
curl https://api.honkio.ca/v1/pricing

# Response 200:
# {
#   "message_cost_cents": 3,
#   "verification_upcharge_cents": 25,
#   "verification_cost_cents": 28,
#   "phone_number_upfront_cost_cents": 250,
#   "phone_number_monthly_cost_cents": 250,
#   "phone_number_activation_fee_cents": 100,
#   "phone_number_tollfree_monthly_cost_cents": 9900,
#   "phone_number_tollfree_activation_fee_cents": 0,
#   "tollfree_verification_fee_cents": 49900,
#   "inbound_message_cost_cents": 3,
#   "email_price_millicents": 250,
#   "email_attachment_included_bytes": 2097152,
#   "email_attachment_price_millicents_per_mb": 200,
#   "email_attachment_max_bytes": 26214400,
#   "email_inbound_price_millicents": 250,
#   "email_inbound_included_bytes": 1048576,
#   "email_inbound_price_millicents_per_mb": 200,
#   "push_price_millicents": 50,
#   "push_free_monthly": 0,
#   "auth_plans": {
#     "free": { "fee_cents": 0, "included_users": 250, "overage_tenth_cents_per_user": null },
#     "pro": { "fee_cents": 4900, "included_users": 2500, "overage_tenth_cents_per_user": 25 },
#     "business": { "fee_cents": 24900, "included_users": 10000, "overage_tenth_cents_per_user": 20 }
#   }
# }

Test-mode requests are priced identically in the response but never charged, so you can see what an integration would cost before spending anything.

Toll-free numbers send and receive at the same price per segment as local ones. Before one can send SMS, it needs a one-time verification: $499.00 per application, paid by card rather than from your balance. See Toll-free numbers.

Sending limits

HonkIO is built for transactional and relationship messaging, not campaigns, and every customer’s deliverability rides on a shared carrier profile. These limits keep bulk marketing off the platform; a clinic, a contractor or a SaaS sending codes will not notice them. The sending limits apply to live mode only; the link-shortener rule, the reserved and undeliverable destination checks, and the broadcast group-size cap run in both modes.

  • Daily cap: new accounts can send 250 live messages per rolling 24 hours. It does not lift on its own. 30 days after your first live message you can request a higher volume from the dashboard; approval sets 1,000 a day or the figure you asked for. Refused sends return 429 DAILY_LIMIT_REACHED with your limit and count. The request needs a verified business (see Business verification below).
  • Identical messages: the same body may reach at most 250 distinct recipients per 24 hours (429 FANOUT_LIMIT_REACHED). Personalized messages are unaffected.
  • Per-number rate: a 10-digit number sends 10 segments a minute, the pace the carrier sends them at, so a 3-segment message takes three of them. A send is refused while a full minute’s worth of segments or more is already waiting (429 NUMBER_RATE_LIMITED with Retry-After). A verified toll-free number sends up to 1,200 segments a minute. A contact-group broadcast skips this rate, but may not put more than 1,200 segments in a 10-digit number’s queue (429 NUMBER_QUEUE_FULL); toll-free numbers have no such cap.
  • Broadcasts: up to 250 recipients per contact-group broadcast and 3 broadcasts per 24 hours (422 BROADCAST_TOO_LARGE, 429 BROADCAST_LIMIT_REACHED).
  • Toll-free numbers: sends from a verified toll-free number have their own limits, counted apart from sends from your local numbers, so neither uses up the other. There is no probation: 10,000 live messages per rolling 24 hours (less if HonkIO has held your account below its approved daily limit), the same body to up to 2,500 distinct recipients, and contact-group broadcasts of up to 2,500 recipients, 30 per 24 hours. A refusal says which limit was hit (details.tier is toll_free or local). The per-recipient cap, the automatic pause, the link-shortener rule and the top-up caps are the same for both.
  • Link shorteners (bit.ly, tinyurl and similar) are refused in both modes because carriers filter them (422 LINK_SHORTENER_BLOCKED). Use the full URL.
  • Delivery warning, then automatic pause: if more than 10% of your last 50 live messages fail at the carrier, you are emailed (and account.delivery_warning fires) without any pause. If, over your recent sends, more than 1% of recipients opt out (at least five people; a STOP reply and an opt-out you record yourself both count) or more than 5% of messages are rejected by carriers, live sending pauses for 24 hours and you are emailed (403 SENDING_PAUSED with the resume time; account.sending_paused fires).
  • Top-ups: the balance cannot exceed $500 and top-ups are limited to $1,000 per 30 days. A verified business can request higher limits.
  • Per-recipient cap: 30 messages to one recipient per hour and 100 per 24 hours (429 RECIPIENT_RATE_LIMITED with Retry-After). A two-way conversation never gets near it; a script retrying one number does.
  • Undelivered messages are billed: a message the carrier accepts but cannot deliver keeps its charge. A reserved exchange (555-XXXX, N11 exchanges such as 411 or 911, carrier test codes, exchanges starting with 0 or 1) is refused for free with 422 RESERVED_DESTINATION, in test mode too, and a reserved area code (555, 911 and the like) as non-Canadian. Anything that retries should send an Idempotency-Key header so a retry can never become a second charge. An hour of unusual spend triggers an email and account.spend_warning.
  • Undeliverable numbers: after 3 consecutive carrier failures to one number within 30 days, from any HonkIO customer, sends to it are refused without charge (422 UNDELIVERABLE_NUMBER with the failure count, when it was listed and when it expires) for 90 days, then retried in case the number was reassigned.
  • Inbound cap: each account can receive at most 1,000 segments per rolling 24 hours by default, a long text counting as several (support can raise it). Texts past the cap are recorded without their content, not charged, and fire no message.received; the first one in a window sends account.inbound_sms_capped. STOP, START and HELP are always processed.

Sending to a list works through the per-number pace with an example and shows how to handle 429 refusals and retries.

bash
curl https://api.honkio.ca/v1/send-limit \
  -H "Authorization: Bearer mk_live_YOUR_KEY"

# → { "daily_limit": 250, "sent_last_24h": 12, "remaining": 238,
#     "recipient_rate_per_hour": 30, "recipient_rate_per_day": 100,
#     "probation": { "ends_at": "2026-09-26T14:02:11.000Z", "eligible_to_request": false },
#     "paused_until": null, "requests": [] }

Read your current limits and usage with GET /v1/send-limit, and file a request with POST /v1/send-limit/requests. Every figure above is a platform default that can be raised per account.

Auto top-up

Auto top-up charges your saved card and credits your balance without a manual top-up. Turn it on from the billing page in the dashboard: you choose a low-balance threshold and an amount, and the first top-up saves the card for later charges.

  • It triggers when your balance falls below your threshold, and in the 24 hours before monthly number rent is due if your balance would not cover it. The smallest threshold is $5.00 and the smallest amount is $10.00. The amount must be at least as much as the threshold, so one top-up brings your balance back above it.
  • Your balance is checked about once a minute, so a burst of sending can still reach $0 between checks. Pick a threshold that leaves room for your peak sending.
  • Each charge counts toward your top-up limits (maximum balance and 30-day total). A charge that would exceed them is skipped, and the dashboard says so.
  • If we can’t charge your card, auto top-up pauses and we email you. It also pauses when one of your payments is refunded, and after 3 charges in 24 hours. A manual top-up does not turn it back on. To resume, use Top up to resume in the Auto top-up section of the Billing page, which is a new top-up that saves your card again. If your account is under review, auto top-up stays paused until HonkIO support lifts it, and a top-up does not resume it. GET /v1/auto-topup returns your settings and recent attempts, and the account.auto_topup_succeeded and account.auto_topup_paused webhook events report each result.

Business verification

Requests for more phone numbers, a higher sending volume, higher top-up limits and toll-free verification are open to verified businesses. Verification is free: fill in your business and a contact person under Settings, Business verification (or PUT /v1/business-verification, then POST /v1/business-verification/submit), and our team checks them against public registries and your website, usually within a few business days.

  • Sole proprietors can verify without a CRA business number: give your legal name, the name you trade under, your address, a public link that shows your work and a sentence on what you do. Every other kind of organization needs its business number, and toll-free verification always does.
  • Until then, the request routes answer 403 BUSINESS_VERIFICATION_REQUIRED; a toll-free submission from a verified profile with no business number answers 403 BUSINESS_NUMBER_REQUIRED.
  • Request higher top-up limits with POST /v1/account/topup-cap-requests or from Billing. Limits already granted stay if a verification is later revoked. A verified business can change its details at any time: the changes go back to HonkIO for review, and the business stays verified, as HonkIO verified it, until the review ends (verified stays true on GET /v1/business-verification, and verified_details keeps the details HonkIO verified, which toll-free verification uses).