Skip to navigation

Email Service

Email Service is enabled per organization. If Email Service is not in your sidebar, contact support to request access.

Email Service sends transactional email, such as order confirmations, password resets, and notifications, from a subdomain you own, like email.acme.com. Your application sends each message with one HTTPS request, and the portal shows its delivery status.

  • Your domain, managed authentication. You delegate one unused subdomain to IBEE with two NS records. IBEE then creates and maintains the SPF, DKIM, DMARC, and return-path (bounce) records inside that subdomain.
  • HTTPS API only. Messages are sent with POST /v1/emails. SMTP relay is not available.
  • Send-only. Sender addresses are identities for outgoing mail, not mailboxes. Email Service does not receive email.

Domains, senders, suppressions, and webhooks are managed in the portal. They have no public API yet.

Before you begin

  • An organization and a workspace. Email Service resources belong to a workspace.
  • Access to the DNS settings of your company domain, such as acme.com, at your DNS provider.
  • An unused subdomain to send from, such as email, notify, or updates. It must not already serve a website or a mailbox.
  • To create Email Tokens: an organization admin whose account is verified (Verify your identity).

How it works

1

Add a sending domain

Choose your company domain and a sending subdomain. IBEE prepares a DNS zone for the subdomain and gives you its nameservers.

2

Delegate the subdomain

Add the NS records at the DNS provider for your company domain. Only the sending subdomain is delegated to IBEE. Your company domain’s nameservers, website, and existing mailboxes stay unchanged.

3

Verify

IBEE checks the delegation and then configures email authentication (SPF, DKIM, DMARC, and return-path records) inside the delegated subdomain.

4

Register senders

Add the exact From addresses your application will use, such as orders@email.acme.com.

5

Create an Email Token and send

Create a send-only Email Token for the domain, then call POST /v1/emails from your application server. Delivery results appear in Activity and can be sent to your webhook.

To open Email Service, select your organization and workspace, then click Email Service under Tools in the sidebar. The page has four tabs: Overview, Domains, Activity, and Settings. The Overview tab shows a three-step checklist (Add a sending domain, Create a token, Send a test email) and cards for Emails today, Delivery rate, Bounce rate, and Active domains.

Add a sending domain

1

Open the Add domain dialog

In Email Service, click Add domain on the Overview or Domains tab.

2

Enter your company domain

Under Company domain, enter a domain you control, such as acme.com, with no email address or URL path. You’ll need access to its DNS settings.

3

Choose a sending subdomain

Under Sending subdomain, enter a single label. The default is email, which gives the sending domain email.acme.com. Choose a name that is not already used for a website or mailbox, such as email, notify, or updates.

The dialog shows an example From address, such as orders@email.acme.com. You choose the real sender names later, when you register senders.

4

Continue to DNS setup

Click Continue to DNS setup. The domain opens on its own page with four setup steps: Choose domain, Add DNS records, Verify connection, and Register sender.

If the sending domain already exists in the workspace, the dialog links to it so you can continue its setup.

The Domains tab lists every sending domain with its Status, Next action, and creation date. You can search by name and filter by All domains, Verified domains, or Needs setup or attention. Click Continue setup or Manage to open a domain.

Add NS records and verify

Delegate only the sending subdomain. Do not change your company domain’s nameservers or its existing MX records. Delegating a subdomain moves DNS for that subdomain to IBEE, so use a subdomain that nothing else depends on.

1

Wait for the records

When the domain is created, IBEE prepares its nameservers. The Add DNS records step says so while it waits, and the records appear automatically when ready. You don’t need to add anything yet.

2

Add the NS records at your DNS provider

Open the DNS settings for your company domain and add each NS record exactly as shown. The table lists Type, Name, Value, and Status, with a copy button next to each name and value. Copy setup instructions copies all records and instructions in one step.

  • Copy Name and Value exactly.
  • Some DNS providers add your company domain to the name automatically. If yours does, don’t enter it twice.
  • Leave TTL at your provider’s default unless instructed otherwise.

Click I’ve added the records when you’re done.

3

Verify the connection

In the Verify connection step, click Verify connection. IBEE checks that the subdomain is delegated, then configures email authentication. The page updates automatically while checks run.

DNS changes can take time to appear. If a check has not passed yet, you can leave the page and return to the domain later. If the step shows Retry setup, click it after fixing the issue described on the page.

To see the authentication records IBEE manages, expand What does IBEE configure? in the Verify connection step. It lists the SPF, DKIM, DMARC, and bounce records inside the delegated subdomain. They are for reference only. Do not copy them into your company domain’s DNS.

Domain status

