Get an API key, send one email with the built-in fetch against POST /v1/send, and find it in your send log. No package to install.
Create a free account and sendvia issues a key immediately: 250 emails a day on 1 domain, enough to work through this guide. Find it on the Account page, prefixed sv_live_. Every sample below writes it as a placeholder:
sv_live_xxxxxxxxxxxxxxxxxxxxxxxx
You also need a domain verified in your account, since the call below sends from an address on it. Add one under Domains first if you have not, and give its DNS records time to propagate.
sendvia ships no Node SDK, so a plain fetch call on Node 18 or later is all this needs, no package install required.
const response = await fetch('https://api.sendvia.io/v1/send', {
method: 'POST',
headers: {
'Authorization': 'Bearer sv_live_xxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type': 'application/json',
},
body: JSON.stringify({
from: '[email protected]',
to: '[email protected]',
subject: 'Hello from sendvia',
html: '<p>This is a test email sent through sendvia.</p>',
}),
});
const data = await response.json();
console.log(data);
from, to and subject are required, along with at least one of html or text. Do not put an @sendvia.io address in from: sendvia matches the sending domain against the domains verified on your own account, and sendvia.io is never on that list for you, so the request would fail before it ever reaches Amazon. A successful call logs the send back to your console:
{ success: true, message_id: '0102018f1234abcd-...', log_id: 42 }
log_id identifies this email's row in your account's send log, which the next step reads back.
Every send ends up in the same place no matter how it was sent: the dashboard's History page, or the API directly.
curl "https://api.sendvia.io/v1/[email protected]" \
-H "Authorization: Bearer sv_live_xxxxxxxxxxxxxxxxxxxxxxxx"
{
"total": 1,
"limit": 25,
"offset": 0,
"logs": [
{
"id": 42,
"to_address": "[email protected]",
"from_address": "[email protected]",
"subject": "Hello from sendvia",
"status": "delivered",
"error_message": null,
"sent_at": "2026-08-20 10:03:01",
"delivered_at": "2026-08-20 10:05:01"
}
]
}
The status reads sent as soon as the fetch call above resolves. What happens next matters: sendvia never receives a delivery confirmation from the recipient's mail server. Two minutes after a clean send it marks the message delivered on its own, an inference from the absence of a bounce rather than a receipt from anywhere. A real bounce or failure event overwrites that status when one arrives; nothing ever confirms delivery the way it confirms failure. Free-plan logs keep for 7 to 90 days, longer on premium.
A new SES account starts inside Amazon's sandbox: 200 emails a day, sent only to recipient addresses you have verified yourself in the SES console, until Amazon finishes reviewing your account for production access, which usually takes 12 to 24 hours. Send to an address outside that list while sandboxed and the fetch call above resolves with a 502, and the JSON body carries AWS's own rejection reason:
{ error: 'SES send failed: ...', log_id: 42 }
Add the test recipient to your verified addresses in the SES console, or wait for production access, which lifts the restriction for every address at once.
Before sendvia ever calls AWS, it checks the domain on your from address against the domains verified on your account. A domain you have not added yet, or one still waiting on its DNS, fails that check straight away:
{ error: 'The domain "yourdomain.com" has not been verified. Add and verify it in the dashboard first.' }
Add the domain under Domains, publish the records sendvia generates, and the same request goes through once the check passes.
| Symptom | Cause | Fix |
|---|---|---|
HTTP 502, SES send failed: ... | SES sandbox: the recipient is not verified | Verify the recipient in SES, or request production access |
| HTTP 422, domain not verified | The from domain is not verified on your account | Add and verify the domain under Domains |