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.