StatusWhat it meansWhat to do
Setting upIBEE is preparing the domain.Wait.
Needs DNS setupThe NS records are ready to add.Add the NS records at your DNS provider, then click Verify connection.
Checking nameserversIBEE is checking the delegation.Wait. The page updates automatically.
Configuring emailDelegation passed. IBEE is setting up email authentication.Wait.
Checking email recordsIBEE is verifying the authentication records.Wait.
RetryingA temporary problem occurred and IBEE is retrying.Wait. If it persists, contact support.
Action requiredSetup stopped and needs your input.Read the message on the domain page, fix the issue (usually the NS records), then click Retry setup.
Sandbox readyVerified for sandbox sending.Register senders. Sandbox restrictions apply (see Limits and sandbox).
ActiveDNS and email authentication are verified.Register senders and create an Email Token.
Setup expiredSetup was not completed in time.Remove the domain and add it again, or contact support.
SuspendedSending from this domain is stopped.Contact support.
CancelledSetup was cancelled.Add the domain again if you still need it.
RemovingThe domain is being removed.Wait.

Each NS record also has its own status: Pending, Checking, Verified, Missing, or Incorrect. Missing or Incorrect means the record at your DNS provider doesn’t match the value shown.

Remove a domain

Open the domain and click Remove, then type the domain name to confirm. New sends from the domain stop before its resources are released, and the domain shows Removing. Afterwards, delete the subdomain’s NS records at your DNS provider.

Register senders

A sender is the exact From address your application is allowed to use. Registering a sender does not create an inbox. The API rejects any From address that is not a registered sender on an active domain.

1

Open the domain

When a domain is Active or Sandbox ready, open it and go to the Register sender step.

2

Add the sender

Click Add sender and fill in:

  • Domain: the verified sending domain.
  • Sender name: only the part before @, such as orders, support, or notifications, up to 64 characters. The domain is added automatically.
  • Display name (optional): for example, Acme Orders.
  • Reply-To (optional): for example, support@acme.com.

The domain’s sender table shows each Address, Display name, Reply-To, and Status. To set the display name and Reply-To on a message sent through the API, include fromName and replyTo in the request (see Send an email).

To remove a sender, click the delete icon on its row. Applications can no longer send from that address.

Create an Email Token

Applications authenticate to the send API with an Email Token. Each token can only send email from one verified sending domain. It cannot manage infrastructure or change Email Service settings. Platform API tokens cannot send email.

1

Open Email Tokens

In the sidebar, click API Tokens under Organization, then open the Email Tokens tab. You can also click Create token on the Email Service Overview tab or on a verified domain’s page. Both open the same dialog with the workspace and domain preselected.

2

Create the token

Click Create Email Token and fill in:

  • Token name: for example, production-app (up to 80 characters).
  • Workspace: the workspace that owns the sending domain.
  • Sending domain: one verified domain in that workspace.
  • Expiration: No expiration, 7 days, 30 days, 90 days (default), or 1 year.

The summary shows the sending domain, the permission (Send email only), and the expiry. Click Create token.

3

Save the token

Copy the token from the Save this email token now dialog. It is shown once and cannot be recovered later. Store it in your application server’s secret store, never in frontend code.

Only organization admins can create or revoke Email Tokens, and their account must be verified.

To revoke a token, click Revoke on its row. Applications using it stop sending immediately. Messages that were already accepted are not cancelled.

For platform API tokens and other credential types, see API Tokens.

Send an email

Send one message per request:

POST https://api.ibee.email/v1/emails

Headers

HeaderRequiredValue
AuthorizationYesBearer <email-token>
Content-TypeYesapplication/json
Idempotency-KeyYesA unique key for this message: 8–128 characters of letters, digits, ., _, :, and -.

Body

FieldRequiredDescription
fromYesA registered sender address on a domain the token can use.
toYesOne recipient email address, as a string.
subjectYes1–200 characters.
textOne of text or htmlPlain-text body, up to 100,000 characters.
htmlOne of text or htmlHTML body, up to 250,000 characters.
fromNameNoDisplay name shown with the From address, up to 120 characters.
replyToNoReply-To email address.

Each request has exactly one recipient. To email several people, send one request per recipient, each with its own Idempotency-Key. Attachments, CC, and BCC are not supported.

Examples

curl https://api.ibee.email/v1/emails \
-H "Authorization: Bearer $IBEE_EMAIL_TOKEN" \
-H "Idempotency-Key: order-1042-confirmation" \
-H "Content-Type: application/json" \
-d '{
"from": "orders@email.acme.com",
"fromName": "Acme Orders",
"to": "buyer@example.com",
"replyTo": "support@acme.com",
"subject": "Your order is confirmed",
"text": "Thank you for your order.",
"html": "<p>Thank you for your order.</p>"
}'

