Reference

Security

An overview of Sendexa's security model — how credentials work, how webhooks are signed, and the practices we recommend to keep your integration secure.

Transport Security (TLS)

All connections to api.sendexa.co must use HTTPS. The API rejects plain HTTP with a 301 Moved Permanently redirect — never rely on the redirect; always use HTTPS from the start.

Minimum TLS version

TLS 1.2

Certificate authority

Let's Encrypt / DigiCert

HSTS

Enabled, max-age 1 year

API Keys & Credentials

Sendexa uses HTTP Basic Auth. Requests must include an Authorization header with a Base64-encoded apiKey:apiSecret token.

Bash
# Compute the token once:
echo -n "your_api_key:your_api_secret" | base64
# Use in every request:
Authorization: Basic <base64_token>
Never embed credentials directly in client-side JavaScript or mobile app binaries.
Store credentials in environment variables or a secrets manager (AWS Secrets Manager, HashiCorp Vault, etc.).
Use separate API keys for development and production environments.
Scope keys to the minimum permissions required.
Rotate keys immediately if they are accidentally exposed.
Key Rotation

You can generate a new API key from the Dashboard at any time without downtime by using a brief overlap window.

  1. Go to Dashboard → Settings → API Keys.
  2. Click Generate New Key. The old key remains active.
  3. Update all services and environment variables to use the new key.
  4. Once all deployments are using the new key, click Revoke Old Key.
Webhook Signature Verification

Every webhook Sendexa delivers is signed with HMAC-SHA256 using your webhook secret. Always verify the signature before processing the event — this prevents attackers from sending fake payloads to your endpoint.

TypeScript
import { createHmac, timingSafeEqual } from "crypto";
function verifyWebhook(
signature: string, // X-Sendexa-Signature header value
rawBody: Buffer, // raw, unparsed request body
secret: string, // your webhook secret from the dashboard
): boolean {
const sig = signature.startsWith("sha256=")
? signature.slice(7)
: signature;
const expected = createHmac("sha256", secret)
.update(rawBody)
.digest("hex");
// timingSafeEqual prevents timing attacks
return timingSafeEqual(
Buffer.from(expected, "hex"),
Buffer.from(sig, "hex"),
);
}
Responsible Disclosure

If you discover a security vulnerability in Sendexa's API, dashboard, or SDKs, please report it privately before public disclosure.

Email security@sendexa.co with a description of the issue and reproduction steps. We aim to acknowledge reports within 24 hours and resolve critical issues within 72 hours.

We ask that you do not disclose the vulnerability publicly until we have had a reasonable opportunity to investigate and remediate.