NAV Navigation
Документация UniOne
HTTP PHP Python Ruby C# Java Node.JS
 

Web API v1.17.1

Прокрутите вниз для просмотра примеров кода, а также примеров запросов и ответов. Выберите закладку с нужным языком примера кода, либо сделайте выбор языка с помощью мобильного меню.

Все методы UniOne API принимают только HTTPS POST-запросы в формате JSON размером максимум 10 мегабайт и возвращают ответ тоже в JSON. Все запросы отправляются на адрес, зависящий от дата-центра регистрации пользователя.

Aутентификация

Для вызова любого метода необходима аутентификация с помощью API-ключа пользователя или проекта, любым из этих двух способов:

API-ключ пользователя можно узнать на странице настроек. API-ключ проекта можно получить на странице проектов, либо с помощью API-методов.

Обработка ошибок

Вызов API метода завершается HTTP-кодом 200 OK в случае успеха или HTTP кодом 4xx/5xx в случае ошибки:

HTTP-код Описание
200 OK – Запрос успешно обработан.
400 Bad Request – Запрос ошибочен. Проверьте формат запроса и состав параметров.
401 Unauthorized – Неверный API-ключ.
403 Forbidden – Нет прав для обработки запроса.
404 Not Found – Не найден указанный метод.
413 Request Entity Too Large – Слишком большой запрос, уменьшите его размер до 10 МB.
429 Too many requests – Слишком много запросов, уменьшите их частоту.
500 Internal Server Error – Внутренняя ошибка серверов UniOne. Попробуйте повторить запрос позднее.
503 Service Unavailable – Сервера временно отключены. Попробуйте позднее.

HTTP-код ошибки даёт только общую информацию о причинах. Обычно в теле ответа возвращается JSON-объект с детальным описанием и API-кодом ошибки. Подробнее узнать об этом можно в разделе Ошибки API.

Email методы

Эта группа методов связана с отправкой email.

email-send

