Get an API key, send one email with a raw cURL request against POST /v1/send, and find it in your send log. No SDK required.
Create a free account and sendvia issues a key straight away: 250 emails a day on 1 domain, enough to finish this guide. The key sits on the Account page, starts with sv_live_, and every example below writes it as a placeholder:
sv_live_xxxxxxxxxxxxxxxxxxxxxxxx
You also need a domain verified in your account, because the next step sends from an address on it. Add one under Domains if you have not already; DNS propagation is usually the slow part, not sendvia's own check.
sendvia has no PHP SDK, official or otherwise, so this is the same tool the platform's own backend uses to talk to SES: a cURL request with a JSON body, authenticated with a Bearer token.
<?php
$ch = curl_init('https://api.sendvia.io/v1/send');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer sv_live_xxxxxxxxxxxxxxxxxxxxxxxx',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'from' => '[email protected]',
'to' => '[email protected]',
'subject' => 'Hello from sendvia',
'html' => '<p>This is a test email sent through sendvia.</p>',
]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
from, to and subject are required, and you need at least one of html or text. Never write an @sendvia.io address into from: sendvia checks the sending domain against the domains verified on your own account, and sendvia.io will never be one of them, so that call fails before it reaches Amazon. A successful run prints the send back to you:
{"success":true,"message_id":"0102018f1234abcd-...","log_id":42}
log_id is the row this email now has in your account's send log, which is exactly what the next step reads.
Every send lands in the same place regardless of how it was sent, viewable in the dashboard under History or through the API:
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 moves from queued to sent as soon as the request returns. sendvia does not receive a delivery confirmation from the recipient's mail server: it marks a sent message delivered automatically two minutes later if nothing has gone wrong, which is an inference from silence rather than a receipt. A bounce or a failure arrives as a real event and overwrites that status; a genuine delivery confirmation never does. Logs like this one stick around for 7 to 90 days, depending on your plan.
A new SES account starts inside Amazon's sandbox, capped at 200 emails a day and restricted to recipient addresses you have verified yourself in the SES console, pending an AWS review that typically takes 12 to 24 hours. Send to any other address while you are still inside it and the call above comes back as an HTTP 502, with AWS's own rejection reason in the error field:
{"error":"SES send failed: ...","log_id":42}
Verify [email protected] (or whichever address you are testing with) in the SES console while you wait, or request production access and the cap lifts for every recipient at once.
sendvia checks the domain on your from address against the domains verified on your account before it ever calls AWS. Get that wrong, typically by using a domain you have not added yet, and the response is immediate:
{"error":"The domain \"yourdomain.com\" has not been verified. Add and verify it in the dashboard first."}
Add the domain under Domains, publish the DNS records sendvia gives you, and wait for the check to pass before sending from it.
| 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 |