Response

A successful request returns 202 Accepted. This means the message was accepted and queued. Delivery happens afterwards and is reported in Activity and through webhooks.

{
"id": "msg_Xk3v9Qp2LmN7tRzA",
"status": "accepted",
"duplicate": false
}

Idempotency

The Idempotency-Key makes retries safe. If a request fails because of a timeout or network error, retry it with the same key. When a key has already been used in the workspace, the API returns the original message’s id with "duplicate": true and does not send it again.

Derive the key from your own record, such as order-1042-confirmation. Use a new key for every distinct email. A reused key never sends a second message, even if the body changed.

Errors

Errors return a JSON body with a machine-readable code:

{
"error": {
"code": "recipient_suppressed",
"message": "Recipient is on this workspace's suppression list."
}
}
StatusCodeMeaning
400idempotency_key_requiredThe Idempotency-Key header is missing.
400idempotency_key_invalidThe key is not 8–128 allowed characters.
400invalid_jsonThe body is not a valid JSON object.
400sender_invalid, recipient_invalid, reply_to_invalidAn email address is malformed.
400subject_invalidThe subject is empty or longer than 200 characters.
400body_emptyNeither text nor html was provided.
401api_key_requiredThe Authorization: Bearer header is missing.
401api_key_invalidThe token is wrong, revoked, or expired.
403sender_not_allowedThe From address is not a registered sender on an active domain.
403sender_not_allowed_by_keyThe token is not allowed to send from this sender’s domain.
403scope_missingThe token does not have send permission.
403tenant_inactiveEmail Service is not active for this workspace.
409recipient_suppressedThe recipient is on the workspace’s suppression list.
413body_too_large, request_too_largeThe content or the whole request is too large.
415content_type_invalidContent-Type is not application/json.
429daily_limit_reachedThe workspace’s daily limit is used up. details.limit shows the limit.
429quota_or_acceptance_conflictThe message could not be accepted. Retry with the same Idempotency-Key.
500internal_errorUnexpected error. Retry with the same Idempotency-Key.

Every response includes an x-request-id header. Include it when you contact support.

Send a test from the portal

To check your setup without writing code, click Send test in the Overview checklist or Send test email on the Activity tab. Choose a registered sender under From, enter the To, Subject, and Message, then click Send. The result appears in Activity. Test emails are real messages and count toward the daily limit.

Activity and message timeline

The Activity tab lists recent messages with From, To, Subject, Status, and Created. Click Refresh to load new results, and Load older messages to page back. The search box filters the messages already loaded on the page by ID, address, subject, or status.

Click a message’s subject to open its details. They show the message ID, From, To, and Subject, plus a timeline of every delivery event with its time, a description, and the SMTP status code when the recipient’s mail server returned one.

StatusMeaning
AcceptedThe API accepted the message.
QueuedWaiting to be sent.
SubmittedHanded to the recipient’s mail server.
DeferredTemporarily refused. Delivery is being retried.
DeliveredThe recipient’s mail server accepted the message.
BouncedThe recipient’s mail server permanently rejected the message. The recipient is suppressed automatically.
RejectedThe message was rejected and will not be delivered.
FailedThe message could not be sent.
ComplaintThe recipient marked the message as spam. The recipient is suppressed automatically.

Suppressions

The suppression list holds recipients this workspace will not send to. A request to a suppressed recipient fails with 409 recipient_suppressed.

To open it, click Suppressed recipients on the Activity tab. Each entry shows the Recipient, Reason, and the date it was Added.

ReasonAdded byCan you remove it?
ManualYou, with Add suppressionYes. Click the delete icon on its row.
Hard bounceAutomatically, when a message bouncesNo. It shows as Automatic.
ComplaintAutomatically, when a recipient reports spamNo. It shows as Automatic.

To block an address yourself, click Add suppression, enter the email address, and confirm. If an automatic suppression was added in error, contact support.

Webhooks

Webhooks send signed delivery events to an HTTPS endpoint in your application. They are optional. You host the receiver.

To add an endpoint:

1

Open Webhooks

In Email Service, open the Settings tab and expand Webhooks.

2

Save the endpoint URL

Under Webhook endpoint, keep Add a new endpoint selected. Enter your Endpoint URL, such as https://api.example.com/webhooks/email, and click Save webhook.

The URL must be a public HTTPS address with no username, password, or #fragment. Local and private addresses are rejected.

3

Copy the signing secret

The signing secret is shown once, right after you save. Copy it into your server’s configuration, then click I’ve saved the secret.

