Features

SMS and email for Canada, from one API

Two products on one account: text messages to and from Canadian mobile numbers, and email sent and received on your own domain. CASL and PIPEDA are enforced inside the API, and your data is stored in Canada, in Montréal (ca-central-1).

01

SMS

Two-way text messaging to Canadian mobile numbers, from Canadian numbers you provision through the API.

Outbound SMS
Send to any Canadian mobile number in E.164 format.
Inbound SMS
Receive inbound messages via webhook. Reply-to threading included.
Test mode
Validate messages without sending. Unlimited test messages.
Idempotency keys
Send an Idempotency-Key header on every request that might be retried: the same key returns the original message instead of sending and charging again.
Delivery receipts
Real-time status: queued → sent → delivered or failed.
Message history
Search and filter sent messages by date, number, or status.
Canadian phone numbers
Local numbers in every province and toll-free numbers Canada-wide (SMS after verification), provisioned through the API in seconds.
Phone verification (OTP)
Send a one-time code and check it: two calls. Codes expire after 10 minutes.
02

Email

Email on your own domain, both ways: receipts, password resets and notices out, and the replies back in. A commercial email goes out only with CASL consent on file.

Transactional by default
Receipts, resets and notices send without consent paperwork. Mark an email commercial and HonkIO requires CASL consent on file, adds the unsubscribe footer and honours one-click unsubscribe.
Your own domain
DKIM and a return path on your domain, verified in minutes. Nothing on your root domain’s mail setup changes.
A receiving address, ready now
Every account gets a managed inbound address with nothing to set up, and any name before the @ reaches it. Each message arrives as an email.received webhook; fetch the body, attachments and SPF, DKIM, DMARC and spam verdicts by id.
Receive on your own domain
Turn on receiving for a domain you already send from and publish one MX record; a subdomain keeps your main mailboxes where they are. Received mail is stored in Canada: bodies for 90 days, the raw message and attachments for 40.
Templates with versions
Store templates with declared variables. Edits save to a draft, publishing creates a numbered version, and rolling back is one call.
Batches and scheduling
Up to 100 emails in one batch call. Schedule a send up to 30 days ahead, then move or cancel it while it waits. Cancelling refunds the charge.
Test mode that behaves like the real thing
Send from a sandbox address to magic recipients and watch deliveries, bounces and complaints arrive as webhooks, before touching DNS.
Suppression and automatic pause
Hard bounces and spam complaints add an address to your suppression list, and no email goes to it again; an unsubscribe blocks commercial email only. If recent live email bounces or draws complaints at a high rate, live sending pauses for 24 hours and a webhook tells you why.
03

Both channels

What SMS and email share: one account, the same compliance rules and one place your data is stored.

Stored in Canada
Text messages, email records, consent and suppression lists are stored in Canada, in Montréal (ca-central-1). One data residency answer covers both channels.
CASL on both channels
Consent is recorded once per phone number or email address. A commercial send with no consent on file is refused before anything is charged.
SMS and email on one account
One prepaid balance in CAD, one set of API keys, one webhook feed for both channels.
One webhook feed
Every SMS and email event, from delivered to bounced, opened or unsubscribed, arrives HMAC-signed on the same endpoints and is retried with backoff.
MCP server and Node SDK
Let Claude, Cursor or Copilot send SMS and email through the HonkIO MCP server, or call both channels from @honkio/node.
Live and test keys
One set of keys for both channels, with scoped permissions, and a key can be limited to specific sending domains. Test keys send nothing and charge nothing.
Audit log and rate limits
Every key action and compliance event is logged immutably, and every account has its own rate limits.
Erasure in one call
Built for PIPEDA and Quebec Law 25: erase a phone number's data in one API call, and email content is purged on its own after 90 days.
04

CASL Consent Management

