Создание API ключа

Создание API ключа доступно по ссылке: https://beta.rusender.ru/api.

Подробную информацию о создании API ключа можно прочитать в нашей Базе знаний.

Важно: тестовые письма необходимо слать только на существующие email адреса, иначе ключ будет забанен.

Роут отправки письма (с готовым HTML)

POST /v1/external-mails/send

В заголовке «X-Api-Key» необходимо передать строкой ключ API для аутентификации.

Отправка письма с HTML/текстовым содержимым. Необходимо указать хотя бы одно из полей html или text.

Пример тела запроса

{
  "mail": {
    "to": {
      "email": "recipient@example.com",
      "name": "Recipient Name"
    },
    "from": {
      "email": "sender@example.com",
      "name": "Sender Name"
    },
    "subject": "Тема письма",
    "html": "<h1>Привет!</h1><p>Содержимое письма</p>",
    "text": "Привет! Содержимое письма",
    "previewTitle": "Прехедер письма",
    "headers": {},
    "cc": "copy1@example.com,copy2@example.com",
    "bcc": "hidden@example.com",
    "attachments": [{ "document.pdf": "<base64-encoded content>" }, { "image.png": "<base64-encoded content>" }]
  },
  "idempotencyKey": "unique-key-123"
}

Отправка письма с использованием шаблона RuSender

POST /v1/external-mails/send-by-template

В заголовке «X-Api-Key» передать строкой ключ API для аутентификации.

Отправка письма по шаблону. Вместо html/text указывается idTemplateMailUser и params.

Пример тела запроса

