Documentation
Everything you need to send email with Sendscape
Getting started
Three steps from zero to your first delivered email.
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
| Field | Type | Required | Notes |
|---|---|---|---|
| from | string | Yes | Sender 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. |
| to | string | array | Yes | A 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. |
| subject | string | Yes | Max 255 characters. |
| html | string | No* | HTML body. At least one of html or text is required. |
| text | string | No* | Plain-text body. Sending it alongside html helps deliverability. |
| reply_to | string | No | Reply-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.
| Status | Code | Meaning |
|---|---|---|
| 401 | missing_api_key | No Authorization header, or the token does not start with ss_. |
| 401 | invalid_api_key | The key was not found or has been revoked. |
| 422 | (validation) | A field failed validation. Standard envelope with "message" and per-field "errors". |
| 422 | missing_body | Neither html nor text was provided. |
| 422 | domain_not_verified | The from domain is not verified on your account. |
| 422 | recipient_suppressed | A recipient is on your suppression list. |
| 422 | too_many_recipients | More than 50 recipients in one message. |
| 403 | account_paused | Your account is paused and cannot send. |
| 429 | quota_exceeded | Your daily or monthly sending quota has been reached. Retry after it resets. |
| 502 | ses_error | The 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:
| Setting | Value |
|---|---|
| Host | smtp.sendscape.ai |
| Port | 587 |
| Encryption | STARTTLS |
| Username | ss_... (shown on the credentials page) |
| Password | Shown 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.comConnect 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.
{{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.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
| Plan | Price | Emails / month | Emails / day | Domains |
|---|---|---|---|---|
| Free | RM0 | 3,000 | 100 | 1 |
| Starter | RM69/mo | 50,000 | 5,000 | 10 |
| Growth | RM299/mo | 100,000 | 10,000 | 50 |
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
| Plan | Price | Contacts | Broadcast sending |
|---|---|---|---|
| Free | RM0 | 1,000 | 4,000 emails / month |
| Starter | RM129/mo | 5,000 | Unlimited |
| Growth | RM449/mo | 25,000 | Unlimited |
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.
| Status | What it means |
|---|---|
| Accepted | We handed the message to the mail servers and it is on its way. This is the normal result of a successful send. |
| Delivered | The receiving mail server confirmed it took the message for the recipient. Most sends go from Accepted to Delivered within seconds. |
| Bounced | The 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. |
| Complained | The recipient marked the email as spam. The address is suppressed automatically, and a high complaint rate can pause your account. |
| Rejected | Sendscape 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. |
| Failed | The 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.
# 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"