SendNeo Quickstart
SendNeo Quickstart
SendNeo gives one account a transactional email API and newsletter tools. This guide sends a test message first, then walks through a live send from a verified domain.
1. Create an account
Open SendNeo and create an account. New accounts start in review. While review is in progress, a live key can send only to your own verified team email addresses. That review usually finishes within one business day and helps keep the shared sending reputation clean. A test key works fully while you wait.
2. Add and verify a domain
In the dashboard, open Domains, add the domain you want to send from, and publish the DNS records SendNeo displays. SendNeo gives you three DKIM CNAME records, a custom MAIL FROM subdomain, and a recommended DMARC record. The domain guide explains each record.
Use a sending address such as hello@mail.example.com. A subdomain keeps mail-specific DNS and reputation separate from your main website domain.
3. Create an API key
Create a key under API keys and copy it once. Live keys start with sn_live_; test keys start with sn_test_. Store the key in an environment variable rather than committing it to source control.
export SENDNEO_API_KEY='sn_test_your_key'
4. Send with curl
The API base URL is https://sendneo.yorkermedia.com/api. SMTP support is coming soon; use the API or MCP server for launch integrations.
curl https://sendneo.yorkermedia.com/api/emails \
-X POST \
-H "Authorization: Bearer $SENDNEO_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: welcome-001" \
-d '{
"from": "Acme <hello@mail.example.com>",
"to": ["delivered@test.sendneo.dev"],
"subject": "Your first SendNeo message",
"html": "<h1>It works</h1><p>This is a test email.</p>",
"text": "It works. This is a test email."
}'
A successful request returns an ID:
{"id":"email_01J..."}
Keep that ID for status checks with GET /emails/{id}.
5. Send with Node.js
The built-in fetch available in current Node.js releases is enough for a first request.
const response = await fetch('https://sendneo.yorkermedia.com/api/emails', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SENDNEO_API_KEY}`,
'Content-Type': 'application/json',
'Idempotency-Key': 'welcome-001'
},
body: JSON.stringify({
from: 'Acme <hello@mail.example.com>',
to: ['delivered@test.sendneo.dev'],
subject: 'Your first SendNeo message',
html: '<h1>It works</h1><p>This is a test email.</p>',
text: 'It works. This is a test email.'
})
});
if (!response.ok) throw new Error(await response.text());
console.log(await response.json());
6. Send with Python
The example uses requests and reads the key from the environment.
import os
import requests
response = requests.post(
"https://sendneo.yorkermedia.com/api/emails",
headers={
"Authorization": f"Bearer {os.environ['SENDNEO_API_KEY']}",
"Idempotency-Key": "welcome-001",
},
json={
"from": "Acme <hello@mail.example.com>",
"to": ["delivered@test.sendneo.dev"],
"subject": "Your first SendNeo message",
"html": "<h1>It works</h1><p>This is a test email.</p>",
"text": "It works. This is a test email.",
},
timeout=30,
)
response.raise_for_status()
print(response.json())
Test mode
Test sends never reach a real inbox and are free and unlimited. A test key is accepted anywhere a live key is accepted. Use these deterministic recipients:
| Recipient | Result |
|---|---|
delivered@test.sendneo.dev |
delivered |
bounced@test.sendneo.dev |
bounced |
complained@test.sendneo.dev |
complained |
| Any other address | delivered |
A test request may contain at most 50 recipients. See Test mode for status checks and integration-test ideas.
Move to live mail
After the domain is verified and review opens live sending, change SENDNEO_API_KEY to your sn_live_ key and use a real recipient. Add an idempotency key to every request that your application may retry. Read Sending email before adding attachments, batch sends, or schedules, and Deliverability before importing a list.