Send your first email in 5 minutes
From zero to a delivered email — using the REST API, SMTP, or your language of choice.
Create an account
Go to app.quolle.com/register and create your account. The Starter plan is free forever with 3,000 emails/month.
Add and verify your domain
Go to Domains → Add domain and enter your sending domain
(e.g. mail.yourdomain.com). You'll be given DNS records to add.
If your domain uses Cloudflare, you can add all records automatically with one click.
See the full guide: Domain Verification.
Get your API key
Go to API Keys → Create Key. Give it a name and copy the key —
it starts with qle_ and is shown only once. Store it
in your environment variables, never in source code.
Send your first email
Replace qle_your_api_key and your domain in the examples below.
curl -X POST https://api.quolle.com/v1/emails/send \
-H "Authorization: Bearer qle_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"from": "hello@mail.yourdomain.com",
"to": "customer@example.com",
"subject": "Welcome!",
"html": "<h1>Welcome to our platform</h1>"
}'
const response = await fetch(
"https://api.quolle.com/v1/emails/send",
{
method: "POST",
headers: {
"Authorization": "Bearer qle_your_api_key",
"Content-Type": "application/json"
},
body: JSON.stringify({
from: "hello@mail.yourdomain.com",
to: "customer@example.com",
subject: "Welcome!",
html: "<h1>Welcome to our platform</h1>"
})
}
);
const data = await response.json();
console.log(data.id); // email ID for tracking
import requests
response = requests.post(
"https://api.quolle.com/v1/emails/send",
headers={
"Authorization": "Bearer qle_your_api_key",
"Content-Type": "application/json"
},
json={
"from": "hello@mail.yourdomain.com",
"to": "customer@example.com",
"subject": "Welcome!",
"html": "<h1>Welcome to our platform</h1>"
}
)
data = response.json()
print(data["id"]) # email ID for tracking
<?php
// Using Guzzle
$client = new \GuzzleHttp\Client();
$response = $client->post(
'https://api.quolle.com/v1/emails/send',
[
'headers' => [
'Authorization' => 'Bearer qle_your_api_key',
'Content-Type' => 'application/json',
],
'json' => [
'from' => 'hello@mail.yourdomain.com',
'to' => 'customer@example.com',
'subject' => 'Welcome!',
'html' => '<h1>Welcome to our platform</h1>',
],
]
);
$data = json_decode($response->getBody(), true);
echo $data['id']; // email ID for tracking
// --- Laravel: use SMTP instead (see smtp.html) ---
// config/mail.php → mailers → 'avianise' => smtp transport
A successful response looks like:
{
"id": "a1b2c3d4-...",
"status": "queued",
"message": "Email queued successfully"
}
Check your logs
Go to Logs in the dashboard to see delivery status in real time.
Status flows: queued → sent → delivered.
Bounces and failures appear immediately.
For real-time delivery notifications to your backend, set up webhooks.
Sending options
HTML and plain text
You can send HTML email, plain text, or both. When both are provided, email clients choose the best version to display.
{
"from": "hello@mail.yourdomain.com",
"to": "customer@example.com",
"subject": "Your invoice",
"html": "<p>Your invoice is attached.</p>",
"text": "Your invoice is attached."
}
Reply-to and CC
{
"from": "noreply@mail.yourdomain.com",
"to": "customer@example.com",
"replyTo": "support@yourdomain.com",
"subject": "Your receipt"
}
Batch sending
Send up to 50 emails in a single request:
POST /v1/emails/batch
{
"emails": [
{ "from": "...", "to": "user1@example.com", "subject": "...", "html": "..." },
{ "from": "...", "to": "user2@example.com", "subject": "...", "html": "..." }
]
}
Next steps
- Full API Reference — every endpoint documented
- SMTP Setup — use Laravel, Django, Nodemailer, or any SMTP client
- Webhooks — get notified of delivery events
- Domain Verification — improve deliverability with proper DNS