Skip to main content
Hiveku has a Resend-compatible API at https://app.hiveku.com/api/v1/email/resend. An app built on Resend’s SDK or REST API moves to Hiveku by changing its API key and base URL. The requests and answers are Resend’s, and every email runs the same checks as Hiveku’s own REST API.

Before you switch

1

Verify your domain in Hiveku

Add the domain you send from and publish its records. Keep Resend’s DNS records until the switch is done: Hiveku’s records sit beside them. See Moving from another provider.
2

Create a key

Create a Production key in Settings > API Keys. Add Read Emails only if your app calls emails.get. See API keys.
3

Recreate your webhooks

Add your endpoint as a Hiveku webhook. The event names match Resend’s, Hiveku sends the same signature headers, and an event’s data carries the same email_id, from, to, subject and tags. Give your handler Hiveku’s signing secret, and check any other field it reads.
4

Bring over your suppressions

Hiveku suppresses an address on its own after a hard bounce or a spam complaint, but it does not know who bounced, complained or unsubscribed at Resend. Add those addresses before you switch. See Suppressions.

Switch

Set two environment variables:
Your code does not change:
The Resend SDK reads RESEND_BASE_URL once, when it is first imported. Set it in the environment the app starts with, not in code after the import. Hiveku tests this with the resend package, version 6.
If you call Resend’s REST API yourself, send the same requests to the Hiveku base URL:
Try it with a test key (hk_test_...) first. The answer adds a warning that nothing was delivered:

What works

The fields of an email:
  • from, to, cc, bcc, at most 50 recipients in all
  • subject, html, text, and react, which the SDK turns into html before it calls Hiveku
  • replyTo
  • headers, of which only some are delivered: see Headers
  • tags, as Resend’s list or as an object: see Tags
  • attachments, with content (base64 text or a Buffer), filename, contentType and contentId, 25 MB in all
  • idempotency keys (idempotencyKey in the SDK, the Idempotency-Key header), kept 24 hours
A Buffer travels as JSON at about 3.6 times its size, and a request may be at most 50 MB. For a large file, send base64 instead: content: buffer.toString("base64").

What is refused

Hiveku refuses what it cannot honor, rather than sending something else: In a batch, these refuse the whole batch under strict validation. Under permissive, the refused email is listed in errors and the others go. Resend’s contacts, audiences and broadcasts have no compatible API here. Hiveku’s marketing email has its own audiences and campaigns.

Differences to know

  • Warnings. An answer may add warnings: what Hiveku left out, such as a header it does not deliver or a reserved tag, or what it did not deliver. The SDK hands the field back in data.
  • Suppressed recipients. An email whose every recipient is suppressed is not sent, but it is recorded and answered with its id and a warning. It reads back with last_event: "suppressed".
  • Headers. Only some headers are delivered. See Headers.
  • Reserved tags. Tags named channel or campaign_id, or starting with hiveku_, are dropped with a warning.
  • Limits. Rates and monthly emails follow your Hiveku plan. A 429 carries Retry-After. See Limits.
  • Old keys. A Resend key (re_...) left in place is refused with 401 invalid_api_key, and the message says to use a Hiveku key.

Errors

Errors come in Resend’s shape, { "statusCode": 422, "name": "missing_required_field", "message": "Missing required field: subject" }. Resend clients branch on name:

Suppressions

Add each address that bounced, complained or unsubscribed at Resend with POST /api/v1/email/suppressions:
It takes one address per request, answers 201, and answers 409 already_exists for an address already on the list. The key needs the email:suppressions permission. The dashboard’s key form does not offer it, but your AI assistant can create such a key.

After the switch

  • Watch Settings > Email Service > Email Logs, in the App sends (API and SMTP) view, as your app’s email moves over.
  • Test with a test key, not a trickle of real sends. Simulated sends are not counted, so they do not set a small usual day for the daily volume check. If your account already sends API mail on most days, moving a large app over in one go can pass 5 times that usual day and hold API mail until 00:00 UTC.
  • Once nothing sends through Resend, remove Resend’s DNS records and its include: from your SPF record.