Skip to main content
POST
/
senders
Create a sender
curl --request POST \
  --url https://api.sendkit.dev/senders \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "name": "John Doe",
  "username": "john",
  "domain_id": "550e8400-e29b-41d4-a716-446655440000",
  "reply_to": "reply@yourdomain.com"
}
'
import requests

url = "https://api.sendkit.dev/senders"

payload = {
"name": "John Doe",
"username": "john",
"domain_id": "550e8400-e29b-41d4-a716-446655440000",
"reply_to": "reply@yourdomain.com"
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.text)
const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
name: 'John Doe',
username: 'john',
domain_id: '550e8400-e29b-41d4-a716-446655440000',
reply_to: 'reply@yourdomain.com'
})
};

fetch('https://api.sendkit.dev/senders', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));
<?php

$curl = curl_init();

curl_setopt_array($curl, [
CURLOPT_URL => "https://api.sendkit.dev/senders",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'name' => 'John Doe',
'username' => 'john',
'domain_id' => '550e8400-e29b-41d4-a716-446655440000',
'reply_to' => 'reply@yourdomain.com'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}
package main

import (
"fmt"
"strings"
"net/http"
"io"
)

func main() {

url := "https://api.sendkit.dev/senders"

payload := strings.NewReader("{\n \"name\": \"John Doe\",\n \"username\": \"john\",\n \"domain_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"reply_to\": \"reply@yourdomain.com\"\n}")

req, _ := http.NewRequest("POST", url, payload)

req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")

res, _ := http.DefaultClient.Do(req)

defer res.Body.Close()
body, _ := io.ReadAll(res.Body)

fmt.Println(string(body))

}
HttpResponse<String> response = Unirest.post("https://api.sendkit.dev/senders")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"name\": \"John Doe\",\n \"username\": \"john\",\n \"domain_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"reply_to\": \"reply@yourdomain.com\"\n}")
.asString();
require 'uri'
require 'net/http'

url = URI("https://api.sendkit.dev/senders")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"name\": \"John Doe\",\n \"username\": \"john\",\n \"domain_id\": \"550e8400-e29b-41d4-a716-446655440000\",\n \"reply_to\": \"reply@yourdomain.com\"\n}"

response = http.request(request)
puts response.read_body
{
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "name": "John Doe",
  "username": "john",
  "email": "john@yourdomain.com",
  "reply_to": "reply@yourdomain.com",
  "domain": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "name": "yourdomain.com",
    "status": "verified",
    "region": "us-east-2",
    "open_tracking": true,
    "click_tracking": true,
    "tls": "opportunistic",
    "sending_enabled": true,
    "created_at": "2026-03-03 10:00:00",
    "updated_at": "2026-03-03 10:00:00"
  },
  "created_at": "2026-03-03 10:00:00",
  "updated_at": "2026-03-03 10:00:00"
}
{
"message": "Invalid API key."
}
{
"message": "The email field is required."
}

Authorizations

Authorization
string
header
required

API key from your SendKit dashboard. Pass it as a Bearer token in the Authorization header.

Body

application/json
name
string
required

The sender display name.

Maximum string length: 255
Example:

"John Doe"

username
string
required

The username part of the email address. May only contain letters, numbers, dots, underscores, percent signs, plus signs, and hyphens. Must be unique per domain.

Maximum string length: 64
Example:

"john"

domain_id
string<uuid>
required

The ID of a verified domain that belongs to your account.

Example:

"550e8400-e29b-41d4-a716-446655440000"

reply_to
string<email> | null

The reply-to email address.

Maximum string length: 255
Example:

"reply@yourdomain.com"

Response

Sender created successfully

id
string<uuid>

Unique identifier.

Example:

"550e8400-e29b-41d4-a716-446655440000"

name
string

The sender display name.

Example:

"John Doe"

username
string

The username part of the sender email address.

Example:

"john"

email
string<email>

The full sender email address (computed from username and domain).

Example:

"john@yourdomain.com"

reply_to
string<email> | null

The reply-to email address.

Example:

"reply@yourdomain.com"

domain
object

The domain associated with this sender (without DNS records).

created_at
string<date-time>

When the sender was created.

Example:

"2026-03-03 10:00:00"

updated_at
string<date-time>

When the sender was last updated.

Example:

"2026-03-03 10:00:00"