We use optional, privacy-safe analytics to understand which pages help visitors. Nothing optional runs until you choose. Privacy policy

Skip to content
Security

Security for customer messaging infrastructure.

A technical overview of how SendiMessage protects accounts, API access, messaging data, managed lines, and webhook integrations. Everything on this page is verified against the implementation — where something isn't built yet, we say so.

One request, every boundary
Your application
SendiMessage API Authenticate key + secret
Organization boundary Tenant isolation
Managed messaging infrastructure Operated by us
Your customer
Back to your application HMAC-SHA256 verified
Verified controls

What is actually implemented.

Six controls, stated specifically. Each one is verified in the codebase and exercised by the product every day — no vague “enterprise-grade” adjectives.

API authentication

Every API request authenticates with two headers — a key and a secret. Secrets are stored only as one-way hashes and compared in constant time; a missing or revoked credential is rejected before any resource is touched.

X-API-Key: key_example000000 X-API-Secret: •••••••••••••••• → 401 without both

Tenant isolation

Every resource belongs to exactly one organization, and every query is scoped by the organization resolved from the authenticated credential — enforced server-side and covered by automated cross-tenant tests.

GET {another org's resource} → 404 Not found — never data

Signed webhooks

Deliveries to endpoints with a signing secret configured carry an HMAC-SHA256 signature of the raw request body, so your application can verify the event came from SendiMessage and reject tampering.

SendiMessage-Signature: 609f6e6e…91d38d9a

Encrypted transport

Web and API traffic is served over HTTPS/TLS, with baseline security headers: HSTS, X-Frame-Options DENY, X-Content-Type-Options nosniff, Referrer-Policy, and Permissions-Policy.

https:// → TLS Strict-Transport-Security: on

Access control

Customer roles (owner, admin, developer, member) gate portal areas server-side — credential management is owner-only. Internal staff surfaces use a separate staff-role system customer accounts cannot reach.

credentials → owner team, webhooks → owner, admin

Managed infrastructure

Messaging lines are provisioned, configured, rate-limited, and health-monitored by SendiMessage. Your application only ever talks to the REST API — the line infrastructure is never exposed to you or anyone else.

your app → REST API lines → operated by us
Tenant isolation

Your organization is isolated from other customers.

Every SendiMessage resource is associated with a customer organization, and authorization is enforced server-side on every request: the organization is resolved from the authenticated credential, and queries are scoped to it. An authenticated customer cannot read, list, or act on resources belonging to another organization.

organization_a

Every resource belongs here — and only here
  • Users
  • API credentials
  • Lines
  • Messages
  • Conversations
  • Contacts
  • Webhooks

organization_b

Every resource belongs here — and only here
  • Users
  • API credentials
  • Lines
  • Messages
  • Conversations
  • Contacts
  • Webhooks
Read another org's message, conversation, contact, line, or webhook404 Not found — the resource does not exist for you
Send through a line that isn't yoursRejected with a validation error — no message created
List messages, contacts, or conversationsOnly your organization's records, ever
Use a missing, wrong, or revoked credential401 Unauthenticated
Opt-out and delivery stateScoped per organization

Public identifiers are opaque handles (message_handle, line_handle, contact_handle, conversation_handle) — numeric database IDs are never exposed, so identifiers can't be guessed or enumerated. These behaviors are covered by an automated cross-tenant test suite that runs against the real API surface.

API credentials

API credentials stay under your control.

Credentials are issued once, stored as one-way hashes, revocable at any time, and always visible in terms of when they were last used.

Production line credentialActive
sm_live_••••4a91
Created Aug 12Last used 2 min agoExample values
Create new keyDeploy to your serversVerify trafficRevoke old key
Keep secrets server-side
Keep SendiMessage API secrets in a secure server-side environment (a secret manager or server-only environment variables). Never embed secret credentials in browser JavaScript, mobile apps, or client-side code — the API is designed to be called from your backend.
Shown onceThe full secret is displayed a single time at issuance. We store only a one-way hash — the secret is not retrievable afterwards, by you or by us.
Constant-time verificationSecrets are compared with constant-time equality, not string comparison.
Revocation & rotationIssue a replacement key, deploy it, verify, then revoke the old one — no forced downtime. Revoked credentials are rejected immediately.
Usage visibilityEach credential records when it was last used, so unused or suspect keys are easy to spot and revoke.
Organization-scopedAccount API credentials act within your organization only. Line credentials additionally carry scopes (messages:send, messages:read). Finer-grained account-key scopes are on our roadmap — we don't pretend they exist today.
Audited issuanceCredential delivery and lifecycle events are recorded in our audit log.
Webhook security

Verify every webhook.

Deliveries are signed with an HMAC-SHA256 of "{timestamp}.{raw request body}" (lowercase hex), keyed with your webhook secret, so your application can prove an event came from SendiMessage before trusting it.

# Header (example values) SendiMessage-Signature: t=1755766055,v1=3205662b…4b3d8 # Payload { "id": "evt_01j6x6…", "type": "receive", "created_at": "…", "data": { "message": { "message_handle": "msg_01j6x6…", "text": "…" } } } # Your endpoint verify(signature, raw_body, signing_secret) → Valid — event accepted
Signature verifiedVerify against the exact raw bytes received — re-serialized JSON differs.
SendiMessage sends the eventPayload + SendiMessage-Signature header (when your endpoint has a signing secret configured)
Your endpoint parses t= and v1=Recompute lowercase-hex HMAC-SHA256 of "{t}.{raw body}" over the exact raw bytes received, keyed with your signing secret
Check the timestamp and compare in constant timeReject a stale t=, or call the SDK helper verifyWebhookSignature
Accept or rejectMismatch or stale timestamp → discard the request
Verification examples in the API docs →
Configure a signing secretSigning is active for endpoints with a webhook secret configured — set one for every production endpoint so each delivery can be verified.
Delivery modelRespond with a 2xx quickly and process asynchronously. If your endpoint was down, reconcile missed events from the message history API — never trust an unverified payload to fill the gap.
Destination validationCustomer-supplied webhook URLs are validated server-side so they cannot target internal or reserved networks. HTTPS endpoints are strongly recommended.
Data flow

How customer data moves through SendiMessage.

Both directions of a conversation, with the security property active at each hop.

Outbound — you send a message

Your application
HTTPS requestTLS
SendiMessage APIAuthenticate key + secret
Organization scopeTenant isolation
Managed lineRate limits & health checks
Your customer

Inbound — your customer replies

Customer replies
Managed line
Conversation & message recordOrganization-owned
Signed webhookHMAC-SHA256 of raw body
Your applicationYou verify the signature
Data handling

Data handled by SendiMessage.

What we store to run the product — no more categories, and no hidden ones.

Account

  • Organization details
  • User accounts & work email
  • Roles & membership

Messaging

  • Message content & direction
  • Sender / recipient numbers
  • Status & timestamps
  • Contacts (name, company, tags, custom variables)
  • Conversations
  • Per-org opt-out state

Integration

  • Webhook endpoints & delivery records
  • API credential metadata (never raw secrets)
  • Line configuration

Operations

  • Audit log of security-relevant actions
  • Request correlation IDs
  • Support conversations

Retention

Message and conversation history is retained to power the product's history, conversation, and delivery-tracking features. We have not yet published formal retention windows — a formal retention policy is being defined, and we say so rather than inventing numbers. If your review needs specifics for a category, ask us and we'll give you the current factual answer.

Deletion — what you can do today

API credentialsRevocable immediately, by you, at any time.
WebhooksRemovable by you via the portal and API.
ContactsDeletable via the API. Opt-out state deliberately survives contact deletion — a number that asked to stop receiving messages stays stopped.
Organization deletionHandled with our team on request — not yet self-service, and we don't promise timelines we haven't formalized.

Encryption — precisely stated

In transitWeb and API traffic served over HTTPS/TLS; HSTS enabled.
Secrets — application levelAPI credential secrets are stored as one-way hashes — shown once at issuance, never retrievable afterwards.
Database / diskWe distinguish application-level encryption from provider disk encryption and do not blur them. We do not claim blanket “everything is encrypted at rest” — ask us during review for the current storage configuration.
Access control

Access is permission-controlled.

Customer roles gate what each person in your organization can do — enforced server-side on every portal request, not hidden in the UI.

OwnerFull control of the organization, including API credentials and production settings — credential management is restricted to owners.
AdminTeam, lines, contacts, and webhooks — not credential management.
Scoped rolesDeveloper, operations manager, support manager, billing viewer, and read-only — each limited to its own area of the portal.

Internal staff surfaces are gated by a separate staff-role system with per-area permissions. Customer accounts cannot reach staff tooling, and administrative access to production systems is restricted to authorized personnel. Security-relevant staff actions — provisioning, credential delivery, admin changes — are recorded in the audit log.

Operations

Infrastructure and operations.

The operational controls behind the product — described at the level that's useful to you, without publishing internal topology.

Audit loggingSecurity-relevant actions are recorded: credential delivery, webhook creation and changes, line provisioning, invitations, and administrative actions.
Request traceabilityEvery API response carries a correlation ID, so any request can be traced through the system during support or an investigation.
Line health monitoringManaged lines carry sending limits and continuous health monitoring that protects deliverability and flags degradation.
Abuse protectionAuthentication endpoints are rate-limited; per-line sending limits are enforced and visible via the API.
Incident responseSecurity events are investigated, contained, and remediated under an internal incident-response runbook covering detection, containment, credential rotation, customer-impact analysis, and postmortem.
What we deliberately don't advertise
We do not advertise “24/7 security monitoring”, a certified SOC, or guaranteed uptime — none of those claims are verified today, so they don't appear here.
Service providers

Subprocessors.

Third-party services verified in the current implementation. Messaging data stays on SendiMessage-managed infrastructure.

Google (Analytics / Tag Manager)Marketing-website analyticsConsent-gated usage events. An allowlist plus scrubbing filter drops emails, phone numbers, keys, and secrets before anything leaves the browser.
MetaAd conversion measurement on the marketing siteConsent-gated conversion events only — never message data.

Customer messages are transported and stored on SendiMessage-managed infrastructure — message content is not sent to the analytics vendors above. A complete, current service-provider list for your data-processing review is provided as part of vendor security review — contact us.

Compliance

Compliance and certifications.

SendiMessage does not currently hold SOC 2 or ISO 27001 certification, and we will never imply otherwise with badges or “coming soon” seals. What we publish instead is the specific, verifiable behavior above — and a straight answer when something isn't built yet.

SOC 2Not certified
ISO 27001Not certified
HIPAANot offered — no BAA
PCI DSSNot applicable — SendiMessage does not collect or store card data
Penetration testNo formal external test performed yet
MFA for customer accountsNot currently available — on the security roadmap
SSO / SAMLNot currently available
Tenant-isolation test suiteImplemented — automated cross-tenant authorization tests
Webhook signingImplemented — HMAC-SHA256 over the raw body, verifiable per delivery
Security headersImplemented — HSTS, frame, content-type, referrer, permissions
Responsible disclosure

Report a security issue.

Found something? We want to know, and we'll take it seriously.

  • Email a description of the issue, the affected endpoint or page, and reproduction steps.
  • Please do not access data that is not yours, alter or destroy data, or degrade the service while testing.
  • We investigate every credible report and will keep you informed of the outcome.
  • We do not currently run a paid bug-bounty program, and we won't pretend to.
Security FAQ

The questions a reviewer actually asks.

How does API authentication work?

Every request must carry both X-API-Key and X-API-Secret headers — bearer tokens are not the authentication method for this surface. Secrets are stored as one-way hashes and verified with constant-time comparison. Requests without valid credentials receive 401 Unauthenticated.

Can another customer access our lines or messages?

No. Every query is scoped to the organization resolved from the authenticated credential, server-side. Reading another organization's resource returns 404 Not found, and sending through a line that isn't yours is rejected with no message created. This behavior is covered by an automated cross-tenant test suite.

How do we verify webhooks are really from SendiMessage?

Each delivery carries an SendiMessage-Signature header: the hex HMAC-SHA256 of the raw request body, computed with your webhook secret. Recompute it over the exact bytes received and compare in constant time — verification examples are in the API docs.

Is our data encrypted?

In transit, yes — HTTPS/TLS with HSTS. At the application level, API secrets are stored as one-way hashes. We deliberately do not make a blanket “everything encrypted at rest” claim; ask us during review for the current storage configuration.

What customer data do you store?

Organization and user account data, message content with sender/recipient numbers and delivery status, contacts and conversations, webhook configuration and delivery records, API credential metadata (never raw secrets), and audit logs. The full breakdown is in the Data section above.

How long do you retain data, and can it be deleted?

Formal retention windows are not yet published — we're defining a retention policy and say so instead of inventing numbers. You can revoke credentials and delete webhooks and contacts yourself today; organization deletion is handled with our team on request.

Do you have SOC 2, MFA, or SSO?

Not yet, and we say so plainly: no SOC 2 or ISO 27001 certification, no customer-facing MFA (on the roadmap), no SSO/SAML. If your review requires any of these, tell us — real demand moves the roadmap.

How do we report a security issue?

Email hello@sendimessage.com or use the security contact form. A machine-readable /.well-known/security.txt is published. Please avoid accessing data that isn't yours and avoid destructive testing.

Running a vendor security review?

Send us your security requirements and we'll respond with verified information about the current SendiMessage implementation — including a straight answer where something isn't built yet.

Was this page useful?