{
  "mail": {
    "to": {
      "email": "recipient@example.com",
      "name": "Recipient Name"
    },
    "from": {
      "email": "sender@example.com",
      "name": "Sender Name"
    },
    "subject": "Тема письма",
    "idTemplateMailUser": 42,
    "params": {
      "firstName": "Name",
      "orderNumber": 12345
    },
    "previewTitle": "Прехедер письма",
    "headers": {},
    "cc": "copy@example.com",
    "bcc": "hidden@example.com",
    "attachments": [{ "document.pdf": "<base64-encoded content>" }]
  },
  "idempotencyKey": "unique-key-456"

Описание полей

ПолеТипОбязательноеОписание
mail.to.emailstring (email)даEmail получателя
mail.to.namestringнетИмя получателя
mail.from.emailstring (email)даEmail отправителя
mail.from.namestringнетИмя отправителя
mail.subjectstringдаТема письма
mail.htmlstringда*HTML-содержимое письма
mail.textstringда*Текстовое содержимое письма
mail.idTemplateMailUsernumberда**ID шаблона
mail.paramsobjectнет**Параметры подстановки в шаблон
mail.previewTitlestringнетПрехедер письма
mail.headersobjectнетДополнительные заголовки письма
mail.ccstringнетКопия — email через запятую
mail.bccstringнетСкрытая копия — email через запятую
mail.attachmentsarrayнетВложения (макс. 20 шт.). Каждый элемент — объект
{ "имя_файла": "base64" }
idempotencyKeystringнетКлюч идемпотентности. Если не указан — в ответе будет warning

* Для /v1/external-mails/send необходимо указать хотя бы одно из полей html или text.

** Для /v1/external-mails/send-by-template необходимо указать idTemplateMailUser и params если такие есть в шаблоне.

Рекомендации по использованию

Мы настоятельно рекомендуем всегда передавать свой уникальный idempotencyKey.

Использование пользовательского ключа идемпотентности считается необходимым для надёжного управления повторными запросами.

Механизм автоматического определения повторов без ключа существует только для обратной совместимости и базовой защиты от дублирования, но не гарантирует отсутствие пропущенных или лишних отправок.

Отправка с использованием ключа идемпотентности

Если в течение одного часа поступает повторный запрос на отправку письма с полностью совпадающими параметрами:

  • From (отправитель);
  • To (получатель);
  • Body (тело письма);
  • Subject (заголовок);
  • Attachments (вложения).

Тогда:

  • без ключа идемпотентности API отвечает кодом 201 и возвращает тот же uuid письма, что и в первом запросе, повторная отправка не создаёт нового письма;
  • с ключом идемпотентности (idempotencyKey, передаётся вне блока mail) письма считаются разными при различающихся значениях ключа и будут отправлены повторно.

Примечания

  • Сервис ограничивает частоту запросов: допускается не более 10 запросов в секунду с одного IP-адреса.
  • Кодировку указать нельзя, всегда используется UTF-8;
  • Запрос принимает любые системные заголовки, но те которые проставляются нами — имеют приоритет, а именно: Return-Path, List-Unsubscribe, Errors-To, X-Complaints-To, Precedence, Feedback-ID, X-SenderName-MailID, X-Mailru-Msgtype, X-Postmaster-Msgtype.

Возможные ответы сервера

200 OK — Успешная отправка

Письмо принято в обработку.

{
  "uuid": "550e8400-e29b-41d4-a716-446655440000",
  "additionalRecipients": [
    { "uuid": "661e8400-e29b-41d4-a716-446655440001" },
    { "error": "Invalid email \"bad-email\" — does not conform to RFC 5322 or RFC 6854 formatting standards." }
  ],
  "warning": "Idempotency key not provided."
}
ПолеТипОписание
uuidstring (uuid)UUID отправленного письма
additionalRecipientsarrayМассив результатов для дополнительных получателей (cc/bcc). Каждый элемент — либо
{ uuid } (успех), либо { error } (невалидный email)
warningstring \ undefinedПредупреждение. Возвращается "Idempotency key not provided.", если не передан idempotencyKey

400 Bad Request — Ошибка валидации

Возникает при невалидном теле запроса или при ошибках вложений.

{
  "message": "Attachments size more than allowed",
  "statusCode": 400
}

Возможные причины:

СообщениеОписание
Attachments parse failedВложения не удалось распарсить (невалидный base64 и т.д.)
Attachments size more than allowedСуммарный размер вложений превышает допустимый лимит
Attachments type forbiddenТип файла вложения запрещён
HTML template is not validHTML-шаблон невалиден (для /send-by-template)

401 Unauthorized — Невалидный API-ключ

API-ключ не прошёл проверку (невалидный ключ).

{
  "message": "Invalid API key",
  "statusCode": 401
}

402 Payment Required — Недостаточно средств

На балансе пользователя недостаточно ресурсов для отправки письма.

{
  "message": "Is not enough resource on user balance",
  "statusCode": 402
}

403 Forbidden — API-ключ не активен

API-ключ найден, но деактивирован.

{
  "message": "API key is not active",
  "statusCode": 403
}

404 Not Found — Ресурс не найден

Один из необходимых ресурсов не найден.

{
  "message": "ExternalMailApiKey not found",
  "statusCode": 404
}

Возможные варианты сообщений:

СообщениеОписание
ExternalMailApiKey not foundAPI-ключ с указанным идентификатором не существует
User Domain not foundДомен отправителя не найден / не привязан к пользователю
TemplateMailUser not found by idШаблон письма не найден (для /send-by-template)
MailUuid not foundВнутренняя ошибка — UUID письма не найден
{
  "message": "ExternalMailApiKey not found",
  "statusCode": 404
}

422 Unprocessable Entity — Получатель недоступен

Письмо не может быть доставлено данному получателю.

{
  "message": "Email receiver doesn't exist",
  "statusCode": 422
}

Возможные варианты:

СообщениеОписание
Email receiver unsubscribed from this API key mailsПолучатель отписался от рассылок данного API-ключа
Email receiver complained from this API key mailsПолучатель пожаловался на рассылки данного API-ключа
Email receiver doesn't existEmail получателя не существует (hard bounce)
Email receiver unavailableEmail получателя временно недоступен (soft bounce)
Template not found by templateIdШаблон письма не найден (для /send-by-template)

500 Internal Server Error — Внутренняя ошибка сервера

Непредвиденная ошибка на стороне сервера.

{
  "message": "Internal Server Error",
  "statusCode": 500
}

503 Service Unavailable — Сервис недоступен

Сервис обработки писем временно недоступен.

{
  "message": "Service unavailable",
  "statusCode": 503
}

Примеры использования API

PHP

$url = 'https://api.rusender.ru/api/v1/external-mails/send';
$data = array(
   'idempotencyKey' => 'unique-key-string',
   'mail' => array(
       'to' => array(
           'email' => 'user@example.com',
           'name' => 'string'
       ),
       'from' => array(
           'email' => 'user@example.com',
           'name' => 'string'
       ),
       'subject' => 'string',
       'previewTitle' => 'string',
       'html' => 'string'
   )
);
$headers = array(
   'Content-Type' => 'application/json',
   'X-Api-Key' => 'YOUR_API_KEY'
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

Python

import requests
import json
url = 'https://api.rusender.ru/api/v1/external-mails/send'
data = {
    'idempotencyKey': 'unique-key-string',
    'mail': {
        'to': {
            'email': 'user@example.com',
            'name': 'string'
        },
        'from': {
            'email': 'user@example.com',
            'name': 'string'
        },
        'subject': 'string',
        'previewTitle': 'string',
        'html': 'string'
    }
}
headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.post(url, json=data, headers=headers)

Node.js

const axios = require('axios');
const url = 'https://api.rusender.ru/api/v1/external-mails/send';
const data = {
    idempotencyKey: 'unique-key-string',
    mail: {
        to: {
            email: 'user@example.com',
            name : 'string'
        },
        from: {
            email: 'user@example.com',
            name: 'string'
        },
        subject: 'string',
        previewTitle: 'string',
        html: 'string'
    }
};
const headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
};
axios.post(url, data, { headers })
    .then(response => {
        // Обработка ответа API
    })
    .catch(error => {
        // Обработка ошибки
    });

JavaScript

const url = 'https://api.rusender.ru/api/v1/external-mails/send';
const data = {
    idempotencyKey: 'unique-key-string',
    mail: {
        to: {
            email: 'user@example.com',
            name: 'string'
        },
        from: {
            email: 'user@example.com',
            name: 'string'
        },
        subject: 'string',
        previewTitle: 'string',
        html: 'string'
        }
    };
const headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
};
fetch(url, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify(data)
})
    .then(response => response.json())
    .then(data => {
        // Обработка ответа API
    })
    .catch(error => {
        // Обработка ошибки
    });