POST https://eu1.unione.io/ru/transactional/api/v1/email/send.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"message": {
"recipients": [
{
"email": "user@example.com",
"substitutions": {
"CustomerId": 12452,
"to_name": "John Smith"
},
"metadata": {
"campaign_id": "email61324",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"skip_unsubscribe": 0,
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"message" => [
"recipients" => [
[
"email" => "user@example.com",
"substitutions" => [
"CustomerId" => 12452,
"to_name" => "John Smith"
],
"metadata" => [
"campaign_id" => "email61324",
"customer_hash" => "b253ac7"
]
]
],
"template_id" => "string",
"skip_unsubscribe" => 0,
"template_engine" => "simple",
"global_substitutions" => [
"property1" => "string",
"property2" => "string"
],
"global_metadata" => [
"property1" => "string",
"property2" => "string"
],
"body" => [
"html" => "<b>Hello, {{to_name}}</b>",
"plaintext" => "Hello, {{to_name}}",
"amp" => "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body[visibility:hidden]</style></head><body> Hello, AMP4EMAIL world.</body></html>"
],
"subject" => "string",
"from_email" => "user@example.com",
"from_name" => "John Smith",
"reply_to" => "user@example.com",
"track_links" => 0,
"track_read" => 0,
"headers" => [
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
],
"attachments" => [
[
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
]
],
"inline_attachments" => [
[
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
]
],
"options" => [
"unsubscribe_url" => "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id" => 0,
"smtp_pool_id" => "string"
]
]
];

try {
$response = $client->request('POST','email/send.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"message": {
"recipients": [
{
"email": "user@example.com",
"substitutions": {
"CustomerId": 12452,
"to_name": "John Smith"
},
"metadata": {
"campaign_id": "email61324",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"skip_unsubscribe": 0,
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
}
r = requests.post(base_url+'/email/send.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"message" => {
"recipients" => [
{
"email" => "user@example.com",
"substitutions" => {
"CustomerId" => 12452,
"to_name" => "John Smith"
},
"metadata" => {
"campaign_id" => "email61324",
"customer_hash" => "b253ac7"
}
}
],
"template_id" => "string",
"skip_unsubscribe" => 0,
"template_engine" => "simple",
"global_substitutions" => {
"property1" => "string",
"property2" => "string"
},
"global_metadata" => {
"property1" => "string",
"property2" => "string"
},
"body" => {
"html" => "<b>Hello, {{to_name}}</b>",
"plaintext" => "Hello, {{to_name}}",
"amp" => "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject" => "string",
"from_email" => "user@example.com",
"from_name" => "John Smith",
"reply_to" => "user@example.com",
"track_links" => 0,
"track_read" => 0,
"headers" => {
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments" => [
{
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments" => [
{
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options" => {
"unsubscribe_url" => "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id" => 0,
"smtp_pool_id" => "string"
}
}
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/email/send.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"message\": {"
+" \"recipients\": ["
+" {"
+" \"email\": \"user@example.com\","
+" \"substitutions\": {"
+" \"CustomerId\": 12452,"
+" \"to_name\": \"John Smith\""
+" },"
+" \"metadata\": {"
+" \"campaign_id\": \"email61324\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"skip_unsubscribe\": 0,"
+" \"template_engine\": \"simple\","
+" \"global_substitutions\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"global_metadata\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"body\": {"
+" \"html\": \"<b>Hello, {{to_name}}</b>\","
+" \"plaintext\": \"Hello, {{to_name}}\","
+" \"amp\": \"<!doctype html><html amp4email><head> <meta charset=\\\"utf-8\\\"><script async src=\\\"https://cdn.ampproject.org/v0.js\\\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>\""
+" },"
+" \"subject\": \"string\","
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"John Smith\","
+" \"reply_to\": \"user@example.com\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ],"
+" \"options\": {"
+" \"unsubscribe_url\": \"https://example.org/unsubscribe/{{CustomerId}}\","
+" \"custom_backend_id\": 0,"
+" \"smtp_pool_id\": \"string\""
+" }"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("email/send.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/email/send.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"message\": {"
+" \"recipients\": ["
+" {"
+" \"email\": \"user@example.com\","
+" \"substitutions\": {"
+" \"CustomerId\": 12452,"
+" \"to_name\": \"John Smith\""
+" },"
+" \"metadata\": {"
+" \"campaign_id\": \"email61324\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"skip_unsubscribe\": 0,"
+" \"template_engine\": \"simple\","
+" \"global_substitutions\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"global_metadata\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"body\": {"
+" \"html\": \"<b>Hello, {{to_name}}</b>\","
+" \"plaintext\": \"Hello, {{to_name}}\","
+" \"amp\": \"<!doctype html><html amp4email><head> <meta charset=\\\"utf-8\\\"><script async src=\\\"https://cdn.ampproject.org/v0.js\\\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>\""
+" },"
+" \"subject\": \"string\","
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"John Smith\","
+" \"reply_to\": \"user@example.com\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ],"
+" \"options\": {"
+" \"unsubscribe_url\": \"https://example.org/unsubscribe/{{CustomerId}}\","
+" \"custom_backend_id\": 0,"
+" \"smtp_pool_id\": \"string\""
+" }"
+" }"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"message": {
"recipients": [
{
"email": "user@example.com",
"substitutions": {
"CustomerId": 12452,
"to_name": "John Smith"
},
"metadata": {
"campaign_id": "email61324",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"skip_unsubscribe": 0,
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/email/send.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/email/send.json

Метод для отправки писем вашим подписчикам.

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

Ограничения:

Если при отправке письма в списке получателей будут некорректно введенные, несуществующие, повторяющиеся, или отписанные адреса, они будут возвращены в ответе с помощью параметра failed_emails, письмо же будет отправлено на все остальные приемлемые адреса. Если все адреса попадут в failed_emails, отправка осуществлена не будет, будет возвращена ошибка c API-кодом 204.

Параметры

Название Тип Описание
message Обязательный
object
Объект, содержащий все свойства отправляемого сообщения.
» recipients Обязательный
array
Массив объектов с email-адресами, подстановками и метаданными получателей.
»» email Обязательный
string(email)
Email-адрес получателя
»» substitutions Опциональный
object
Объект, описывающий подстановки для конкретного получателя (например, имя, товар для показа именно данному получателю - см. Шаблонизаторы). Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • headers
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается. Есть специальная переменная “to_name”, позволяющая задать имя получателя. При подстановке туда “Имя Фамилия” SMTP-заголовок “To” будет выглядить как “Имя Фамилия <email@example.com>”. Длина переменной “to_name” ограничена 78 символами.
»» metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» template_id Опциональный
string(uuid)
Уникальный идентификатор шаблона, созданного ранее методом template/set. Тело шаблона будет подставлено вместо тела письма. Параметр не обязателен для передачи, если тело письма передается явно в параметре “body”. Если передать “body”, “template_id” будет проигнорирован.
» skip_unsubscribe Опциональный
integer
Пропустить или не пропускать добавление стандартного блока со ссылкой отписки к HTML-части письма. 1=пропустить, 0=добавить, по умолчанию 0. Для использования skip_unsubscribe=1 вам надо попросить техподдержку включить такую возможность.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • headers
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Опциональный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner и List-Archive.
» attachments Опциональный
array
Необязательный массив вложений.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Название вложения в формате: “имя.расширение”
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» inline_attachments Опциональный
array
Массив для передачи inline-вложений, например, для включения изображений в письмо вместо подгрузки их по ссылке.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Идентификатор вложения. Если, например, “name”=“IMAGECID”, то для вывода картинки из этого вложения в HTML тексте письма надо указать <img src=“cid:IMAGECID”>
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» options Опциональный
object
Дополнительные опции.
»» unsubscribe_url Опциональный
string
Пользовательская ссылка отписки. Подробнее здесь.
»» custom_backend_id Опциональный
integer
Идентификатор backend-домена, через который отправляется сообщение. Если отсутствует - отправка будет от имени backend-домена, назначенного вашему аккаунту/проекту по умолчанию. Вы можете приобрести один или несколько выделенных IP-адресов и использовать эту опцию для выбора. Обратитесь в техподдержку, чтобы получить право для аккаунта или проекта на использование данной опции и идентификаторы ваших backend-доменов.
»» smtp_pool_id Опциональный
string(uuid)
Идентификатор пула SMTP, через который отправляется сообщение. Если отсутствует - отправка будет через пул, назначенный вашему аккаунту/проекту по умолчанию. Вы можете приобрести один или несколько выделенных IP-адресов и использовать эту опцию для выбора, отправлять письмо через определённые IP или через общий пул. Обратитесь в техподдержку, чтобы получить идентификаторы ваших выделенных IP и общего пула.

200 Ответ

{
"status": "success",
"job_id": "1ZymBc-00041N-9X",
"emails": [
"user@example.com"
],
"failed_emails": {
"email1@gmail.com": "temporary_unavailable",
"bad@address": "invalid",
"email@example.com": "duplicate",
"root@example.org": "permanent_unavailable",
"olduser@example.net": "unsubscribed"
}
}

Структура ответа

HTTP код 200:

Email успешно принят к отправке.

Название Тип Описание
status Обязательный
string
Строка “success”.
job_id Обязательный
string
Идентификатор задания по отправке, может оказаться полезным при выяснении причин сбоев.
emails Опциональный
array
Массив email-адресов, успешно принятых к отправке.
failed_emails Опциональный
array
Массив объектов с email-адресами, не принятыми к отправке, и их статусами, например: [{“email1@gmail.com”: “temporary_unavailable”}]. Возможные состояния адресов, на которые не удалось осуществить отправку:
  • unsubscribed - указанный адрес отписан;
  • invalid - адрес не существует, или введен некорректно;
  • duplicate - адрес повторяется в запросе, повторная отправка на один и тот же email предотвращена;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен, глобально отписан, либо в одном из предыдущих писем нажал “Это спам”.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

email-subscribe

POST https://eu1.unione.io/ru/transactional/api/v1/email/subscribe.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"from_email": "user@example.com",
"from_name": "string",
"to_email": "user@example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"from_email" => "user@example.com",
"from_name" => "string",
"to_email" => "user@example.com"
];

try {
$response = $client->request('POST','email/subscribe.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"from_email": "user@example.com",
"from_name": "string",
"to_email": "user@example.com"
}
r = requests.post(base_url+'/email/subscribe.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"from_email" => "user@example.com",
"from_name" => "string",
"to_email" => "user@example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/email/subscribe.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"string\","
+" \"to_email\": \"user@example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("email/subscribe.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/email/subscribe.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"string\","
+" \"to_email\": \"user@example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"from_email": "user@example.com",
"from_name": "string",
"to_email": "user@example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/email/subscribe.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/email/subscribe.json

Отправить ссылку на (пере)подписку.

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

При вызове отправляется письмо в нейтральном дизайне с ссылкой подписки. При переходе по ссылке из email подписчик перестает быть недоступным для пользователя и/или перестает быть глобально отписанным.

По умолчанию разрешена только одна отправка письма переподписки в сутки. Если вам нужно больше - напишите в техподдержку.

Параметры

Название Тип Описание
from_email Обязательный
string(email)
Адрес отправителя. (Также поддерживается именование поля как “email_address_from”).
from_name Обязательный
string
Имя отправителя. (Также поддерживается именование поля как “name_from”).
to_email Обязательный
string(email)
Адрес получателя. (Также поддерживается именование поля как “email_address_to”).

200 Ответ

{
"status": "success"
}

Структура ответа

HTTP код 200:

Email успешно принят к отправке.

Название Тип Описание
status Обязательный
string
Строка “success”.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

Template методы

Вы можете сохранить шаблон на стороне UniOne и затем ссылаться на него по идентификатору. Это не является обязательным, но крайне рекомендуется в случае повторяющихся email-сообщений или при больших объёмах отправки. UniOne поддерживает два разных синтаксиса для шаблонов, подробнее читайте здесь.

template-set

POST https://eu1.unione.io/ru/transactional/api/v1/template/set.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"template": {
"id": "string",
"name": "string",
"editor_type": "html",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"template" => [
"id" => "string",
"name" => "string",
"editor_type" => "html",
"template_engine" => "simple",
"global_substitutions" => [
"property1" => "string",
"property2" => "string"
],
"global_metadata" => [
"property1" => "string",
"property2" => "string"
],
"body" => [
"html" => "<b>Hello, {{to_name}}</b>",
"plaintext" => "Hello, {{to_name}}",
"amp" => "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body[visibility:hidden]</style></head><body> Hello, AMP4EMAIL world.</body></html>"
],
"subject" => "string",
"from_email" => "user@example.com",
"from_name" => "John Smith",
"reply_to" => "user@example.com",
"track_links" => 0,
"track_read" => 0,
"headers" => [
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
],
"attachments" => [
[
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
]
],
"inline_attachments" => [
[
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
]
]
]
];

try {
$response = $client->request('POST','template/set.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"template": {
"id": "string",
"name": "string",
"editor_type": "html",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}
r = requests.post(base_url+'/template/set.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"template" => {
"id" => "string",
"name" => "string",
"editor_type" => "html",
"template_engine" => "simple",
"global_substitutions" => {
"property1" => "string",
"property2" => "string"
},
"global_metadata" => {
"property1" => "string",
"property2" => "string"
},
"body" => {
"html" => "<b>Hello, {{to_name}}</b>",
"plaintext" => "Hello, {{to_name}}",
"amp" => "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject" => "string",
"from_email" => "user@example.com",
"from_name" => "John Smith",
"reply_to" => "user@example.com",
"track_links" => 0,
"track_read" => 0,
"headers" => {
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments" => [
{
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments" => [
{
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/template/set.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"template\": {"
+" \"id\": \"string\","
+" \"name\": \"string\","
+" \"editor_type\": \"html\","
+" \"template_engine\": \"simple\","
+" \"global_substitutions\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"global_metadata\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"body\": {"
+" \"html\": \"<b>Hello, {{to_name}}</b>\","
+" \"plaintext\": \"Hello, {{to_name}}\","
+" \"amp\": \"<!doctype html><html amp4email><head> <meta charset=\\\"utf-8\\\"><script async src=\\\"https://cdn.ampproject.org/v0.js\\\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>\""
+" },"
+" \"subject\": \"string\","
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"John Smith\","
+" \"reply_to\": \"user@example.com\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ]"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("template/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/template/set.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"template\": {"
+" \"id\": \"string\","
+" \"name\": \"string\","
+" \"editor_type\": \"html\","
+" \"template_engine\": \"simple\","
+" \"global_substitutions\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"global_metadata\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"body\": {"
+" \"html\": \"<b>Hello, {{to_name}}</b>\","
+" \"plaintext\": \"Hello, {{to_name}}\","
+" \"amp\": \"<!doctype html><html amp4email><head> <meta charset=\\\"utf-8\\\"><script async src=\\\"https://cdn.ampproject.org/v0.js\\\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>\""
+" },"
+" \"subject\": \"string\","
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"John Smith\","
+" \"reply_to\": \"user@example.com\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ]"
+" }"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"template": {
"id": "string",
"name": "string",
"editor_type": "html",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/template/set.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/template/set.json

Создать или обновить шаблон.

Если указано поле “id”, система попытается найти шаблон с указанным id и отредактировать его, иначе будет создан новый шаблон.

Ограничения:

Параметры

Название Тип Описание
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Опциональный
string(uuid)
Уникальный идентификатор шаблона.
» name Опциональный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • headers
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Опциональный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Опциональный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner и List-Archive.
» attachments Опциональный
array
Необязательный массив вложений.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Название вложения в формате: “имя.расширение”
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» inline_attachments Опциональный
array
Массив для передачи inline-вложений, например, для включения изображений в письмо вместо подгрузки их по ссылке.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Идентификатор вложения. Если, например, “name”=“IMAGECID”, то для вывода картинки из этого вложения в HTML тексте письма надо указать <img src=“cid:IMAGECID”>
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).

200 Ответ

{
"status": "success",
"template": {
"id": "string",
"name": "string",
"editor_type": "html",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}

Структура ответа

HTTP код 200:

Шаблон успешно задан.

Название Тип Описание
status Обязательный
string
Строка “success”.
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Опциональный
string(uuid)
Уникальный идентификатор шаблона.
» name Опциональный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • headers
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Опциональный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Опциональный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner и List-Archive.
» attachments Опциональный
array
Необязательный массив вложений.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Название вложения в формате: “имя.расширение”
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» inline_attachments Опциональный
array
Массив для передачи inline-вложений, например, для включения изображений в письмо вместо подгрузки их по ссылке.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Идентификатор вложения. Если, например, “name”=“IMAGECID”, то для вывода картинки из этого вложения в HTML тексте письма надо указать <img src=“cid:IMAGECID”>
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

template-get

POST https://eu1.unione.io/ru/transactional/api/v1/template/get.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"id": "string"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"id" => "string"
];

try {
$response = $client->request('POST','template/get.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"id": "string"
}
r = requests.post(base_url+'/template/get.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"id" => "string"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/template/get.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"id\": \"string\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("template/get.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/template/get.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"id\": \"string\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"id": "string"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/template/get.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/template/get.json

Возвращает свойства шаблона по его идентификатору.

Параметры

Название Тип Описание
id Обязательный
string(uuid)
Идентификатор шаблона.

200 Ответ

{
"status": "success",
"template": {
"id": "string",
"name": "string",
"editor_type": "html",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}

Структура ответа

HTTP код 200:

Шаблон успешно возвращён.

Название Тип Описание
status Обязательный
string
Строка “success”.
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Опциональный
string(uuid)
Уникальный идентификатор шаблона.
» name Опциональный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • headers
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Опциональный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Опциональный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner и List-Archive.
» attachments Опциональный
array
Необязательный массив вложений.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Название вложения в формате: “имя.расширение”
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» inline_attachments Опциональный
array
Массив для передачи inline-вложений, например, для включения изображений в письмо вместо подгрузки их по ссылке.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Идентификатор вложения. Если, например, “name”=“IMAGECID”, то для вывода картинки из этого вложения в HTML тексте письма надо указать <img src=“cid:IMAGECID”>
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

template-list

POST https://eu1.unione.io/ru/transactional/api/v1/template/list.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"limit": 50,
"offset": 0
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"limit" => 50,
"offset" => 0
];

try {
$response = $client->request('POST','template/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"limit": 50,
"offset": 0
}
r = requests.post(base_url+'/template/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"limit" => 50,
"offset" => 0
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/template/list.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"limit\": 50,"
+" \"offset\": 0"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("template/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/template/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"limit\": 50,"
+" \"offset\": 0"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"limit": 50,
"offset": 0
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/template/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/template/list.json

Возвращает полный список или часть списка всех шаблонов.

Вы можете просматривать большой список частями, используя параметры “offset” и “limit”. Если возвращено менее “limit” шаблонов - значит, вы достигли конца списка.

Параметры

Название Тип Описание
limit Опциональный
integer
Максимальное количество возвращаемых шаблонов, по умолчанию 50.
offset Опциональный
integer
Индекс первого возращаемого шаблона из списка, считая с нуля.

200 Ответ

{
"status": "success",
"templates": [
{
"id": "string",
"editor_type": "html",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"created": "string",
"user_id": 11344,
"project_id": "6123462132634",
"project_name": "Project 1A"
}
]
}

Структура ответа

HTTP код 200:

Список шаблонов успешно возвращён.

Название Тип Описание
status Обязательный
string
Строка “success”.
templates Обязательный
array
Массив объектов-шаблонов.
» id Опциональный
string(uuid)
Уникальный идентификатор шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • headers
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Опциональный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Опциональный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner и List-Archive.
» attachments Опциональный
array
Необязательный массив вложений.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Название вложения в формате: “имя.расширение”
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» inline_attachments Опциональный
array
Массив для передачи inline-вложений, например, для включения изображений в письмо вместо подгрузки их по ссылке.
»» type Обязательный
string
Тип вложения, см. MIME. Если не уверены, используйте “application/octet-stream”.
»» name Обязательный
string
Идентификатор вложения. Если, например, “name”=“IMAGECID”, то для вывода картинки из этого вложения в HTML тексте письма надо указать <img src=“cid:IMAGECID”>
»» content Обязательный
string(byte)
Содержимое файла в base64. Максимальный размер файла 7Mб (9786710 байт в base64).
» created Обязательный
string(utc-date-time)
Время создания шаблона в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”
» user_id Обязательный
integer
Уникальный идентификатор пользователя.
» project_id Опциональный
string
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной.
» project_name Опциональный
string
Название проекта, уникальное в рамках аккаунта пользователя.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

template-delete

POST https://eu1.unione.io/ru/transactional/api/v1/template/delete.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"id": "string"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"id" => "string"
];

try {
$response = $client->request('POST','template/delete.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"id": "string"
}
r = requests.post(base_url+'/template/delete.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"id" => "string"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/template/delete.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"id\": \"string\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("template/delete.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/template/delete.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"id\": \"string\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"id": "string"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/template/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/template/delete.json

Удаляет шаблон по идентификатору.

Параметры

Название Тип Описание
id Обязательный
string(uuid)
Идентификатор шаблона.

200 Ответ

{
"status": "success"
}

Структура ответа

HTTP код 200:

Шаблон успешно удалён.

Название Тип Описание
status Обязательный
string
Строка “success”.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

Webhook методы

UniOne позволяет вам получать уведомления об изменении статуса доставки письма или спам-блокировках. Вы предоставляете URL и в случае возникновения интересующего вас события мы уведомляем вас путём передачи на этот URL JSON-данных о событии.

Вы можете настроить формат вызова вебхуков (просто JSON или JSON, запакованный в gzip), какие именно события вас интересуют, разрешено ли группировать несколько событий в одном вызове, нужны ли вам такие подробности, как SMTP-ответ сервера или user agent получателя и т.п.

Обратите внимание, что ваш обработчик должен уметь принимать как минимум 5 параллельных вызовов (но вы можете настроить максимально разрешённое количество параллельных вызовов, увеличив их до 100).

Если URL, на который отправляется webhook, недоступен (нет ответа HTTP 200 OK в течение 3 секунд), попытки отправки webhook на этот URL до получения ожидаемого 200 ОК будут продолжаться в течение 24 часов с интервалом в 10 минут с дополнительным параметром retry_count, значение которого будет увеличиваться на 1 с каждой повторной отправкой webhook. Если в течение 24 часов произошло как минимум 10 событий и ни один из многократных вызовов вебхуков об этих событиях не был удачным, то мы считаем обработчик неработоспособным и автоматически устанавливаем его статус в неактивный и сообщаем об этом на email, указанный в личном кабинете.

Формат вебхуков и структура каждого события описаны здесь.

webhook-set

POST https://eu1.unione.io/ru/transactional/api/v1/webhook/set.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"url": "https://yourhost.example.com/unione-webhook",
"status": "active",
"event_format": "json_post",
"delivery_info": 0,
"single_event": 0,
"max_parallel": 10,
"events": {
"spam_block": [
"*"
],
"email_status": [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"url" => "https://yourhost.example.com/unione-webhook",
"status" => "active",
"event_format" => "json_post",
"delivery_info" => 0,
"single_event" => 0,
"max_parallel" => 10,
"events" => [
"spam_block" => [
"*"
],
"email_status" => [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
]
];

try {
$response = $client->request('POST','webhook/set.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"url": "https://yourhost.example.com/unione-webhook",
"status": "active",
"event_format": "json_post",
"delivery_info": 0,
"single_event": 0,
"max_parallel": 10,
"events": {
"spam_block": [
"*"
],
"email_status": [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
r = requests.post(base_url+'/webhook/set.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"url" => "https://yourhost.example.com/unione-webhook",
"status" => "active",
"event_format" => "json_post",
"delivery_info" => 0,
"single_event" => 0,
"max_parallel" => 10,
"events" => {
"spam_block" => [
"*"
],
"email_status" => [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/webhook/set.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"url\": \"https://yourhost.example.com/unione-webhook\","
+" \"status\": \"active\","
+" \"event_format\": \"json_post\","
+" \"delivery_info\": 0,"
+" \"single_event\": 0,"
+" \"max_parallel\": 10,"
+" \"events\": {"
+" \"spam_block\": ["
+" \"*\""
+" ],"
+" \"email_status\": ["
+" \"delivered\","
+" \"opened\","
+" \"clicked\","
+" \"unsubscribed\","
+" \"soft_bounced\","
+" \"hard_bounced\","
+" \"spam\""
+" ]"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("webhook/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/webhook/set.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"url\": \"https://yourhost.example.com/unione-webhook\","
+" \"status\": \"active\","
+" \"event_format\": \"json_post\","
+" \"delivery_info\": 0,"
+" \"single_event\": 0,"
+" \"max_parallel\": 10,"
+" \"events\": {"
+" \"spam_block\": ["
+" \"*\""
+" ],"
+" \"email_status\": ["
+" \"delivered\","
+" \"opened\","
+" \"clicked\","
+" \"unsubscribed\","
+" \"soft_bounced\","
+" \"hard_bounced\","
+" \"spam\""
+" ]"
+" }"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"url": "https://yourhost.example.com/unione-webhook",
"status": "active",
"event_format": "json_post",
"delivery_info": 0,
"single_event": 0,
"max_parallel": 10,
"events": {
"spam_block": [
"*"
],
"email_status": [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/webhook/set.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/webhook/set.json

Устанавливает или изменяет свойства вебхука - вашего обработчика уведомлений о событиях.

Параметры

Название Тип Описание
url Обязательный
string(uri)
Cтрока с URL, на который будет отправляться запрос при возникновении события (идентификатор обработчика). В URL поддерживаются пока только ASCII-символы. Если вам нужно использовать не-ASCII, сковертируйте URL в Punycode.
status Опциональный
string
Статус вебхука, по умолчанию “active”. Статус “disabled” означает, что вебхук был отключён пользователем, “stopped” означает, что вебхук был остановлен системой после 24 часов неудачных вызовов (минимум по 10 различным событиям).
event_format Опциональный
string
Формат уведомлений. “json_post”(по умолчанию) или “json_post_gzip”.
delivery_info Опциональный
integer
Возвращать (1) или нет (0) подробную информацию о доставке. Если delivery_info=1, возвращается дополнительная информация об ответе сервера и внутренний статус доставки в случае “hard_bounced” и “soft_bounced” статусов доставки; user agent в случае “opened” и “clicked” статусов и ещё URL для статуса “clicked”.
single_event Опциональный
integer
0=в одном вызове может прийти несколько событий, 1=только одно событие на вызов(не рекомендуется).
max_parallel Опциональный
integer
Максимальное количество разрешённых параллельных запросов к вашему серверу. Чем больше ваш сервер может обработать - тем лучше.
events Опциональный
object
Объект, описывающий события, о которых надо уведомлять.
» spam_block Опциональный
array
Если присутствует, то будут отправляться уведомления о спам-блокировках. В массиве должен быть единственный элемент со строкой “*”.
» email_status Опциональный
array
Если присутствует, то будут отправляться уведомления о смене статуса email. В массиве перечисляются те статусы, о которых будут отправляться уведомления.

200 Ответ

{
"status": "success",
"object": {
"id": 0,
"url": "http://example.com",
"status": "active",
"event_format": "json_post",
"delivery_info": 0,
"single_event": 0,
"max_parallel": 10,
"updated_at": "string",
"events": {
"spam_block": [
"*"
],
"email_status": [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
}

Структура ответа

HTTP код 200:

Вебхук успешно установлен.

Название Тип Описание
status Обязательный
string
Строка “success”.
object Обязательный
object
Объект со всеми свойствами вебхука.
» id Обязательный
integer
Уникальный идентификатор вебхука.
» url Обязательный
string(uri)
URL вебхука.
» status Обязательный
string
Статус вебхука, по умолчанию “active”. Статус “disabled” означает, что вебхук был отключён пользователем, “stopped” означает, что вебхук был остановлен системой после 24 часов неудачных вызовов (минимум по 10 различным событиям).
» event_format Обязательный
string
Формат уведомлений. “json_post”(по умолчанию) или “json_post_gzip”.
» delivery_info Обязательный
integer
Возвращать (1) или нет (0) подробную информацию о доставке. Если delivery_info=1, возвращается дополнительная информация об ответе сервера и внутренний статус доставки в случае “hard_bounced” и “soft_bounced” статусов доставки; user agent в случае “opened” и “clicked” статусов и ещё URL для статуса “clicked”.
» single_event Обязательный
integer
0=в одном вызове может прийти несколько событий, 1=только одно событие на вызов(не рекомендуется).
» max_parallel Обязательный
integer
Максимальное количество разрешённых параллельных запросов к вашему серверу. Чем больше ваш сервер может обработать - тем лучше.
» updated_at Опциональный
string(utc-date-time)
Время последнего обновления свойств вебхука в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» events Опциональный
object
Объект, описывающий события, о которых надо уведомлять.
»» spam_block Опциональный
array
Если присутствует, то будут отправляться уведомления о спам-блокировках. В массиве должен быть единственный элемент со строкой “*”.
»» email_status Опциональный
array
Если присутствует, то будут отправляться уведомления о смене статуса email. В массиве перечисляются те статусы, о которых будут отправляться уведомления.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

callback-format

 

Ниже описана структура JSON данных, которые будут отправляться в POST-запросе на URL, заданный вами в методе webhook/set. Ваш сервер должен ответить 200 OK в течение 3 секунд или вызов вебхука будет повторен позже. Подробнее с фукнционированием вебхуков можно ознакомиться здесь.

UniOne предоставляет два типа событий, различающихся полем event_name и структурой данных event_data:

  1. transactional_email_status - событие изменения статуса доставки email. Можно подписаться только на оповещение об отдельных статусах.
  2. transactional_spam_block - событие установки или снятия блокировки одного или нескольких наших SMTP-серверов серверами получателя.
Смотрите HTTP-пример
Смотрите HTTP-пример
Смотрите HTTP-пример
Смотрите HTTP-пример
Смотрите HTTP-пример
Смотрите HTTP-пример
POST https://yourhost.example.com/unione-webhook HTTP/1.1
Host: yourhost.example.com
Content-Type: application/json

{
"auth":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"events_by_user":
[
{
"user_id":456,
"project_id":"6432890213745872",
"project_name":"MyProject",
"events":
[
{
"event_name":"transactional_email_status",
"event_data":
{
"job_id":"1a3Q2V-0000OZ-S0",
"metadata":
{
"key1":"val1",
"key2":"val2"
},
"email":"recipient.email@example.com",
"status":"sent",
"event_time":"2015-11-30 15:09:42",
"url":"http://some.url.com",
"delivery_info":
{
"delivery_status": "err_delivery_failed",
"destination_response": "550 Spam rejected",
"user_agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36",
"ip":"111.111.111.111"
}
}
},
{
"event_name":"transactional_spam_block",
"event_data":
{
"block_time":"YYYY-MM-DD HH:MM:SS",
"block_type":"one_smtp",
"domain":"domain_name",
"SMTP_blocks_count":8,
"domain_status":"blocked"
}
}
]
}
]
}

Параметры

Название Тип Описание
auth Обязательный
string
MD5-хэш строкового тела сообщения, в котором значение auth заменено на api_key пользователя/проекта, чей обработчик вызывается. С помощью этого получатель оповещения может как провести аутентификацию, так и проверить целостность оповещения.
events_by_user Обязательный
array
Массив с одним элементом, содержащий данные о событиях пользователя/проекта.
» user_id Обязательный
integer
Уникальный идентификатор пользователя.
» project_id Опциональный
string
Идентификатор проекта, присутствует если webhook был зарегистрирован с помощью API-ключа проекта.
» project_name Опциональный
string
Название проекта, присутствует если webhook был зарегистрирован с помощью API-ключа проекта.
» events Обязательный
array
Массив событий, о которых оповещает вызов вебхука.
»» event_name Опциональный
string
Тип данных, содержащихся в объекте event_data. Либо “transactional_email_status”, либо “transactional_spam_block”.
»» event_data Опциональный
object
Объект с различными свойствами события, зависящими от поля “event_name”. Ниже перечислены все возможные свойства, сначала для события “transactional_email_status”, затем для события “transactional_spam_block”.
»»» job_id Опциональный
string
Идентификатор задания, ранее возвращённый методом email/send. Присутствует только если event_name=“transactional_email_status”.
»»» metadata Опциональный
object
Метаданные, ранее переданные методом email/send в поле recipients.metadata или global_metadata. Присутствуют только если event_name=“transactional_email_status”.
»»» email Опциональный
string(email)
Email, на который была отправка. Присутствует только если event_name=“transactional_email_status”.
»»» status Опциональный
string
Статус доставки письма. Присутствует только если event_name=“transactional_email_status”. Принимает одно из следующих значений:

sent — сообщение отправлено, но пока не доставлено.
delivered — сообщение доставлено. Может измениться на “opened”, “clicked”, “unsubscribed” или “spam”.
opened — сообщение доставлено и зарегистрировано его прочтение. Может измениться на “clicked”, “unsubscribed” или “spam”.
clicked — сообщение доставлено, прочитано, был зарегистрирован переход по одной из ссылок в письме. Может измениться на “unsubscribed” или “spam”.
unsubscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался по ссылке в письме. Статус окончательный.
soft_bounced — временная недоставка сообщения. UniOne продолжает попытки доставки в течение 2 суток. В случае успешной доставки письмо перейдёт в статус “delivered”, в случае неуспешной - в “hard_bounced”.
hard_bounced - доставка не удалась, попыток доставки больше не будет. Статус окончательный. Возможных причин неудачной доставки масса, для их анализа можно использовать текст ответа SMTP-сервера из поля delivery_info.destination_response или нашу внутреннюю классификацию ошибок из поля delivery_info.delivery_status.
spam — сообщение доставлено, но отмечено как “спам” получателем. Статус окончательный. Вот некоторые домены, от которых UniOne может получить и обработать жалобу о спаме (используя технологию FBL): mail.ru, msn.com, outlook.com, hotmail.com, live.com, ukr.net, yahoo.com, aol.com.
»»» event_time Опциональный
string(utc-date-time)
Дата и время события в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”. Присутствует только если event_name=“transactional_email_status”.
»»» url Опциональный
string(uri)
URL в случае статусов “read” и “clicked”. Присутствует только если event_name=“transactional_email_status”.
»»» delivery_info Опциональный
object
Объект с дополнительной информацией о доставке. Присутствует только если свойство delivery_info при установке вебхука было равно 1 и если event_name=“transactional_email_status”.
»»»» delivery_status Обязательный
string
Внутренний детальный статус доставки UniOne. Вот некоторые из возможных статусов:

err_user_unknown – адрес не существует (и неизвестно, существовал ли когда-либо);
err_user_inactive – адрес не используется;
err_mailbox_discarded – адрес удален (т.е. когда-то существовал, но теперь его нет);
err_mailbox_full – почтовый ящик переполнен;
err_spam_rejected – письмо отвергнуто как спам;
err_too_large – по мнению сервера получателя, письмо превышает допустимый размер;
err_unsubscribed – адресат ранее отписался от ваших рассылок;
err_unreachable – адрес помечен как недоступный по причине многократных ошибок доставки на этот адрес;
»»»» destination_response Опциональный
string
Ответ SMTP-сервера.
»»»» user_agent Опциональный
string
Строка user agent получателя. Присутствует только если получилось её определить, для статусов “clicked” и “read”.
»»»» ip Опциональный
string
IP-адрес получателя. Присутствует только если получилось её определить, для статусов “clicked” и “read”.
»»» block_time Опциональный
string(utc-date-time)
Дата и время спам-блока в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”. Присутствует только если event_name=“transactional_spam_block”.
»»» block_type Опциональный
string
Тип спам-блока - заблокирован либо один отправляющий SMTP, либо сразу много. При блокировке одиночного SMTP из общего пула UniOne будет пробовать ещё несколько. Свойство присутствует только если event_name=“transactional_spam_block”.
»»» domain Опциональный
string
Домен, заблокировавший отправку. Свойство присутствует только если event_name=“transactional_spam_block”.
»»» SMTP_blocks_count Опциональный
integer
Количество заблокированных исходящих SMTP. Свойство присутствует только если event_name=“transactional_spam_block”.
»»» domain_status Опциональный
string
Это событие блокировки или разблокировки. Свойство присутствует только если event_name=“transactional_spam_block”.

webhook-get

POST https://eu1.unione.io/ru/transactional/api/v1/webhook/get.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"url": "http://example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"url" => "http://example.com"
];

try {
$response = $client->request('POST','webhook/get.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"url": "http://example.com"
}
r = requests.post(base_url+'/webhook/get.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"url" => "http://example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/webhook/get.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"url\": \"http://example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("webhook/get.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/webhook/get.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"url\": \"http://example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"url": "http://example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/webhook/get.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/webhook/get.json

Возвращает свойства вебхука

Параметры

Название Тип Описание
url Обязательный
string(uri)
URL вебхука.

200 Ответ

{
"status": "success",
"object": {
"id": 0,
"url": "http://example.com",
"status": "active",
"event_format": "json_post",
"delivery_info": 0,
"single_event": 0,
"max_parallel": 10,
"updated_at": "string",
"events": {
"spam_block": [
"*"
],
"email_status": [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
}

Структура ответа

HTTP код 200:

Вебхук успешно возвращён.

Название Тип Описание
status Обязательный
string
Строка “success”.
object Обязательный
object
Объект со всеми свойствами вебхука.
» id Обязательный
integer
Уникальный идентификатор вебхука.
» url Обязательный
string(uri)
URL вебхука.
» status Обязательный
string
Статус вебхука, по умолчанию “active”. Статус “disabled” означает, что вебхук был отключён пользователем, “stopped” означает, что вебхук был остановлен системой после 24 часов неудачных вызовов (минимум по 10 различным событиям).
» event_format Обязательный
string
Формат уведомлений. “json_post”(по умолчанию) или “json_post_gzip”.
» delivery_info Обязательный
integer
Возвращать (1) или нет (0) подробную информацию о доставке. Если delivery_info=1, возвращается дополнительная информация об ответе сервера и внутренний статус доставки в случае “hard_bounced” и “soft_bounced” статусов доставки; user agent в случае “opened” и “clicked” статусов и ещё URL для статуса “clicked”.
» single_event Обязательный
integer
0=в одном вызове может прийти несколько событий, 1=только одно событие на вызов(не рекомендуется).
» max_parallel Обязательный
integer
Максимальное количество разрешённых параллельных запросов к вашему серверу. Чем больше ваш сервер может обработать - тем лучше.
» updated_at Опциональный
string(utc-date-time)
Время последнего обновления свойств вебхука в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» events Опциональный
object
Объект, описывающий события, о которых надо уведомлять.
»» spam_block Опциональный
array
Если присутствует, то будут отправляться уведомления о спам-блокировках. В массиве должен быть единственный элемент со строкой “*”.
»» email_status Опциональный
array
Если присутствует, то будут отправляться уведомления о смене статуса email. В массиве перечисляются те статусы, о которых будут отправляться уведомления.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

webhook-list

POST https://eu1.unione.io/ru/transactional/api/v1/webhook/list.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"limit": 0,
"offset": 0
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"limit" => 0,
"offset" => 0
];

try {
$response = $client->request('POST','webhook/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"limit": 0,
"offset": 0
}
r = requests.post(base_url+'/webhook/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"limit" => 0,
"offset" => 0
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/webhook/list.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"limit\": 0,"
+" \"offset\": 0"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("webhook/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/webhook/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"limit\": 0,"
+" \"offset\": 0"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"limit": 0,
"offset": 0
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/webhook/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/webhook/list.json

Возвратить список всех или нескольких вебхуков (обработчиков уведомлений о событиях) пользователя или проекта.

Параметры

Название Тип Описание
limit Опциональный
integer
Максимальное количество возвращаемых за один вызов вебхуков. Рекомендуется 50.
offset Опциональный
integer
Индекс первого возращаемого вебхука из списка, считая с нуля.

200 Ответ

{
"status": "success",
"objects": [
{
"id": 0,
"url": "http://example.com",
"status": "active",
"event_format": "json_post",
"delivery_info": 0,
"single_event": 0,
"max_parallel": 10,
"updated_at": "string",
"events": {
"spam_block": [
"*"
],
"email_status": [
"delivered",
"opened",
"clicked",
"unsubscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
]
}

Структура ответа

HTTP код 200:

Список вебхуков успешно возвращён.

Название Тип Описание
status Обязательный
string
Строка “success”.
objects Опциональный
array
Массив объектов с данными о вебхуках.
» id Обязательный
integer
Уникальный идентификатор вебхука.
» url Обязательный
string(uri)
URL вебхука.
» status Обязательный
string
Статус вебхука, по умолчанию “active”. Статус “disabled” означает, что вебхук был отключён пользователем, “stopped” означает, что вебхук был остановлен системой после 24 часов неудачных вызовов (минимум по 10 различным событиям).
» event_format Обязательный
string
Формат уведомлений. “json_post”(по умолчанию) или “json_post_gzip”.
» delivery_info Обязательный
integer
Возвращать (1) или нет (0) подробную информацию о доставке. Если delivery_info=1, возвращается дополнительная информация об ответе сервера и внутренний статус доставки в случае “hard_bounced” и “soft_bounced” статусов доставки; user agent в случае “opened” и “clicked” статусов и ещё URL для статуса “clicked”.
» single_event Обязательный
integer
0=в одном вызове может прийти несколько событий, 1=только одно событие на вызов(не рекомендуется).
» max_parallel Обязательный
integer
Максимальное количество разрешённых параллельных запросов к вашему серверу. Чем больше ваш сервер может обработать - тем лучше.
» updated_at Опциональный
string(utc-date-time)
Время последнего обновления свойств вебхука в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» events Опциональный
object
Объект, описывающий события, о которых надо уведомлять.
»» spam_block Опциональный
array
Если присутствует, то будут отправляться уведомления о спам-блокировках. В массиве должен быть единственный элемент со строкой “*”.
»» email_status Опциональный
array
Если присутствует, то будут отправляться уведомления о смене статуса email. В массиве перечисляются те статусы, о которых будут отправляться уведомления.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

webhook-delete

POST https://eu1.unione.io/ru/transactional/api/v1/webhook/delete.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"url": "http://example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"url" => "http://example.com"
];

try {
$response = $client->request('POST','webhook/delete.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"url": "http://example.com"
}
r = requests.post(base_url+'/webhook/delete.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"url" => "http://example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/webhook/delete.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"url\": \"http://example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("webhook/delete.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/webhook/delete.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"url\": \"http://example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"url": "http://example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/webhook/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/webhook/delete.json

Удалить вебхук.

Вы можете также временно отключить вебхук без его удаления, установив его поле status в “disabled” с помощью метода webhook/set.

Параметры

Название Тип Описание
url Обязательный
string(uri)
URL вебхука.

200 Ответ

{
"status": "success"
}

Структура ответа

HTTP код 200:

Вебхук успешно удалён.

Название Тип Описание
status Обязательный
string
Строка “success”.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

Unsubscribed методы

Методы работы с отписками. Обратите внимание, что снова подписать отписанного адресата через WebAPI нельзя. Можно только выслать ему email со ссылкой повторной подписки с помощью метода email/subscribe.

unsubscribed-set

POST https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/set.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"address": "user@example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"address" => "user@example.com"
];

try {
$response = $client->request('POST','unsubscribed/set.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"address": "user@example.com"
}
r = requests.post(base_url+'/unsubscribed/set.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"address" => "user@example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/set.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("unsubscribed/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/set.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"address": "user@example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/set.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/unsubscribed/set.json

Внести email в список отписавшихся.

После внесения email в список отписавшихся все будущие попытки отправить на него сообщение будут отклоняться. Учтите, что удалить email из отписавшихся напрямую с помощью API нельзя. Но можно отправить ему сообщение со ссылкой повторной подписки с помощью метода email/subscribe либо удалить его из отписавшихся вручную на странице Поиск email в панели управления (но количество таких удалений в день сильно ограничено).

Параметры

Название Тип Описание
address Обязательный
string(email)
Email, который должен быть отписан.

200 Ответ

{
"status": "success",
"address": "user@example.com",
"message": "unsubscribed"
}

Структура ответа

HTTP код 200:

Email успешно отписан.

Название Тип Описание
status Обязательный
string
Строка “success”.
address Обязательный
string(email)
Отписанный email.
message Обязательный
string
Подробности отписки:
  • “unsubscribed” если email был только что отписан,
  • “was inactive” если он уже был помечен как неактивный и нет смысла отписывать,
  • “was unsubscribed” если email уже был отписан ранее,
  • “added and unsubscribed” если по этому email не хранилось никакого более раннего статуса, поэтому он был добавлен и сразу же отписан.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

unsubscribed-check

POST https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/check.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"address": "user@example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"address" => "user@example.com"
];

try {
$response = $client->request('POST','unsubscribed/check.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"address": "user@example.com"
}
r = requests.post(base_url+'/unsubscribed/check.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"address" => "user@example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/check.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("unsubscribed/check.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/check.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"address": "user@example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/check.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/unsubscribed/check.json

Проверяет, отписан ли email.

Параметры

Название Тип Описание
address Обязательный
string(email)
Email, который необходимо проверить.

200 Ответ

{
"status": "success",
"address": "user@example.com",
"is_unsubscribed": true
}

Структура ответа

HTTP код 200:

Статус отписки email успешно возвращён.

Название Тип Описание
status Обязательный
string
Строка “success”.
address Обязательный
string(email)
Email, который был проверен.
is_unsubscribed Обязательный
boolean
true если отписан, false если нет.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

unsubscribed-list

POST https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/list.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"date_from": "2020-10-14"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"date_from" => "2020-10-14"
];

try {
$response = $client->request('POST','unsubscribed/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"date_from": "2020-10-14"
}
r = requests.post(base_url+'/unsubscribed/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"date_from" => "2020-10-14"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/list.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"date_from\": \"2020-10-14\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("unsubscribed/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"date_from\": \"2020-10-14\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"date_from": "2020-10-14"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/unsubscribed/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/unsubscribed/list.json

Возвращает список адресов, отписавшихся начиная с указанной даты.

Параметры

Название Тип Описание
date_from Опциональный
string(utc-date)
Дата в формате ГГГГ-ММ-ДД, чтобы получить все отписанные адреса с “date_from” по сегодняшний день. Если параметр не указать, период по умолчанию будет с 00:00 сегодняшнего дня по UTC.

200 Ответ

{
"status": "success",
"unsubscribed": [
{
"address": "user@example.com",
"unsubscribed_on": "2020-10-15 22:14:59"
}
]
}

Структура ответа

HTTP код 200:

Список отписавшихся возвращён успешно.

Название Тип Описание
status Обязательный
string
Строка “success”.
unsubscribed Обязательный
array
Массив объектов с данными отписавшихся.
» address Опциональный
string(email)
Отписавшийся email.
» unsubscribed_on Опциональный
string(utc-date-time)
Дата и время отписки адреса в формате ГГГГ-ММ-ДД чч:мм:сс в часовом поясе UTC.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

Domain методы

Методы для настройки доменов отправки и проверки их статусов. Полезны, если вам недостаточно добавления доменов через веб-интерфейс UniOne, и, например, хочется автоматизировать добавление доменов для ваших собственных клиентов.

Для добавления нового домена отправки через API вы должны сделать следующее:

domain-get-dns-records

POST https://eu1.unione.io/ru/transactional/api/v1/domain/get-dns-records.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"domain": "example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"domain" => "example.com"
];

try {
$response = $client->request('POST','domain/get-dns-records.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"domain": "example.com"
}
r = requests.post(base_url+'/domain/get-dns-records.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"domain" => "example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/domain/get-dns-records.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"domain\": \"example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("domain/get-dns-records.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/domain/get-dns-records.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"domain\": \"example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"domain": "example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/domain/get-dns-records.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/domain/get-dns-records.json

Возвращает информацию о записях, которые надо внести в DNS для использования домена в UniOne.

Чтобы отправлять письма, вам надо подтвердить владение доменом, с обратным адресом которого вы собираетесь их отправлять, а также настроить DKIM-подпись для этого домена. Метод позволяет вам зарегистрировать домен в UniOne и сгенерировать запись для проверки владением и DKIM-ключ, либо получить их, если они были сгенерированы ранее.

После получения успешного ответа вам надо добавить DNS-записи наподобие этих:

@ IN TXT "unione-validate-hash=483bb362ebdbeedd755cfb1d4d661"
us._domainkey IN TXT "k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo7"
@ IN TXT "v=spf1 include:spf.unione.io ~all"

Требования к синтаксису записей у различных DNS-провайдеров могут отличаться:

Параметры

Название Тип Описание
domain Обязательный
string
Домен, для которого нужно получить информацию о DNS-записях.

200 Ответ

{
"status": "success",
"domain": "example.com",
"verification-record": "unione-validate-hash=483bb362ebdbeedd755cfb1d4d661",
"dkim": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo7"
}

Структура ответа

HTTP код 200:

Информация о DNS-записях возвращена успешно.

Название Тип Описание
status Обязательный
string
Строка “success”.
domain Обязательный
string
Домен, для которого нужно получить информацию о DNS-записях.
verification-record Обязательный
string
Запись, которую надо внести “как есть” для подтверждения владения этим доменом.
dkim Обязательный
string
DKIM-подпись для домена. В этом поле возвращается только ключ. Чтобы DNS-запись была корректной, нужно перед ключом добавить “k=rsa, p=” (см. пример).

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

domain-validate-verification-record

POST https://eu1.unione.io/ru/transactional/api/v1/domain/validate-verification-record.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"domain": "example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"domain" => "example.com"
];

try {
$response = $client->request('POST','domain/validate-verification-record.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"domain": "example.com"
}
r = requests.post(base_url+'/domain/validate-verification-record.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"domain" => "example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/domain/validate-verification-record.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"domain\": \"example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("domain/validate-verification-record.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/domain/validate-verification-record.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"domain\": \"example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"domain": "example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/domain/validate-verification-record.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/domain/validate-verification-record.json

Инициирует проверку записи о владении доменом.

Если результат вызова этого метода успешен (200 OK) - это означает, что проверка запущена. Для получения результата надо позже проверить поле verification-record.status, возвращаемое методом domain/list. Подробнее читайте здесь.

Параметры

Название Тип Описание
domain Обязательный
string
Домен, для которого проверяется запись о владении.

200 Ответ

{
"status": "success",
"message": "Record updated"
}

Структура ответа

HTTP код 200:

Запись о владении успешно проверена.

Название Тип Описание
status Обязательный
string
Строка “success”.
message Обязательный
string
Отладочное сообщение о ходе проверки.

HTTP код default:

Произошла ошибка или запись неверна.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

domain-validate-dkim

POST https://eu1.unione.io/ru/transactional/api/v1/domain/validate-dkim.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"domain": "example.com"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"domain" => "example.com"
];

try {
$response = $client->request('POST','domain/validate-dkim.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"domain": "example.com"
}
r = requests.post(base_url+'/domain/validate-dkim.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"domain" => "example.com"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/domain/validate-dkim.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"domain\": \"example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("domain/validate-dkim.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/domain/validate-dkim.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"domain\": \"example.com\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"domain": "example.com"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/domain/validate-dkim.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/domain/validate-dkim.json

Проверяет DKIM-запись домена.

Если результат вызова этого метода успешен (200 OK) - это означает, что проверка запущена. Для получения результата надо позже проверить поле dkim.status, возвращаемое методом domain/list. Подробнее читайте здесь.

Параметры

Название Тип Описание
domain Обязательный
string
Домен, для которого проверяется DKIM-запись.

200 Ответ

{
"status": "success",
"message": "Record updated"
}

Структура ответа

HTTP код 200:

Проверка DKIM-записи успешно стартовала.

Название Тип Описание
status Обязательный
string
Строка “success”.
message Обязательный
string
Отладочное сообщение о ходе проверки.

HTTP код default:

Произошла ошибка или запись неверна.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

domain-list

POST https://eu1.unione.io/ru/transactional/api/v1/domain/list.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"domain": "example.com",
"limit": 50,
"offset": 0
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"domain" => "example.com",
"limit" => 50,
"offset" => 0
];

try {
$response = $client->request('POST','domain/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"domain": "example.com",
"limit": 50,
"offset": 0
}
r = requests.post(base_url+'/domain/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"domain" => "example.com",
"limit" => 50,
"offset" => 0
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/domain/list.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"domain\": \"example.com\","
+" \"limit\": 50,"
+" \"offset\": 0"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("domain/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/domain/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"domain\": \"example.com\","
+" \"limit\": 50,"
+" \"offset\": 0"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"domain": "example.com",
"limit": 50,
"offset": 0
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/domain/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/domain/list.json

Возвращает список всех зарегистрированных доменов пользователя или проекта, вместе со статусами последних проверок.

Возвращает статус последней проверки DNS-записи владения доменом и DKIM-записи для каждого домена. Подробнее здесь.

Параметры

Название Тип Описание
domain Опциональный
string
Опциональное имя домена, если вам нужно получить статусы только по одному домену.
limit Опциональный
integer
Максимальное количество возвращаемых доменов. По умолчанию 50.
offset Опциональный
integer
Индекс первого возращаемого домена из списка, считая с нуля.

200 Ответ

{
"status": "success",
"domains": [
{
"domain": "example.com",
"verification-record": {
"value": "unione-validate-hash=483bb362ebdbeedd755cfb1d4d661",
"status": "confirmed"
},
"dkim": {
"key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo7",
"status": "active"
}
}
]
}

Структура ответа

HTTP код 200:

Список зарегистрированных доменов успешно возвращен.

Название Тип Описание
status Обязательный
string
Строка “success”.
domains Обязательный
array
Массив объектов, описывающих домены.
» domain Обязательный
string
Имя домена.
» verification-record Обязательный
object
Объект, описывающий запись проверки владения и её статус.
»» value Опциональный
string
Запись, которую надо внести “как есть” для подтверждения владения этим доменом.
»» status Опциональный
string
Только домены со статусом “confirmed” записи о владении доменом могут быть использованы для отправки писем.
» dkim Обязательный
object
Объект, описывающий DKIM-запись и её статус.
»» key Опциональный
string
DKIM-подпись для домена. В этом поле возвращается только ключ. Чтобы DNS-запись была корректной, нужно перед ключом добавить “k=rsa, p=” (см. domain/get-dns-records).
»» status Опциональный
string
Только домены со статусом DKIM-записи “active” могут быть использованы для отправки писем.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

Project методы

Проекты позволяют объединить несколько независимых доменов с веб-хуками, шаблонами и списками отписки. Это очень полезно, если у вас есть свои клиенты и вы управляете их данными из одной учетной записи UniOne. Каждый проект получает свой собственный ключ API, а вызовы API методов с этим ключом обрабатывают только данные этого проекта. Таким образом, вы можете назначить отдельный проект для каждого пользователя и быть уверенным, что они не будут конфликтовать: например, отмена подписки на один проект не повлияет на другой.

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

Обратите внимание: по умолчанию домены для отправки подтверждаются и используются независимо для основного аккаунта и каждого из проектов. Но есть возможность включить для проектов использование доменов, подтвержденных в основном аккаунте. Просто попросите об этом техподдержку.

project-create

POST https://eu1.unione.io/ru/transactional/api/v1/project/create.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"project": {
"name": "Project 1A",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"project" => [
"name" => "Project 1A",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true
]
];

try {
$response = $client->request('POST','project/create.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"project": {
"name": "Project 1A",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
}
r = requests.post(base_url+'/project/create.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"project" => {
"name" => "Project 1A",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true
}
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/project/create.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("project/create.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/project/create.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true"
+" }"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"project": {
"name": "Project 1A",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/project/create.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/project/create.json

Создать новый проект.

Параметры

Название Тип Описание
project Обязательный
object
Объект со свойствами проекта.
» name Обязательный
string
Название проекта, уникальное в рамках аккаунта пользователя.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то UniOne добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).

200 Ответ

{
"status": "success",
"project_id": "6123462132634",
"project_api_key": "string"
}

Структура ответа

HTTP код 200:

Проект успешно создан.

Название Тип Описание
status Обязательный
string
Строка “success”.
project_id Обязательный
string
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной.
project_api_key Обязательный
string
API-ключ проекта. Вы можете использовать этот ключ вместо пользовательского api_key во всех методах, кроме project-методов.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

project-update

POST https://eu1.unione.io/ru/transactional/api/v1/project/update.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"project_id" => "string",
"project_api_key" => "string",
"project" => [
"name" => "Project 1A",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true
]
];

try {
$response = $client->request('POST','project/update.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
}
r = requests.post(base_url+'/project/update.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"project_id" => "string",
"project_api_key" => "string",
"project" => {
"name" => "Project 1A",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true
}
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/project/update.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\","
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("project/update.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/project/update.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\","
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true"
+" }"
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/project/update.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/project/update.json

Изменить свойства проекта.

Параметры

Название Тип Описание
project_id Опциональный
string
Идентификатор обновляемого проекта. Проект должен быть идентифицирован либо этим полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно.
project_api_key Опциональный
string
Необязательный API-ключ обновляемого проекта. Проект должен быть идентифицирован либо полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно.
project Обязательный
object
Объект со свойствами проекта.
» name Обязательный
string
Название проекта, уникальное в рамках аккаунта пользователя.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то UniOne добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).

200 Ответ

{
"status": "success",
"project_api_key": "string"
}

Структура ответа

HTTP код 200:

Проект успешно обновлён.

Название Тип Описание
status Обязательный
string
Строка “success”.
project_api_key Опциональный
string
API-ключ проекта. Возвращается только в случае, если в параметре запроса был project_api_key. Если же проект был идентифицирован через project_id, то не возвращается.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

project-list

POST https://eu1.unione.io/ru/transactional/api/v1/project/list.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"project_id": "string",
"project_api_key": "string"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"project_id" => "string",
"project_api_key" => "string"
];

try {
$response = $client->request('POST','project/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"project_id": "string",
"project_api_key": "string"
}
r = requests.post(base_url+'/project/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"project_id" => "string",
"project_api_key" => "string"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/project/list.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("project/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/project/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"project_id": "string",
"project_api_key": "string"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/project/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/project/list.json

Возвращает список проектов.

Параметры

Название Тип Описание
project_id Опциональный
string
Опциональная возможность указать project_id для включения в список только указанного проекта.
project_api_key Опциональный
string
Опциональная возможность указать project_api_key для включения в список только указанного проекта.

200 Ответ

{
"status": "success",
"projects": [
{
"id": "6123462132634",
"api_key": "string",
"name": "Project 1A",
"reg_time": "2020-12-28 17:15:45",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true
}
]
}

Структура ответа

HTTP код 200:

Список проектов успешно возвращён.

Название Тип Описание
status Опциональный
string
Строка “success”.
projects Опциональный
array
Массив объектов, где каждый объект соответствует отдельному проекту.
» id Обязательный
string
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной.
» api_key Обязательный
string
API-ключ проекта. Вы можете использовать этот ключ вместо пользовательского api_key во всех методах, кроме project-методов.
» name Опциональный
string
Название проекта, уникальное в рамках аккаунта пользователя.
» reg_time Обязательный
string(utc-date-time)
Дата и время создания проекта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то UniOne добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

project-delete

POST https://eu1.unione.io/ru/transactional/api/v1/project/delete.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{
"project_id": "string",
"project_api_key": "string"
}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"project_id" => "string",
"project_api_key" => "string"
];

try {
$response = $client->request('POST','project/delete.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"project_id": "string",
"project_api_key": "string"
}
r = requests.post(base_url+'/project/delete.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {
"project_id" => "string",
"project_api_key" => "string"
}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/project/delete.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("project/delete.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/project/delete.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {
"project_id": "string",
"project_api_key": "string"
};
fetch('https://eu1.unione.io/ru/transactional/api/v1/project/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/project/delete.json

Удалить проект.

Некоторое время проект не удаляется окончателно и ещё возможно его восстановить - для этого необходимо обратиться в техподдержку.

Параметры

Название Тип Описание
project_id Опциональный
string
Идентификатор удаляемого проекта. Проект должен быть идентифицирован либо этим полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно.
project_api_key Опциональный
string
Необязательный API-ключ удаляемого проекта. Проект должен быть идентифицирован либо полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно.

200 Ответ

{
"status": "success"
}

Структура ответа

HTTP код 200:

Проект успешно удалён.

Название Тип Описание
status Обязательный
string
Строка “success”.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

System методы

Системные методы.

system-info

POST https://eu1.unione.io/ru/transactional/api/v1/system/info.json HTTP/1.1
Host: eu1.unione.io
Content-Type: application/json
Accept: application/json

{}
<?php

require 'vendor/autoload.php';

$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://eu1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [];

try {
$response = $client->request('POST','system/info.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://eu1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {}
r = requests.post(base_url+'/system/info.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}

params = {}

begin
result = RestClient.post(
'https://eu1.unione.io/ru/transactional/api/v1/system/info.json',
params.to_json,
headers
)

p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;

class Program {
static HttpClient client;

public static void Main(string[] args) {
client = new HttpClient();

client.BaseAddress = new Uri("https://eu1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("system/info.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("UniOne request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://eu1.unione.io/ru/transactional/api/v1/system/info.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{}";

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};

const inputBody = {};
fetch('https://eu1.unione.io/ru/transactional/api/v1/system/info.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/system/info.json

Возвращает информацию о пользователе или проекте по API ключу.

200 Ответ

{
"status": "success",
"user_id": 11344,
"email": "user@example.com",
"project_id": "6123462132634",
"project_name": "Project 1A",
"accounting": {
"period_start": "2016-08-29 09:12:33",
"period_end": "2016-09-29 09:12:33",
"emails_included": 0,
"emails_sent": 0
}
}

Структура ответа

HTTP код 200:

Успешно возвращена информация о пользователе или проекте.

Название Тип Описание
status Обязательный
string
Строка “success”.
user_id Обязательный
integer
Уникальный идентификатор пользователя.
email Обязательный
string(email)
Email пользователя.
project_id Опциональный
string
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной. Присутствует только если API-ключ, использованный для запроса, был API-ключом проекта.
project_name Опциональный
string
Название проекта, уникальное в рамках аккаунта пользователя. Присутствует только если API-ключ, использованный для запроса, был API-ключом проекта.
accounting Опциональный
object
Объект со свойствами периода учёта. Присутствует только если API-ключ, использованный для запроса, был API-ключом пользователя.
» period_start Обязательный
string(utc-date-time)
Дата и время начала периода учёта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» period_end Обязательный
string(utc-date-time)
Дата и время конца периода учёта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» emails_included Обязательный
integer(int64)
Количество писем, включённых в учётный период.
» emails_sent Обязательный
integer(int64)
Количество писем, отправленных за учётный период. Может быть больше emails_included в случае превышения.

HTTP код default:

Произошла ошибка.

Название Тип Описание
status Обязательный
string
Строка “error”.
message Обязательный
string
Сообщение об ошибке на английском.
code Обязательный
integer
Код ошибки API.

Ошибки API

HTTP/1.1 500 Internal Server Error
Content-Length: 90
Content-Type: application/json
Connection: Closed

{
"status": "error",
"code": 150,
"message": "Аn unknown internal error occurred"
}

Если вызов метода неуспешен и возвращает HTTP-код, отличный от 200, обычно в тело ответа помещается JSON-объект с подробностями:

Поле Тип Описание
status string Всегда содержит строку “error”.
code integer API-код ошибки (не путайте с HTTP-кодом)
message string Сообщение об ошибке на английском.

Ниже перечислены почти все возможные коды ошибок API.

HTTP код API код Значение / Как исправить
401 101 Не введен или не передан ключ API
Укажите ключ API в параметре api_key запроса.
401 102 Ключ API неправильный.
Скопируйте ключ API со страницы настроек или используйте ключ одного из проектов.
403 105 Доступ к API выключен
Для того, чтобы включить API, перейдите в настройки аккаунта.
403 106 Пользователь неактивен.
Для уточнения причин обратитесь в службу поддержки.
400 111 Ошибка формата JSON
Исправьте ошибку в JSON синтаксисе запроса.
403 114 Пользователь, отправивший запрос, не найден в базе.
Возможно, этот пользователь удален. Проверьте также хост запроса, т.к. мы используем несколько хостов с независимыми базами данных - например, eu1.unione.io и us1.unione.io. Запрос надо отправлять на тот хост, на котором зарегистрирован пользователь.
400 118 Не найдены DNS TXT записи
Добавьте TXT записи со значениями, возвращаемыми методом domain/get-dns-records.
500 120 Внутренняя ошибка проверки DKIM
Пожалуйста, свяжитесь с техподдержкой.
400 121 Таймаут поиска домена
Истекло время DNS запроса. Убедитесь, что ваш DNS сервис работает и попробуйте снова.
400 122 DKIM-запись не найдена
Добавьте DNS-запись с DKIM-ключом, полученным с помощью метода domain/get-dns-records. Если вы уже сделали это - подождите несколько минут и повторите запрос.
400 123 Неверная DKIM-запись.
Вам надо внести корректную DKIM-запись в DNS вашего домена.
400 124 DKIM-запись не совпадает с ожидаемой.
Возможно, вы изменили запись. Запись в DNS корректна, но не совпадает с ожидаемой нами. Внесите запись с DKIM-ключом, который возвращается методом domain/get-dns-records.
400 129 Иная ошибка проверки DKIM, причина которой отличается от причин описанных выше ошибок 120-124
Вам надо внести корректную DKIM-запись в DNS вашего домена, взяв данные из результатов вызова domain/get-dns-records. Если это не помогает, обратитесь в техподдержку.
400 130 Домен верхнего уровня не может иметь пользовательские записи в соответствии с Registry policy
Укажите другой домен.
500 150 Неизвестная внутренняя ошибка.
Попробуйте повторить запрос или обратитесь в службу поддержки.
413 199 Запрос слишком большой
Данных в запросе должно быть не больше 10Mб.
400 201 Тело письма не передано
Убедитесь, что тело письма передается правильно.
400 202 Не указан адрес отправителя
Укажите адрес отправителя.
400 203 Не указана тема письма
Укажите тему письма.
400 204 Получатели письма заданы некорректно
Убедитесь, что список получателей задан массивом, в котором каждый получатель является массивом, где обязательно задан параметр “email”.
400 205 Неверный адрес отправителя
Убедитесь, что параметр “email_from” заполнен верно.
400 206 В качестве адреса отправителя используется неподтвержденный адрес
Используйте адрес, находящийся на подтвержденном домене.
400 207 MIME-тип файла не соответствует заданному
Проверьте указанный тип и файл на соотвествие.
400 209 В приложенных файлах повторяются имена
Переименуйте файлы с повторяющимися именами.
400 210 В файлах, приложенных к телу письма, повторяются имена
Переименуйте файлы с повторяющимися именами.
400 212 Некорректно заданы подстановки в массиве получателей (не задан массив подстановок)
Убедитесь, что не превышен максимальный лимит подстановок и отсутствуют подстановки неправильного типа данных (допустимо string/integer).
403 213 Нет прав для использования пользовательского backend-домена
Попробуйте обратиться в службу поддержки.
403 215 Пользователь не может отправлять
Попробуйте обратиться в службу поддержки.
400 216 Данные адресатов переданы неправильно
Значение “metadata” должно быть типа string или integer. Для передачи нескольких параметров в “metadata” используйте синтаксис массива.
400 217 Превышен лимит параметров в “metadata”
Сократите количество параметров в “metadata”, их должно быть не больше 10.
400 218 Данные адресатов переданы неправильно
Убедитесь, что ключ параметра “metadata” короче 64 символов.
400 219 Данные адресатов переданы неправильно
Убедитесь, что значение параметра “metadata” короче 1024 символов.
400 221 В запросе нет html-тега <body>
Поместите html-тег <body> внутрь тега <html>. Тег <body> необходим для отображения содержимого HTML письма.
400 223 В “attachments” пропущено тело “content” или передано пустоту
Добавьте тело “content” и укажите для него значение.
400 303 Список событий, переданный в запросе, содержит неподдерживаемое значение/событие не поддерживается
Проверьте корректность ввода списка событий.
400 304 Не удалось найти Webhook с указанным URL
Убедитесь в правильности передаваемого URL.
400 305 URL не передан
Убедитесь в правильности передаваемого URL.
400 601 Шаблон не найден
Проверьте корректность ввода id шаблона.
400 602 Название шаблона не передано
Проверьте корректность ввода названия шаблона.
400 603 Название шаблона, переданное в запросе, уже принадлежит другому шаблону
Используйте другое название шаблона.
400 604 Достигнуто максимальное значение количества шаблонов
Удалите уже созданные шаблоны, чтобы создать новые. Количество шаблонов не должно превышать 10000.
403 901 Отправка заблокирована из-за превышения дневного лимита.
У каждого пользователя есть максимальный дневной лимит отрпавок для предотвращения спама. Этот лимит автоматически увеличивается при успешных доставках. Вы можете либо плавно увеличивать объём отправок и лимит увеличится автоматически, либо запросить увеличение, обратившись в техподдержку.
403 902 Достигнут дневной лимит отправок на бесплатном тарифе.
Ждите следующего дня либо переключитесь на платный тариф.
403 903 На бесплатном тарифе разрешена отправка только на свои собственные подтверждённые домены.
Пожалуйста, подтвердите владение всеми доменами, на которые вы хотите слать письма либо переключитесь на платный тариф.
403 904 Недостаточно средств. Ошибка оплаты по карте.
Попробуйте подключить другую карту или свяжитесь с техподдержкой для разрешения ситуации.
403 905 Вы достигли предела отправок по вашему тарифному плану.
Обычно тарифные планы позволяют платное превышение лимита. В вашем случае это запрещено - возможно, из-за неоплаченных счетов. Пожалуйста, убедитесь, что все счета оплачены или свяжитесь с техподдержкой для решения проблемы.
500 908 Внутренняя ошибка, владелец проекта не найден.
Свяжитесь с техподдержкой.
400 1000 Не указан адрес получателя
Укажите адрес получателя.
400 1001 Недопустимое значение адреса получателя
Проверьте, корректно ли введен адрес получателя.
400 1002 Не указан адрес отправителя
Укажите адрес отправителя.
400 1003 Адрес отправителя не подтвержден
Подтвердите домен адреса отправителя.
400 1004 Недопустимое значение адреса отправителя
Проверьте, корректно ли введен адрес отправителя.
400 1005 Слишком длинное имя отправителя
Сделайте короче имя отправителя.
400 1006 Превышен дневной лимит вызова метода
Попробуйте повторить вызов на следующий день.
400 1100 Не указано доменное имя
Укажите домен, который необходимо подтвердить.
400 1101 Недопустимое значение домена
Укажите корректное значение домена.
400 1200 Не указано доменное имя
Укажите доменое имя для проверки.
400 1201 Недопустимое значение домена
Укажите корректное значение домена, который вам принадлежит.
400 1202 Домен не зарегистрирован в UniOne
Вызовите метод domain/get-dns-records для регистрации домена в UniOne.
400 1301 Недопустимое значение домена
Укажите корректное значение домена, который вам принадлежит.
400 1302 Недопустимое значение лимита
Значение limit должно быть целым числом в диапазоне 1 - 100.
400 1303 Недопустимое значение позиции
Значение offset должно быть больше или равно 0.
400 1304 Неверный тип значения позиции
Значение offset должно иметь тип integer.
400 1305 Неверный тип значения лимита
Значение limit должно иметь тип integer.
400 1400 Не указано доменное имя
Укажите доменое имя для проверки.
400 1401 Некорректный или несуществующий домен
Либо вы допустили ошибку в имени домена и её надо исправить, либо изменения в DNS ещё не распостранились и вам надо подождать несколько часов и сделать повторную попытку. У домена должна быть A, AAAA или MX запись.
400 1402 Домен не зарегистрирован в UniOne.
Зарегистрируйте домен с помощью вызвова domain/get-dns-records.
400 1506 Поле ‘headers’ должно быть объектом.
Проверьте передаваемый JSON и используйте объект для поля “headers” (не массив, строку или какой-то другой тип).
400 1507 Более 50 элементов в массиве “headers”.
Пожалуйста, сократите количество элементов массива “headers” до 50.
400 1508 Ошибка в поле ‘template_id’. Шаблон с указанным ID не существует.
Убедитесь, что ID шаблона указан правильно.
400 1509 Поле ‘body’ должно быть объектом.
Проверьте передаваемый JSON и используйте объект для поля ‘headers’ (не массив, строку или какой-то другой тип).
400 1510 Ошибка в поле ‘body.html’. Это значение должно быть строкой
Убедитесь, что в поле ‘body.html’ передана строка.
400 1511 Ошибка в поле ‘body.plaintext’. Это значение должно быть строкой
Убедитесь, что в поле ‘body.plaintext’ передана строка.
400 1512 Ошибка в поле ‘body.amp’. Это значение должно быть строкой
Убедитесь, что в поле ‘body.amp’ передана строка.
400 1516 Ошибка в поле ‘body.html’. В подстановках присутствуют недопустимые значения
Проверьте правильность подстановок в поле ‘body.html’.
400 1517 Ошибка в поле ‘body.plaintext’. В подстановках присутствуют недопустимые значения
Проверьте правильность подстановок в поле ‘body.plaintext’.
400 1518 Ошибка в поле ‘body.amp’. В подстановках присутствуют недопустимые значения
Проверьте правильность подстановок в поле ‘body.amp’.
400 1519 Ошибка в поле ‘reply_to’. Это значение должно быть строкой
Убедитесь, что в поле ‘reply_to’ передана строка.
400 1520 Ошибка в поле ‘reply_to’. Недопустимый адрес
Проверьте, корректно ли введен адрес.
400 1521 Ошибка в поле ‘from_name’. Это значение должно быть строкой
Убедитесь, что в поле ‘from_name’ передана строка.
400 1522 Ошибка в поле ‘subject’. Это значение должно быть строкой
Убедитесь, что в поле ‘subject’ передана строка.
400 1523 Ошибка в поле ‘template_engine’. Значение ‘template_engine’ должно быть ‘velocity’ либо ‘simple’.
Передавайте значение параметра ‘template_engine’ равным ‘velocity’ либо ‘simple’.
400 1524 Более 500 элементов в массиве ‘recipients’.
Пожалуйста, сократите количество элементов массива ‘recipients’ до 500.
400 1601, 1701 Ошибка в поле ‘project’, отсуствует секция project
Исправьте структуру JSON запроса.
400 1602, 1702 Ошибка в поле ‘name’ - оно не должно быть пустым
Передавайте непустое значение name.
400 1603, 1703 Ошибка в поле ‘name’ - не строковый тип.
Передавайте строку в параметре name.
400 1604, 1704 Ошибка в поле ‘name’ - превышена максимальная длина, количество символов больше 255
Используйте более короткие имена проектов.
400 1605, 1705 Ошибка в поле ‘name’ - проект с таким именем уже существует
Передавайте уникальное название проекта, либо сначала удалите уже существующий проект с таким именем.
400 1606 Ошибка в поле ‘send_enabled’ - значение должно быть булевым
Передавайте только значения true или false.
400 1607 Ошибка в поле ‘custom_unsubscribe_url_enabled’ - значение должно быть булевым
Передавайте только значения true или false.
400 1608, 1711 Запрещено использовать поле ‘custom_unsubscribe_url_enabled’
Свяжитесь с техподдержкой.
400 1706 Ошибка в поле ‘project_api_key’ - одно из двух свойств [’project_api_key’ или ‘project_id’] обязательно.
Передайте непустое значение в project_id или project_api_key.
400 1707, 1802 Ошибка в поле ‘project_api_key’ - проект не найден
Передавайте правильный project_api_key. Вы можете получить список всех проектов с их ключами с помощью метода project/list.
400 1708 Ошибка в поле ‘project_api_key’ - значение должно быть строковым
Используйте строковый тип для ‘project_api_key’.
400 1709 Ошибка в поле ‘send_enabled’ - значение должно быть булевым
Передавайте только значения true или false.
400 1710 Ошибка в поле ‘custom_unsubscribe_url_enabled’. Это значение должно быть булевым
Передавайте только значения true или false.
400 1712, 1805, 1905 Ошибка в поле ‘project_id’. Это значение должно быть строкой.
Используйте строковый тип для поля project_id.
400 1713, 1804 Ошибка в поле ‘project_api_key’. Одно из двух свойств [‘project_api_key’ или ‘project_id’] должно быть пустым.
Передавайте только один из параметров - либо project_id, либо project_api_key, но не оба сразу.
400 1714, 1806 Ошибка в поле ‘project_id’. Проект с ID: ‘NNNN’ не существует.
Проверьте идентификатор проекта. Может быть, он был удалён или никогда и не существовал?
400 1715, 1807 Ошибка в поле ‘project_id’. Это значение не валидно.
Убедитесь, что вы передаёте project_id именно таким, каким получили его при вызове метода project/create.
400 1801 Ошибка в поле ‘project_api_key’ - одно из двух свойств [’project_api_key’ или ‘project_id’] обязательно.
Передайте непустое значение в project_id или project_api_key.
400 1803, 1902 Ошибка в поле ‘project_api_key’ - параметр не строкового типа
Используйте строковый тип для ‘project_api_key’.
400 1904 Ошибка в поле ‘project_id’ - неверный формат
Убедитесь, что вы передаёте параметр ‘project_id’ в том же виде, в котором его возвращает project/create.
400 2500 Ошибка в поле ‘editor_type’. Допустимое значение ‘html’
Убедитесь, что в поле ‘editor_type’ передано ‘html’.
400 2501 Шаблон был создан в визуальном редакторе
Убедитесь, что шаблон создан в HTML редакторе.
400 2502 Поле ‘editor_type’ не должно быть пустым.
Передайте в поле ‘editor_type’ значение ‘html’.
400 2503 Ошибка в поле ‘id’. Шаблон с указанным ID не найден
Убедитесь, что ID шаблона указано верно.
400 2504 Поле ‘headers’ должно быть объектом.
Проверьте передаваемый JSON и используйте объект для поля ‘headers’ (не массив, строку или какой-то другой тип).
400 2505 Более 50 элементов в массиве ‘headers’.
Пожалуйста, сократите количество элементов массива ‘headers’ до 50.
400 2514 Ошибка в поле ‘reply_to’. Это значение должно быть строкой
Убедитесь, что в поле ‘reply_to’ передана строка.
400 2515 Ошибка в поле ‘reply_to’. Недопустимый адрес
Проверьте, корректно ли введен адрес.
400 2516 Ошибка в поле ‘template_engine’. Значение “template_engine” должно быть ‘velocity’ либо ‘simple’.
Передавайте значение параметра “template_engine” равным ‘velocity’ либо ‘simple’.
400 2600 Недопустимое значение поля “limit”. Это значение должно быть больше или равно 0.
Укажите в параметре “limit” значение больше или равно 0.
400 2601 Недопустимое значение поля “limit”. Это значение должно быть целочисленным.
Передавайте значение целочисленного типа в параметре “limit”.
400 2602 Недопустимое значение поля “offset”. Это значение должно быть больше или равно 0.
Укажите в параметре “offset” значение больше или равно 0.
400 2603 Недопустимое значение поля “offset”. Это значение должно быть целочисленным
Передавайте значение целочисленного типа в параметре “offset”.
400 2700 Ошибка в поле “url”. Значение должно быть строкового типа.
Передавайте строку в параметре “url”.
400 2701 Ошибка в поле “url”. Значение не должно быть пустым.
Убедитесь, что URL указан в значении параметра.
400 2702 Ошибка в поле “offset”. Значение должно быть больше или равно 0
Установите значение параметра больше или равное 0.
400 2703 Ошибка в поле “eventFormat”. Выбранное вами значение недопустимо
Используйте только формат “json_post” или “json_post_gzip”.
400 2704 Ошибка в поле “deliveryInfo”. Значение “delivery_info” должно быть 1/0 либо true/false.
Передавайте значение параметра “delivery_info” равным 1/0 либо true/false.
400 2705 Ошибка в поле “singleEvent”. Значение “single_event” должно быть 1/0 либо true/false.
Передавайте значение параметра “single_event” равным 1/0 либо true/false.
400 2706 Ошибка в поле “maxParallel”. Значение должно иметь целочисленный тип
Передавайте значение целочисленного типа в параметре “maxParallel”.
400 2707 Ошибка в поле “maxParallel”. Значение должно находиться в диапазоне от 5 до 100
Используйте допустимое значение от 5 до 100.
400 2708 Ошибка в поле “events”. Это значение должно быть массивом
Убедитесь, что список событий в параметре “events” передан массивом.
400 2709 Ошибка в поле “events”. Значение не должно быть пустым
Убедитесь, что в параметре “events” переданы значения.
400 2710 Ошибка в поле “events”. Поле “email_status” обязательно
Убедитесь, что передан параметр “email_status”.
400 2711 Ошибка в поле “email_status”.Значение “test” недопустимо для ‘email_status’
Укажите верный статус сообщений.
400 2712 Ошибка в поле “spam_block”. Значение “test” недопустимо для “spam_block”
Укажите верное событие спам-блокировок.
400 2713 Ошибка в поле “url”. Домен для Webhook не найден.
Убедитесь, что домен указан правильно.
400 2714 Ошибка в поле “status”. Недопустимое значение, статус может быть только “active” или “disabled”
Укажите статус “active” или “disabled”.
400 2715 Ошибка в поле “status”. Это значение должно быть строкового типа
Используйте строку для параметра “status”.
400 2800 Ошибка в поле ‘name’. Значение не должно быть пустым
Убедитесь, что поле ‘name’ заполнено.
400 2801 Ошибка в поле ‘name’. Это значение должно быть строкой
Убедитесь, что в поле ‘name’ передана строка.
400 2802 Ошибка в поле ‘type’. Это значение должно быть строкой
Убедитесь, что в поле ‘type’ передана строка.
400 2803 Ошибка в поле ‘content’. Это значение должно быть строкой
Убедитесь, что в поле ‘content’ передана строка.
400 2804 Размер поля ‘content’ не должен превышать 7Мб
Уменьшите размер поля ‘content’ до 7Мб (9786710 байт в base64).