Documentation

Everything you need to send email with Sendscape

Getting started

Three steps from zero to your first delivered email.

1
Verify a domain
Add your domain under Domains and create the three CNAME records at your DNS provider. You can only send from verified domains.
2
Create a credential
Create an API key for the HTTP API, or an SMTP credential for a drop-in relay setup. Both are shown once - store them safely.
3
Send your first email
Copy a snippet from the HTTP API or SMTP section below and fire a test send. It shows up in your send log immediately.

Verify a domain

Add a domain and you get three CNAME records that set up email signing (DKIM). Create them at your DNS provider, and the dashboard checks automatically every 15 seconds until they resolve. Verification usually completes within minutes, but DNS propagation can take up to 48 hours.

Once verified, you can send from any address at that domain - and at its subdomains. Verifying example.com also lets you send from news.example.com. The Free plan includes 1 sending domain; paid plans include more (see Quotas and plans).

Your records and live verification status are on the Domains page.

Send via HTTP API

Send by POSTing JSON to https://api.sendscape.ai/v1/emails with your API key as a bearer token: Authorization: Bearer YOUR_API_KEY. Keys start with ss_ and are created on the API Keys page.

Request fields

FieldTypeRequiredNotes
fromstringYesSender address, either "Acme <hello@yourdomain.com>" or a bare address. The domain must be verified on your account; a verified parent domain also covers its subdomains.
tostring | arrayYesA single recipient, or an array of up to 50 addresses. Everyone listed gets the same email and can see each other in the To field - to send each person a private copy, make one request per recipient. One request counts once against your quota regardless of recipient count.
subjectstringYesMax 255 characters.
htmlstringNo*HTML body. At least one of html or text is required.
textstringNo*Plain-text body. Sending it alongside html helps deliverability.
reply_tostringNoReply-To address.

Example request

curl -X POST https://api.sendscape.ai/v1/emails \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "hello@yourdomain.com",
    "to": ["recipient@example.com"],
    "subject": "Hello from Sendscape",
    "html": "<p>It works!</p>"
  }'

Success response

Accepted sends return 202. The id is the send-log entry you can find under Email Metrics.

HTTP/1.1 202 Accepted

{
  "id": 42,
  "message_id": "0107019064ab1234-56c78d90-...",
  "status": "accepted"
}

Errors

Errors use a consistent envelope: an error machine code plus a human-readable message.

StatusCodeMeaning
401missing_api_keyNo Authorization header, or the token does not start with ss_.
401invalid_api_keyThe key was not found or has been revoked.
422(validation)A field failed validation. Standard envelope with "message" and per-field "errors".
422missing_bodyNeither html nor text was provided.
422domain_not_verifiedThe from domain is not verified on your account.
422recipient_suppressedA recipient is on your suppression list.
422too_many_recipientsMore than 50 recipients in one message.
403account_pausedYour account is paused and cannot send.
429quota_exceededYour daily or monthly sending quota has been reached. Retry after it resets.
502ses_errorThe upstream mail provider rejected the message. Your quota is refunded - safe to retry.
HTTP/1.1 422 Unprocessable Content

{
  "error": "domain_not_verified",
  "message": "The sending domain 'example.com' is not verified for this account."
}

Send via SMTP

Anything that speaks SMTP - Laravel, WordPress, legacy apps, IoT devices - can send through Sendscape without code changes. Create a credential on the SMTP Credentials page and plug in these settings:

SettingValue
Hostsmtp.sendscape.ai
Port587
EncryptionSTARTTLS
Usernamess_... (shown on the credentials page)
PasswordShown once when you create the credential

SMTP goes through the same pipeline as the HTTP API: the from domain must be verified, suppressed recipients are rejected, and sends count against the same quota.

MAIL_MAILER=smtp
MAIL_HOST=smtp.sendscape.ai
MAIL_PORT=587
MAIL_USERNAME=YOUR_SMTP_USERNAME
MAIL_PASSWORD=••••••••   # shown once when you create the credential
MAIL_ENCRYPTION=tls
MAIL_FROM_ADDRESS=hello@yourdomain.com

Connect n8n

Use Sendscape in an n8n workflow with built-in nodes - no custom node required. Either the HTTP Request node with an API key, or the Send Email node with an SMTP credential.

n8n → "HTTP Request" node
─────────────────────────────────
Method:          POST
URL:             https://api.sendscape.ai/v1/emails
Authentication:  Generic Credential → Header Auth
  • Name:        Authorization
  • Value:       Bearer YOUR_API_KEY
Send Body:       ON   (Body Content Type: JSON)
Specify Body:    Using JSON

JSON body:
{
  "from": "hello@yourdomain.com",
  "to": ["recipient@example.com"],
  "subject": "Hello from n8n",
  "html": "<p>Sent from an n8n workflow.</p>"
}

Broadcasts (marketing)

Broadcasts send one email to your whole audience - newsletters, promos, announcements. Everything happens in the dashboard (no API needed): build your list under Contacts, compose and send under Broadcasts.

1
Add your contacts
Add contacts one by one or import a CSV (a header row with an email column is enough - name columns are picked up automatically). Organize them with your own groups like “FB Leads” or “Customers”; a contact can be in several groups at once.
2
Compose
Pick a from-address on one of your verified domains, then write in the rich-text editor - or paste your own HTML. In HTML mode you can place {{unsubscribe_url}} wherever you want the unsubscribe link; otherwise a footer is added for you. Target all contacts or specific groups - the live counter shows exactly how many people will receive it.
3
Send and watch it land
Sending runs in the background at a safe pace. The broadcast page shows live progress and a per-recipient list with real delivery statuses - Delivered, Bounced, Complained - as receiving servers report back.