4

Send a test event

Click Send test event. IBEE sends a synthetic email.delivered event with "test": true in its data. No email is sent. Click Refresh status to see the result.

New endpoints receive all six event types. To manage an existing endpoint, choose it from Webhook endpoint. Its status is Active, Disabled, or Failing, and the panel shows the latest delivery result.

  • Update webhook: change the endpoint URL. Subscriptions and status are kept.
  • Disable webhook or Enable webhook: stop or resume deliveries to the endpoint.
  • Rotate secret: issue a new signing secret. The old secret stops working immediately, so update your receiver right away.

Events

EventSent when
email.deliveredThe recipient’s mail server accepted the message.
email.deferredDelivery was temporarily refused and is being retried.
email.bouncedThe message bounced permanently. The recipient is suppressed.
email.rejectedThe message was rejected and will not be delivered.
email.failedThe message could not be sent.
email.complainedThe recipient reported the message as spam. The recipient is suppressed.

Each delivery is a POST with a JSON body:

{
"id": "evt_4fT8wQm1ZkP0sVnB",
"type": "email.bounced",
"createdAt": "2026-10-01T09:30:12.000Z",
"data": {
"messageId": "msg_Xk3v9Qp2LmN7tRzA",
"from": "orders@email.acme.com",
"to": "buyer@example.com",
"subject": "Your order is confirmed",
"status": "bounced",
"smtpStatusCode": "550",
"smtpResponse": "5.1.1 User unknown"
}
}

data.messageId matches the id returned by POST /v1/emails. Payloads can include more fields. Ignore any you don’t use.

Delivery and retries

  • Return any 2xx status within 15 seconds to acknowledge an event.
  • Redirects are not followed.
  • Timeouts, network errors, and 408, 425, 429, and 5xx responses are retried with increasing delays. Other responses are not retried.
  • Retries can deliver the same event more than once. Deduplicate with the x-ibee-event-id header.

Verify signatures

Every delivery includes three headers:

HeaderValue
x-ibee-signaturev1= followed by the hex HMAC-SHA256 signature
x-ibee-timestampThe signing time, in Unix seconds
x-ibee-event-idThe event ID, for deduplication

To verify a delivery:

  1. Compute HMAC-SHA256 with your signing secret over the exact string timestamp + "." + rawRequestBody. Use the raw bytes you received, not re-serialized JSON.
  2. Compare the hex digest with the value after v1= using a constant-time comparison.
  3. Reject timestamps more than 5 minutes from your server’s clock.
import hashlib
import hmac
import os
import time
from flask import Flask, abort, request
app = Flask(__name__)
SECRET = os.environ["IBEE_WEBHOOK_SECRET"].encode()
TOLERANCE_SECONDS = 300
@app.post("/webhooks/email")
def ibee_email_webhook():
raw_body = request.get_data()
timestamp = request.headers.get("x-ibee-timestamp", "")
signature = request.headers.get("x-ibee-signature", "")
if not timestamp.isdigit() or abs(time.time() - int(timestamp)) > TOLERANCE_SECONDS:
abort(400)
expected = hmac.new(SECRET, timestamp.encode() + b"." + raw_body, hashlib.sha256).hexdigest()
if not signature.startswith("v1=") or not hmac.compare_digest(signature[3:], expected):
abort(400)
event = request.get_json()
# Skip events whose x-ibee-event-id you have already processed.
print(event["type"], event["data"].get("messageId"))
return "", 204

Keep the signing secret on your server. Never put it in frontend code.

Limits and sandbox

Workspaces start with sandbox access. A domain that shows Sandbox ready is verified for sandbox sending, and sandbox recipient and quota restrictions apply. To ask about production access or a higher limit, contact support.

Each workspace has a daily sending limit. The Emails today card on the Overview tab shows how many messages you have sent today and your daily limit. When the limit is reached, the API returns 429 daily_limit_reached until the next day starts (00:00 UTC). Test emails sent from the portal count toward the limit. Repeated requests with an already-used Idempotency-Key do not.

LimitValue
Recipients per request1
Subject1–200 characters
text body100,000 characters
html body250,000 characters
Request body256 KB
Idempotency-Key8–128 characters: letters, digits, ., _, :, -
fromName120 characters (longer values are truncated)
Sending domains per Email Token1
Sender name (part before @)64 characters

Keep your bounce rate low. The Bounce rate card on Overview targets below 2%. Send only to addresses that asked for your email, and respect the suppression list.

  • API Tokens: platform API tokens and the other credential types managed on the same page.
  • Verify your identity: required before creating Email Tokens.
  • Contact support: request Email Service access, production access, or help with a domain.