Blog

HonkIO now sends email, on the account you already have

Transactional email from your own domain, with CASL built in, records stored in Canada and pricing in CAD: $0.002 per recipient. Same account, same API keys and same balance as your SMS.

HonkIO started as an SMS API for Canadian senders. From today it sends email too: receipts, password resets, alerts and account notices, from your own domain, on the account you already use for SMS.

What made the SMS side worth using carries over. Your data is stored in Canada, the API enforces CASL instead of leaving it to a checklist, and you pay in Canadian dollars from the same prepaid balance.

Stored in Canada

Email is sent from Montréal (ca-central-1), and your email records are stored in Canada with the rest of your account data. Consent checks, delivery events and suppression lists live in the same region. Once an email leaves for delivery it travels to the recipient's own mail server, wherever that is; the privacy policy has more on how HonkIO handles your data.

CASL, built in

Email is transactional by default, and transactional email needs no consent record. Mark an email as commercial and three things change:

  • It goes to exactly one recipient, and it is refused with HTTP 451 unless CASL consent is on file for that address
  • HonkIO adds an unsubscribe footer and a one-click unsubscribe header that mail clients honour
  • An unsubscribe stops commercial email to that address from then on, while receipts and password resets still reach it

Hard bounces and spam complaints add the address to your suppression list automatically, so a dead or unhappy address stops getting email without you writing that logic yourself. This is how the API applies CASL, not legal advice about your own messages.

One account, one bill

Email costs $0.002 CAD per recipient, which is $2.00 per 1,000, attachments included. It comes out of the same prepaid balance as your SMS, with no monthly fee, so a quiet month costs only what you send. Each accepted recipient is billed once, To, CC and BCC alike, and a recipient the compliance check refuses is not billed.

The same API keys work for both channels, and email events arrive on the same signed webhook feed as SMS events. If you are weighing HonkIO against a US email provider, honkio.ca/compare/us-email-providers covers what changes, and when a US provider is still the better choice.

Try it before touching DNS

Test keys send nothing and charge nothing, but they run the same checks and fire the same webhooks as a live key. Send from onboarding@test.honkio.ca to delivered@, bounced@, complained@ or delayed@test.honkio.ca and watch each outcome arrive, before you have set up a domain at all.

Stored templates, the @honkio/node SDK and our MCP server come with it. Templates are edited as drafts and published as numbered versions you can roll back. The MCP server's 15 email tools appear for accounts with email enabled, so an agent can send an email, check a domain or look up a suppression the same way it already handles SMS.

Send your first email

Add a domain or subdomain you control, publish the DNS records the API returns (a DKIM key, and a return path on a send. subdomain), then ask HonkIO to check them:

sh
curl -X POST https://api.honkio.ca/v1/email-domains \
  -H "Authorization: Bearer mk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "domain": "mail.acme.ca" }'

# Publish the returned records at your DNS host, then check them:
curl -X POST https://api.honkio.ca/v1/email-domains/DOMAIN_ID/verify \
  -H "Authorization: Bearer mk_live_YOUR_KEY"
# → { "status": "verified", "verified": true, "missing": [] }

Once the domain is verified, send from any address on it with a live key. With curl:

sh
curl -X POST https://api.honkio.ca/v1/emails \
  -H "Authorization: Bearer mk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "Acme Receipts <receipts@mail.acme.ca>",
    "to": "ada@example.com",
    "subject": "Your receipt for order 1042",
    "html": "<p>Thanks for your order.</p>"
  }'
# Response 201: { "id": "cm...", "status": "queued", "scheduled_at": null }

Or with the Node SDK, where every call resolves to data or error instead of throwing:

ts
import { Honkio } from '@honkio/node'

const honkio = new Honkio(process.env.HONKIO_API_KEY)

const { data, error } = await honkio.emails.send({
  from: 'Acme Receipts <receipts@mail.acme.ca>',
  to: 'ada@example.com',
  subject: 'Your receipt for order 1042',
  html: '<p>Thanks for your order.</p>',
})

if (error) console.error(error.name, error.message)
else console.log(data.id)

The email docs at honkio.ca/docs/email cover batches, scheduling, attachments, templates, webhooks and every error code, plus a migration guide if you are moving an existing integration.

Send your first message this afternoon.