Unsubscribe, handled for you

Every broadcast automatically carries an unsubscribe footer link and the one-click unsubscribe header that Gmail and Yahoo require from bulk senders - there is nothing to configure. When someone unsubscribes, future broadcasts skip them automatically, but they still receive your transactional email (receipts, OTPs) - unsubscribes and the suppression list are deliberately separate. A recipient who marks a broadcast as spam is unsubscribed automatically too.

Rules of the road

  • Broadcasts go only to subscribed contacts, deduplicated across groups.
  • If you hold more contacts than your marketing plan allows (for example after a downgrade), adding contacts and sending broadcasts pause until you upgrade or trim the list - contacts are never deleted.
  • The free marketing tier sends up to 4,000 broadcast emails per month and adds a small “Sent with Sendscape” line to the footer - both lifted on paid marketing plans.

Plans, quotas and extras

Transactional plans

PlanPriceEmails / monthEmails / dayDomains
FreeRM03,0001001
StarterRM69/mo50,0005,00010
GrowthRM299/mo100,00010,00050

Quotas count messages, not recipients - one send to 50 addresses uses 1 from your quota (and all 50 share the same To field; see the to field above). The daily quota resets at midnight (Malaysia time); the monthly quota resets on your billing anniversary, not the calendar month. Sends over quota return 429 quota_exceeded and nothing is queued - retry after the reset. Manage your plan under Usage & Billing.

Marketing plans

PlanPriceContactsBroadcast sending
FreeRM01,0004,000 emails / month
StarterRM129/mo5,000Unlimited
GrowthRM449/mo25,000Unlimited

Marketing is priced by contacts stored, not emails sent - broadcasts never consume your transactional quota. The two plans are separate and mix freely: free transactional with a paid marketing plan works, and so does the reverse.

Extra emails (pay-as-you-go)

On paid transactional plans you can keep sending past your monthly limit: enable Extra emails under Usage & Billing → Extras, and each additional 1,000 emails deducts RM 4.00 from your credits automatically. Your daily limit always applies, and nothing is charged unless you opt in. The free plan is a hard stop at its monthly quota.

Send statuses

Every message gets a status on the Email Metrics page. Most sends start as Accepted and move on once the receiving server reports back.

StatusWhat it means
AcceptedWe handed the message to the mail servers and it is on its way. This is the normal result of a successful send.
DeliveredThe receiving mail server confirmed it took the message for the recipient. Most sends go from Accepted to Delivered within seconds.
BouncedThe receiving server permanently refused the message - the address does not exist, or the mailbox is closed. The address is added to your suppression list automatically so you do not send to it again.
ComplainedThe recipient marked the email as spam. The address is suppressed automatically, and a high complaint rate can pause your account.
RejectedSendscape refused the message before it left - over quota, a suppressed recipient, an unverified sending domain, or a paused account. Nothing was sent and no quota was used.
FailedThe mail provider returned an error while we were sending. Your quota is refunded, so it is safe to retry.

The Failed tab lists both Failed and Rejected messages - they are the two ways a send can not go out. Click any row to open its details, which include the exact reason. The codes behind a rejection are the same ones the API returns: see Errors.

Bounced and Complained addresses go straight onto your suppression list - see Suppressions and deliverability for what that means for your account.

Broadcast emails appear here too (channel broadcast). Each broadcast's own page adds two fan-out states you will not see in Email Metrics: Pending (queued, not yet sent) and Skipped (the contact unsubscribed or was suppressed by the time we reached them).

Suppressions and deliverability

When an email hard-bounces or the recipient marks it as spam, that address is automatically added to your suppression list. Later sends to it are rejected with recipient_suppressed instead of being silently dropped, so your logs stay honest. Review and manage the list under Suppressions.

To protect deliverability for everyone, accounts with a bounce rate above 5% or a complaint rate above 0.1% (measured after 50 sends) are paused automatically.

Keeping your rates healthy is mostly list hygiene:

  • Send only to recipients who opted in - never to purchased or scraped lists.
  • Remove addresses that have not engaged in months before large sends.
  • Include a plain-text part alongside your HTML.
  • Use a subdomain (like mail.yourdomain.com) for transactional mail to isolate reputation.
  • Broadcasts count toward the same bounce and complaint rates - a spam complaint on a newsletter hurts your account exactly like one on a receipt (and auto-unsubscribes that contact).

Using AI coding assistants

If you build with Claude, Cursor or a similar assistant, install the Sendscape skill and it will write integration code against the real API instead of guessing. The bundle is generated from this page, so the endpoint, request fields and error codes are always the ones documented above.

Download sendscape-skill.zip

# Install the Sendscape skill into your project
mkdir -p .claude/skills
curl -L https://sendscape.ai/sendscape-skill.zip -o /tmp/sendscape-skill.zip
unzip -o /tmp/sendscape-skill.zip -d .claude/skills

# Or install it for every project on this machine:
#   unzip -o /tmp/sendscape-skill.zip -d ~/.claude/skills

# Then just ask, and it loads on its own:
#   "send a welcome email with Sendscape when a user signs up"