Примеры использования API с шаблоном письма RuSender

PHP

$url = 'https://api.rusender.ru/api/v1/external-mails/send-by-template';
$data = array(
   'idempotencyKey' => 'unique-key-string',
   'mail' => array(
       'to' => array(
           'email' => 'user@example.com',
           'name' => 'string'
       ),
       'from' => array(
           'email' => 'user@example.com',
           'name' => 'string'
       ),
       'subject' => 'string',
       'previewTitle' => 'string',
       'idTemplateMailUser' => number,
       'params' => array(
           'test' => 'string',
           'test1' => 'string',
           'test2' => 'string'
       )
   )
);
$headers = array(
   'Content-Type' => 'application/json',
   'X-Api-Key' => 'YOUR_API_KEY'
);
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
curl_close($ch);

Python

import requests
import json
url = 'https://api.rusender.ru/api/v1/external-mails/send-by-template'
data = {
    'idempotencyKey': 'unique-key-string',
    'mail': {
        'to': {
            'email': 'user@example.com',
            'name': 'string'
        },
        'from': {
            'email': 'user@example.com',
            'name': 'string'
        },
        'subject': 'string',
        'previewTitle': 'string',
        'idTemplateMailUser': number,
        'params': {
            'test': 'string',
            'test1': 'string',
            'test2': 'string'
        }
    }
}
headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
}
response = requests.post(url, json=data, headers=headers)

Node.js

const axios = require('axios');
const url = 'https://api.rusender.ru/api/v1/external-mails/send-by-template';
const data = {
    idempotencyKey: 'unique-key-string',
    mail: {
        to: {
            email: 'user@example.com',
            name: 'string'
        },
        from: {
            email: 'user@example.com',
            name: 'string'
        },
        subject: 'string',
        previewTitle: 'string',
        idTemplateMailUser: number,
        params: {
            test: 'string',
            test1: 'string',
            test2: 'string'
        }
    }
};
const headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
};
axios.post(url, data, { headers })
    .then(response => {
        // Обработка ответа API
    })
    .catch(error => {
        // Обработка ошибки
    });

JavaScript

const url = 'https://api.rusender.ru/api/v1/external-mails/send-by-template';
const data = {
    idempotencyKey: 'unique-key-string',
    mail: {
        to: {
            email: 'user@example.com',
            name: 'string'
        },
        from: {
            email: 'user@example.com',
            name: 'string'
        },
        subject: 'string',
        previewTitle: 'string',
        idTemplateMailUser: number,
        params: {
            test: 'string',
            test1: 'string',
            test2: 'string'
        }
    }
};
const headers = {
    'Content-Type': 'application/json',
    'X-Api-Key': 'YOUR_API_KEY'
};
fetch(url, {
    method: 'POST',
    headers: headers,
    body: JSON.stringify(data)
})
    .then(response => response.json())
    .then(data => {
        // Обработка ответа API
    })
    .catch(error => {
        // Обработка ошибки
    });

Если запрос возвращает ошибку: «Неверный ключ API», замените код передачи API-ключа на:
$headers = array( 'Content-Type: application/json', 'X-Api-Key: YOUR_API_KEY');

Ограничения по прикрепляемым файлам и размеру

Ограничение на размер тела запроса5 мб
Ограничение на общий размер вложений в письме5 мб
Ограничение на количество вложений в письме20 штук
Ограничение на вложения в письме (тип файла)ADE, ADP, APK, APPX, APPXBUNDLE, BAT, CAB, CHM, CMD, COM, CPL, DIAGCAB, DIAGCFG, DIAGPACK, DLL, DMG, EX, EX_, EXE, HTA, IMG, INS, ISO, ISP, JAR, JNLP, JS, JSE, LIB, LNK, MDE, MSC, MSI, MSIX, MSIXBUNDLE, MSP, MST, NSH, PIF, PS1, SCR, SCT, SHB, SYS, VB, VBE, VBS, VHD, VXD, WSC, WSF, WSH, XLL.

Дата публикации Дата публикации: 2 сентября 2025 Обновлено: 26 февраля 2026