Documentation

Send your first notification in minutes

XpressNotification is one API for email, SMS, push, and WhatsApp. Create a free account, generate a key, and drop in the .NET SDK — every channel uses the same client.

Quick start

Already have a key? Install the SDK and send in three lines.

bash
dotnet add package XpressNotification.Sdk
csharp
var client = new XpressNotificationClient("xpn_your_key", "https://your-api.com");
await client.Email.SendAsync(new EmailSendRequest
{
    To = "user@example.com",
    Subject = "Welcome!",
    Html = "<p>Hello from XpressNotification</p>"
});

1Create an account

Sign up for a free dashboard account — you land on the Free plan, no card required. Each signup gets its own isolated organization account.

2Create an API key

In the dashboard go to API Keys → Create key. Copy the key — it is shown only once. Optionally restrict the key to specific IPs or CIDR ranges right there (see Security).

Keys are shown once

The full key is displayed a single time at creation. Store it in a secret manager or environment variable — you can always create a new one if it's lost.

3Send your first email

Install the .NET SDK:

bash
dotnet add package XpressNotification.Sdk

Then send:

csharp
var client = new XpressNotificationClient("xpn_your_key", "https://your-api.com");

await client.Email.SendAsync(new EmailSendRequest
{
    To = "user@example.com",
    Subject = "Welcome!",
    Html = "<p>Hello from XpressNotification</p>"
});
Opens and clicks are tracked automatically — no extra setup. For DI registration and more, see the SDK quickstart.

4Other channels

Every channel uses the same client — just a different sub-client. SMS via Twilio:

csharp
await client.Sms.SendAsync(new SmsSendRequest
{
    To = "+233200000000",
    Body = "Your OTP is 1234"
});

Push (client.Push) and WhatsApp (client.WhatsApp) follow the same pattern. See the SDK docs for full examples of each.

5Email providers & failover

Email sends through Amazon SES by default. Add your own SMTP servers under Settings → Providers → Email → SMTP fallback — as many as you like, in priority order. Sends try them top-to-bottom, falling through only on connection/auth failures (a rejected recipient stops immediately, since another server can't fix a bad address).

The same page sets your account's routing & failover for sends that don't specify a provider:

  • SES → SMTP(default) try SES, fall over to SMTP if it fails.
  • SMTP → SEStry your SMTP servers first, fall over to SES.
  • SES only / SMTP onlyno cross-provider failover.

Override a single message by setting "provider": "smtp" (or "ses") in the send body — an explicit provider is used as-is, with no failover. SMTP passwords are encrypted at rest, and each config has a Test button plus a delivery-attempt log.

6Validate addresses

Check deliverability (syntax, MX records, disposable domains) before you send, to cut bounces:

csharp
var check = await client.Email.ValidateAsync("user@example.com");
// check.IsValid, check.Reason  ("valid" | "invalid_syntax" | "no_mx_record" | "disposable_domain")

Use client.Email.ValidateBulkAsync(...) for lists, and there's a “validate before send” toggle (Settings → Providers → Email → Validation) that runs the check automatically and rejects undeliverable recipients up front.

7Opens, clicks & analytics

Outgoing HTML emails get a tracking pixel and click-through links injected automatically. The dashboard Analytics page shows opens and clicks broken down by device, mail client, and country.

A note on open rates

Apple Mail Privacy Protection pre-fetches pixels for all mail, which inflates open counts industry-wide — click counts are unaffected.

8Secure your keys

Give each API key an IP allowlist (single IPs or CIDR ranges) on the API Keys page. Empty means the key works from anywhere; otherwise a call from any other address is rejected with a clear 401. Keys are stored hashed and shown only once.

Ready to go deeper?

The full .NET SDK reference covers DI setup, every channel, templates, and error handling.

SDK reference