Consent tracking
Record express and implied consent with full audit trail.
Auto opt-out
STOP/STOPALL/UNSUBSCRIBE/QUIT/END/CANCEL and French ARRET/ARRÊT keywords processed automatically.
Consent expiry
Implied consent auto-expires after 2 years per CASL §10(9).
DNCL checking (coming soon)
Automated CRTC Do Not Call List screening before telemarketing sends is coming soon.
HTTP 451 blocks
Non-compliant sends rejected with legally appropriate status code.
Right to erasure
Scrub message bodies and delete consent, verification and contact records for a phone number; the CASL opt-out itself is kept.
05

Webhooks & Delivery Receipts

Event subscriptions
SMS: message.queued, message.sending, message.sent, message.delivered, message.failed, message.undelivered, message.received. Email: email.queued, email.sent, email.delivered, email.delivery_delayed, email.bounced, email.complained, email.rejected, email.failed, email.opened, email.clicked, email.unsubscribed, email.cancelled, email.rescheduled, email.received, email_domain.verified, email_domain.verification_failed, email_domain.receiving_verified, email_domain.receiving_failed. Account: opt_out.recorded, opt_out.reinstated, consent.double_opt_in_confirmed, account.delivery_warning, account.sending_paused, account.spend_warning, account.inbound_email_capped, account.auto_topup_succeeded, account.auto_topup_paused, phone_number.suspended, phone_number.released, toll_free_verification.changes_requested, toll_free_verification.approved, toll_free_verification.rejected.
HMAC signatures
Every webhook payload is signed with your account secret. Verify authenticity.
Retry logic
Failed webhook deliveries are retried with exponential backoff.
Multiple endpoints
Register multiple webhook URLs per event type.
Delivery logs
Inspect all webhook delivery attempts in your dashboard.
Dead-letter replay
Replay any event that exhausted its three delivery attempts, or drop it, from your dashboard or the API.
06

Authentication & Security

API key types
Live keys (mk_live_...) and test keys (mk_test_...) per account.
Scoped keys
Issue send-only, read-only, or admin-scoped keys.
Key revocation
Rotate or revoke keys anytime without downtime.
Rate limiting
Per-account rate limits with sliding window algorithm.
Audit log
Every key action and compliance event is logged immutably.
Canadian data residency
All auth data stored in Canada (ca-central-1).
07

Developer-First REST API

OpenAPI spec
Full OpenAPI 3.1 spec available for code generation.
Bilingual errors
All error messages returned in EN and FR (Accept-Language).
Structured errors
Consistent error format with code, message, and details fields.
Swagger UI
Interactive API explorer (Swagger UI) at api.honkio.ca/docs.
Idiomatic REST
Standard HTTP methods, status codes, and pagination.
curl-friendly
Designed to be simple enough to test with curl and a Bearer token.
MCP server for AI agents
Let Claude, Cursor or Copilot send SMS, verify numbers and check CASL consent directly. Published on npm, with no SDK to wire up.
08

Canadian Phone Numbers

Number search
Search available Canadian numbers by area code or province.
Instant provisioning
Provision a number via API in seconds. Active immediately.
Number release
Release numbers you no longer need. Billing stops immediately.
Canadian only
Only Canadian area codes accepted. All 60+ NPA codes validated.
Multi-number accounts
Provision as many numbers as your plan allows.
Short codes
Short code (5-6 digit) campaigns available on request.
09

Phone Number Verification (OTP)

OTP via SMS
Send a one-time code to any Canadian number. Configurable length of 4 to 8 digits.
Check endpoint
Submit the code to confirm. The response returns the verified status and attempts remaining.
Expiry & attempt limits
Codes expire after 10 minutes. 5 attempts before lockout.
Test mode support
In test mode the code is always zeros (e.g. 000000). No SMS sent.
Audit trail
All verification requests and outcomes logged immutably.
Simple two-step API
POST /verify to start, POST /verify/{id}/check to confirm. That’s it.

Start sending compliant SMS and email in Canada

Create free account

Test keys work without a card. Read the API docs →