Email API for Canada
Send and receive email on your own domain
Transactional email out and the replies back in, from the same account and API keys as your SMS. Commercial email goes out only with CASL consent on file, and your data is stored in Canada.

What it is for
The email your application sends, and the replies it gets back.
- Receipts and account email
- Receipts, password resets and notices go out as transactional email, with no consent paperwork.
- Replies and inbound mail
- Customers reply to a receipt or write to a support address, and each message reaches your app over the API as JSON.
- Commercial email, with consent
- Newsletters and offers go out only with CASL consent on file, each to one recipient, with the unsubscribe link added for you.
- Alongside SMS
- The same account, API keys, webhook endpoints and prepaid balance as your text messages.
Sending from your own domain
Add a domain, publish the DNS records the API returns, and send.
- Your domain, verified
- DKIM on your domain and a return path on a send subdomain. Nothing in your root domain's existing mail setup changes.
- One call or a batch
- Send one email to up to 50 recipients across to, cc and bcc, a batch of up to 100 different emails, or one message to up to 500 recipients with their own variables.
- Templates with versions
- Store templates with declared variables. Edits are drafts until you publish, each publish is a numbered version, and rolling back is one call.
- Scheduling
- Schedule a send from 1 minute to 30 days ahead, then move or cancel it while it waits. Cancelling refunds the charge.
- Attachments
- Up to 10 files and 25 MB per email, with the first 2 MB per recipient included. Executable and script files are refused.
- Open and click tracking
- Turn tracking on or off per domain, and get the first open and first click as webhooks.
- Safe retries
- Send an Idempotency-Key header and a retried request returns the original email instead of sending, and charging, twice.
curl -X POST https://api.honkio.ca/v1/emails \
-H "Authorization: Bearer mk_test_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"from": "Acme <onboarding@test.honkio.ca>",
"to": "delivered@test.honkio.ca",
"subject": "Your receipt",
"html": "<p>Thanks for your order.</p>"
}'This runs with a test key before you add a domain: the test sender and address need no DNS, and nothing is delivered or charged.
Receiving email
Inbound email arrives as a webhook and is read over the API, with the key you already send with.
- A managed address, ready now
- Every account gets an inbound address with nothing to set up, and any name before the @ reaches it.
- Or 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.
- Parsed for you
- Each message fires an email.received webhook. Fetch its text, HTML, headers, attachments and SPF, DKIM, DMARC and spam verdicts as JSON, or the raw message.
- Safe to display
- Ask for sanitized HTML, with scripts and unsafe markup removed and remote images held back.
- Reply in the thread
- Send your reply with the In-Reply-To and References headers and it lands in the same thread in the customer's mail app.
- Caps that protect your balance
- Up to 1,000 received messages a day by default. Mail over the cap, mail flagged as a virus and mail your balance cannot pay for is kept as headers only and not charged.
- AI agents, on opt-in
- The MCP server reads the inbox only when you turn that on, and marks every sender-written field as untrusted content.
CASL and deliverability, handled in the API
Email is transactional by default. Marking a send commercial turns on the consent rules.
- A commercial email (is_commercial set to true) needs CASL consent on file for its one recipient. Without it the send is refused with HTTP 451 and nothing is charged.
- Commercial email gets an unsubscribe footer and one-click unsubscribe (RFC 8058). An unsubscribe blocks commercial email to that address; receipts and resets still go through.
- Hard bounces and spam complaints add the address to your suppression list, and no email goes to it again unless you remove it.
- If recent live email bounces or draws complaints at a high rate, live email pauses for 24 hours and a webhook says why. SMS and test keys keep working.
- Consent is recorded once per email address, in the same consent records as your SMS.
CASL and suppressions in the docsHow CASL, PIPEDA and Quebec Law 25 apply
Test mode that behaves like the real thing
Build the whole integration before you touch DNS.
- Send from onboarding@test.honkio.ca with a test key and no domain. Nothing is delivered or charged.
- Send to delivered@, bounced@, complained@ or delayed@test.honkio.ca and watch each outcome arrive as a webhook.
- Simulate an inbound email to your test address, with attachments and verdicts, to build the receiving side first.
Prices in Canadian dollars
From the same prepaid balance as SMS, with no plan, contract or monthly minimum.
- Email sent
- $0.0025 CAD per recipient$2.50 per 1,000 recipients, with 2 MB of attachments included per recipient.
- Email received
- $0.0025 CAD per messageCovers the first 1 MB of each message, then $0.002 per started MB. Mail blocked as a virus or over your daily cap is free.
A recipient refused for consent, an unsubscribe or a suppression costs nothing, and test mode is always free. The managed inbound address is free; you pay only for the messages it accepts.
Where your data is stored
Sent and received email, sending domains, consent records and suppression lists are stored in Canada, in AWS ca-central-1 (Montréal).
Email content is purged 90 days after it is sent or received. The raw message and attachments of received mail are kept for 40 days.
API requests are processed on US-hosted infrastructure before they are stored. The privacy policy lists each case and who processes the data.
SDKs, frameworks and migration
Use the API from the language you already work in.
- SDKs
- Official Node.js, Python and PHP clients for sending email and reading received mail.
- Laravel mail transport
- Add a honkio mailer to config/mail.php and your existing Mailables send through HonkIO.
- MCP server
- Let Claude, Cursor or VS Code send email through the HonkIO MCP server, and read the inbox if you opt in.
- Moving from Resend
- Most integrations change the base URL and the key. The migration guide lists the fields that differ, such as the CASL flag and ISO 8601 scheduling.
Email docs
Each page is in English and French.
Questions
- Do transactional emails need a consent record?
- Not in HonkIO. Email is transactional by default and goes out without a consent record. Set is_commercial to true on anything promotional: HonkIO then requires CASL consent on file, adds the unsubscribe footer and honours one-click unsubscribe.
- Can I receive email without changing my DNS?
- Yes. Every account has a managed inbound address that works with nothing to set up. To receive on your own domain, verify it for sending and publish one MX record, ideally on a subdomain.
- How does received email reach my app?
- Each accepted message fires an email.received webhook with its metadata. Fetch the full message by id as JSON (text, HTML, headers, attachments and authentication verdicts) or download the raw message. Delivery is at least once, so deduplicate on the email id.
- How is email billed?
- Per accepted recipient when you send and per accepted message when you receive, from the same prepaid balance as SMS. A recipient refused before sending is not charged, and test mode is free.
- Will adding my domain affect the email I already get?
- No. Sending uses DKIM on your domain and a return path on a send subdomain, so your root domain's MX records and mailboxes stay as they are. Receiving on your domain is a separate step you turn on.
- What happens if my emails start bouncing?
- Hard bounces and complaints are suppressed automatically. If more than 5% of your last 200 live emails hard bounce (once you have sent at least 50), or more than 0.1% of your last 1,000 draw complaints, live email pauses for 24 hours and you get an account.sending_paused webhook and an email. SMS keeps sending.
- Where is my email stored?
- In Canada, in AWS ca-central-1 (Montréal). Content is purged after 90 days, and the attachments and raw message of received mail after 40. API requests are processed on US-hosted infrastructure before they are stored.
- I use Resend today. How much has to change?
- For most integrations, the base URL and the API key; with the SDK, import Honkio from @honkio/node in place of Resend. The migration guide covers the fields that differ, such as is_commercial for CASL and ISO 8601 scheduling.
Related
- SMS API
Send and receive SMS with Canadian local and toll-free numbers, with CASL consent and STOP replies enforced in the API.
- AI agents and MCP
An MCP server that lets AI agents send SMS, run phone verification, buy Canadian numbers and check CASL consent through HonkIO.
- HonkIO vs US email providers
An email API for Canadian senders: sent and received email stored in Canada, CASL unsubscribe built in, prices in CAD.
- HonkIO vs Resend
HonkIO and Resend compared for email to people in Canada: pricing, receiving email, where data is stored and CASL unsubscribes.
- HonkIO vs SendGrid
HonkIO and Twilio SendGrid compared for email to people in Canada: plans and pricing, receiving email, data residency and unsubscribes.
- HonkIO vs Postmark
HonkIO and Postmark compared for email to people in Canada: pricing in CAD and USD, receiving email, where data is stored and unsubscribes.
- HonkIO vs Mailgun
HonkIO and Mailgun compared for email to people in Canada: USD plans and CAD pricing, inbound routes, US and EU regions, and unsubscribes.
- CASL for developers
What Canada’s anti-spam law asks of the code that sends texts and email: consent, identification, unsubscribes and records.
Try it in test mode first
Test keys work right after sign-up, with no card and no charges.