Send your first email in 5 minutes

From zero to a delivered email — using the REST API, SMTP, or your language of choice.

1

Create an account

Go to app.quolle.com/register and create your account. The Starter plan is free forever with 3,000 emails/month.

2

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.

3

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.

4

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"
}
5

Check your logs

Go to Logs in the dashboard to see delivery status in real time. Status flows: queuedsentdelivered. 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