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

Web API v1.58

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

Все методы 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 – Слишком много запросов, уменьшите их частоту.
50x Internal Server Error – Внутренняя ошибка серверов UniOne (может быть 500, 502, 503 etc.). Попробуйте повторить запрос позднее.

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

Email методы

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

email-send

POST https://us1.unione.io/ru/transactional/api/v1/email/send.json HTTP/1.1
Host: us1.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": "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"tags": [
"string1"
],
"skip_unsubscribe": 0,
"global_language": "string",
"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",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"bypass_global": 0,
"bypass_unavailable": 0,
"bypass_unsubscribed": 0,
"bypass_complained": 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": {
"send_at": "2021-11-19 10:00:00",
"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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"message" => [
"recipients" => [
[
"email" => "user@example.com",
"substitutions" => [
"CustomerId" => 12452,
"to_name" => "John Smith"
],
"metadata" => [
"campaign_id" => "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash" => "b253ac7"
]
]
],
"template_id" => "string",
"tags" => [
"string1"
],
"skip_unsubscribe" => 0,
"global_language" => "string",
"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",
"reply_to_name" => "John Smith",
"track_links" => 0,
"track_read" => 0,
"bypass_global" => 0,
"bypass_unavailable" => 0,
"bypass_unsubscribed" => 0,
"bypass_complained" => 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" => [
"send_at" => "2021-11-19 10:00:00",
"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://us1.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": "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"tags": [
"string1"
],
"skip_unsubscribe": 0,
"global_language": "string",
"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",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"bypass_global": 0,
"bypass_unavailable": 0,
"bypass_unsubscribed": 0,
"bypass_complained": 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": {
"send_at": "2021-11-19 10:00:00",
"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" => "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash" => "b253ac7"
}
}
],
"template_id" => "string",
"tags" => [
"string1"
],
"skip_unsubscribe" => 0,
"global_language" => "string",
"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",
"reply_to_name" => "John Smith",
"track_links" => 0,
"track_read" => 0,
"bypass_global" => 0,
"bypass_unavailable" => 0,
"bypass_unsubscribed" => 0,
"bypass_complained" => 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" => {
"send_at" => "2021-11-19 10:00:00",
"unsubscribe_url" => "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id" => 0,
"smtp_pool_id" => "string"
}
}
}

begin
result = RestClient.post(
'https://us1.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://us1.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\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"tags\": ["
+" \"string1\""
+" ],"
+" \"skip_unsubscribe\": 0,"
+" \"global_language\": \"string\","
+" \"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\","
+" \"reply_to_name\": \"John Smith\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"bypass_global\": 0,"
+" \"bypass_unavailable\": 0,"
+" \"bypass_unsubscribed\": 0,"
+" \"bypass_complained\": 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\": {"
+" \"send_at\": \"2021-11-19 10:00:00\","
+" \"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://us1.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\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"tags\": ["
+" \"string1\""
+" ],"
+" \"skip_unsubscribe\": 0,"
+" \"global_language\": \"string\","
+" \"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\","
+" \"reply_to_name\": \"John Smith\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"bypass_global\": 0,"
+" \"bypass_unavailable\": 0,"
+" \"bypass_unsubscribed\": 0,"
+" \"bypass_complained\": 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\": {"
+" \"send_at\": \"2021-11-19 10:00:00\","
+" \"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": "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"tags": [
"string1"
],
"skip_unsubscribe": 0,
"global_language": "string",
"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",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"bypass_global": 0,
"bypass_unavailable": 0,
"bypass_unsubscribed": 0,
"bypass_complained": 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": {
"send_at": "2021-11-19 10:00:00",
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
};
fetch('https://us1.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[“List-Unsubscribe”]
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается. Есть специальная переменная “to_name”, позволяющая задать имя получателя. При подстановке туда “Имя Фамилия” SMTP-заголовок “To” будет выглядеть как “Имя Фамилия <email@example.com>”. Длина переменной “to_name” ограничена 78 символами.
»» metadata Опциональный
object
Объект для передачи метаданных, специфичных для отдельного получателя, где “key” - строка до 64 символов длиной, “value” - строка до 1024 символов длиной, максимальное количество ключей - 10. Метаданные передаются при вызове вебхуков и методов event-dump. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» template_id Опциональный
string(uuid)
Уникальный идентификатор шаблона, созданного ранее методом template/set. Если указан, то поля шаблона подставляются вместо пропущенных полей email/send. Например, если в email/send не указан body - берётся тело письма из шаблона, а если не указан subject - берётся тема из шаблона.
» tags Опциональный
array
Массив из строк, до 50 символов в каждой. Максимум 4 строки в массиве, строки должны быть уникальны. Для каждого аккаунта/проекта разрешено не более 10 000 меток, при превышении метод email/send будет возвращать ошибку. Метки могут использоваться для категоризации писем по выбранным вами критериям. Метки передаются при вызове вебхуков и методов event-dump.
» skip_unsubscribe Опциональный
integer
Пропустить или не пропускать добавление стандартного блока со ссылкой отписки к HTML-части письма. 1=пропустить, 0=добавить, по умолчанию 0. Для использования skip_unsubscribe=1 вам надо попросить техподдержку включить такую возможность.
» global_language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Обязательный
string
Тема письма.
» from_email Опциональный
string(email)
Email-адрес отправителя. Обязателен только при пустом template_id.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» bypass_global Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список глобальной недоступности, при отправке не будут учитываться данные о недоступности адресов или жалобы, полученные при отправке другими пользователями UniOne. Для некоторых системных записей может быть запрещено
» bypass_unavailable Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список недоступных адресов текущего аккаунта/проекта. Указание 1 возможно только при одновременном указании bypass_global=1.
» bypass_unsubscribed Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список отписавшихся от рассылок текущего аккаунта/проекта. Указание 1 возможно только при одновременном указании bypass_global=1. Параметр доступен только тем пользователям, которым техподдержка одобрила отключение ссылки отписки.
» bypass_complained Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список пожаловавшихся на аккаунт/проект. Указание 1 возможно только при одновременном указании bypass_global=1. Параметр доступен только тем пользователям, которым техподдержка одобрила отключение ссылки отписки.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNIONE-Global-Language, X-UNIONE-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNIONE-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
»» X-UNIONE-Template-Engine Опциональный
string
Заголовок для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”. Имеет приоритет над значением, передаваемым в параметре “template_engine”.
» 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
Дополнительные опции.
»» send_at Опциональный
string
Дата и время в формате “ГГГГ-ММ-ДД чч:мм:сс” в часовом поясе UTC. Позволяет запланировать время отправки на будущее, в пределах 24 часов от текущего времени.
»» unsubscribe_url Опциональный
string
Пользовательская ссылка отписки. Подробнее здесь.
»» custom_backend_id Опциональный
integer
Идентификатор backend-домена, через который отправляется сообщение. Если отсутствует - отправка будет от имени backend-домена, назначенного вашему аккаунту/проекту по умолчанию. Вы можете приобрести один или несколько выделенных IP-адресов и использовать эту опцию для выбора.
»» smtp_pool_id Опциональный
string(uuid)
Идентификатор пула SMTP, через который отправляется сообщение. Обычно нет необходимости указывать пул явно, т.к. он выбирается автоматически либо как пул по умолчанию для вашего аккаунта/проекта, либо в соответствии с переданным параметром custom_backend_id.

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 Опциональный
object
Объект с email-адресами, не принятыми к отправке. Email представлен именем свойства, а его статус - значением свойства, например: {“email1@gmail.com”: “temporary_unavailable”}. Возможные статусы адресов, на которые не удалось осуществить отправку:
  • unsubscribed - указанный адрес отписан;
  • invalid - адрес не существует, или введен некорректно;
  • duplicate - адрес повторяется в запросе, повторная отправка на один и тот же email предотвращена;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”;
  • blocked - отправка на этот адрес запрещена администрацией UniOne.
В будущем могут появиться и другие статусы.

HTTP код default:

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

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

email-subscribe

POST https://us1.unione.io/ru/transactional/api/v1/email/subscribe.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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.

Email-validation методы

Методы проверки email адресов. Проверка адреса электронной почты предоставляет подробную информацию о работоспособности email. Это позволит исключить из отправки несуществующие email, снизить показатель жалоб, очистить список подписчиков и в конечном итоге улучшить вашу репутацию как отправителя. Например, вы можете интегрировать процесс проверки в форму регистрации вашего сайта и уже на этапе ввода адреса сообщать пользователям, что адрес, который они ввели в форму, недействителен.

email-validation-single

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

{
"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://us1.unione.io/ru/transactional/api/v1/'
]);

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

try {
$response = $client->request('POST','email-validation/single.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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"email": "user@example.com"
}
r = requests.post(base_url+'/email-validation/single.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 = {
"email" => "user@example.com"
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/email-validation/single.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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

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

var response = client.PostAsync("email-validation/single.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://us1.unione.io/ru/transactional/api/v1/email-validation/single.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 = "{"
+" \"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 = {
"email": "user@example.com"
};
fetch('https://us1.unione.io/ru/transactional/api/v1/email-validation/single.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-validation/single.json

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

Параметры

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

200 Ответ

{
"status": "success",
"email": "user@example.com",
"result": "suspicious",
"cause": "disposable",
"validity": 10,
"local_part": "user",
"domain": "example.com",
"mx_found": true,
"mx_record": 10,
"did_you_mean": "user@example.com",
"processed_at": "2023-01-01 22:14:59"
}

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

HTTP код 200:

Email успешно проверен.

Название Тип Описание
status Обязательный
string
Строка “success”.
email Обязательный
string(email)
Проверяемый email.
result Обязательный
string
Возможные статусы:
  • “valid” - email адрес действительный,
  • “invalid” - email адрес недействительный,
  • “suspicious” - email адрес подозрительный,
  • “unknown” - адрес не удалось проверить. Принимающий сервер не ответил в рамках допустимого времени проверки.
cause Обязательный
string
Возможные статусы:
  • “no_mx_record” - у домена отсутствуют MX записи,
  • “syntax_error” - адрес не соответствует стандартам email,
  • “possible_typo” - возможно, адрес введен с ошибкой,
  • “mailbox_not_found” - адрес не существует,
  • “global_suppression” - адрес перманентно недоступен в сервисе из-за многократных недоставок,
  • “disposable” - одноразовый email, обычно такие адреса принимают почту только несколько минут,
  • “role” - общий адрес электронной почты, чаще всего используются группой людей и не принадлежит конкретному человеку,
  • “abuse” - адреса с которых поступает большое количество жалоб и нажатий на “спам”, иногда даже в автоматическом режиме,
  • “spamtrap” - адреса спам-ловушки, обычно размещаются почтовыми провайдерами в открытом доступе, но никогда не используются для подписки. Отправка писем на такие адреса сильно вредит репутации отправителя,
  • “smtp_connection_failed” - SMTP-сервер недоступен - возможно, адрес введен с ошибкой.
validity Обязательный
integer
Вероятность того, что адрес действительный. От 0 до 100 (100 - действительный, 0 - недействительный).
local_part Обязательный
string
Локальная часть email адреса (все, что перед знаком “@”).
domain Обязательный
string
Доменная часть email адреса.
mx_found Обязательный
boolean
Есть ли у домена MX запись? true если есть, false если отсутствует.
mx_record Обязательный
string
Предпочтительная MX-запись домена.
did_you_mean Обязательный
string(email)
Возможный адрес, полученный после исправления опечатки (для cause=possible_typo).
processed_at Обязательный
string(utc-date-time)
Дата и время проверки адреса в формате ГГГГ-ММ-ДД чч:мм:сс в часовом поясе UTC.

HTTP код default:

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

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

Template методы

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

template-set

POST https://us1.unione.io/ru/transactional/api/v1/template/set.json HTTP/1.1
Host: us1.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",
"reply_to_name": "John Smith",
"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://us1.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",
"reply_to_name" => "John Smith",
"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://us1.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",
"reply_to_name": "John Smith",
"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",
"reply_to_name" => "John Smith",
"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://us1.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://us1.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\","
+" \"reply_to_name\": \"John Smith\","
+" \"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://us1.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\","
+" \"reply_to_name\": \"John Smith\","
+" \"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",
"reply_to_name": "John Smith",
"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://us1.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

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

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

Параметры

Название Тип Описание
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Опциональный
string(uuid)
Уникальный идентификатор шаблона. Если указан, система попытается найти шаблон с указанным id и отредактировать его. Если не задан, будет создан новый шаблон.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» 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-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNIONE-Global-Language, X-UNIONE-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNIONE-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
»» X-UNIONE-Template-Engine Опциональный
string
Заголовок для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”. Имеет приоритет над значением, передаваемым в параметре “template_engine”.
» 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",
"reply_to_name": "John Smith",
"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)
Уникальный идентификатор шаблона. Если указан, система попытается найти шаблон с указанным id и отредактировать его. Если не задан, будет создан новый шаблон.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» 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-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNIONE-Global-Language, X-UNIONE-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNIONE-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
»» X-UNIONE-Template-Engine Опциональный
string
Заголовок для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”. Имеет приоритет над значением, передаваемым в параметре “template_engine”.
» 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://us1.unione.io/ru/transactional/api/v1/template/get.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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",
"reply_to_name": "John Smith",
"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)
Уникальный идентификатор шаблона. Если указан, система попытается найти шаблон с указанным id и отредактировать его. Если не задан, будет создан новый шаблон.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» 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-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNIONE-Global-Language, X-UNIONE-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNIONE-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
»» X-UNIONE-Template-Engine Опциональный
string
Заголовок для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”. Имеет приоритет над значением, передаваемым в параметре “template_engine”.
» 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://us1.unione.io/ru/transactional/api/v1/template/list.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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",
"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",
"reply_to_name": "John Smith",
"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)
Уникальный идентификатор шаблона.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» 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-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNIONE-Global-Language, X-UNIONE-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNIONE-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
»» X-UNIONE-Template-Engine Опциональный
string
Заголовок для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”. Имеет приоритет над значением, передаваемым в параметре “template_engine”.
» 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://us1.unione.io/ru/transactional/api/v1/template/delete.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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 событий в каждом (но вы можете настроить максимально разрешённое количество параллельных вызовов, увеличив их до 100).

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

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

webhook-set

POST https://us1.unione.io/ru/transactional/api/v1/webhook/set.json HTTP/1.1
Host: us1.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",
"subscribed",
"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://us1.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",
"subscribed",
"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://us1.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",
"subscribed",
"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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}

begin
result = RestClient.post(
'https://us1.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://us1.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\","
+" \"subscribed\","
+" \"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://us1.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\","
+" \"subscribed\","
+" \"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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
};
fetch('https://us1.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

Устанавливает или изменяет свойства вебхука - вашего обработчика уведомлений о событиях. В момент вызова webhook/set мы ожидаем, что к указанному вами URL можно обратиться с GET-запросом без параметров и в ответ придёт 200 OK.

Параметры

Название Тип Описание
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",
"subscribed",
"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”, “subscribed” или “spam”.
opened — сообщение доставлено и зарегистрировано его прочтение. Может измениться на “clicked”, “unsubscribed”, “subscribed” или “spam”.
clicked — сообщение доставлено, прочитано, был зарегистрирован переход по одной из ссылок в письме. Может измениться на “unsubscribed”, “subscribed” или “spam”.
unsubscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался по ссылке в письме. Может измениться на “subscribed”.
subscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался, а потом снова подписался по ссылке в письме. Может измениться на “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 в случае статусов “opened” и “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_will_retry – письмо было временно отклонено и позднее будет осуществлена повторная попытка доставки;
err_mailbox_discarded – адрес удален (т.е. когда-то существовал, но теперь его нет);
err_mailbox_full – почтовый ящик переполнен;
err_spam_rejected – письмо отвергнуто как спам;
err_blacklisted – письмо было отклонено по причине наличия IP-адреса или домена отправителя в каком-то из чёрных списков;
err_too_large – по мнению сервера получателя, письмо превышает допустимый размер;
err_unsubscribed – адресат ранее отписался от ваших рассылок;
err_unreachable – адрес помечен как постоянно недоступный по причине многократных ошибок доставки на этот адрес;
err_skip_letter – отправка отменена, так как email адрес временно недоступен;
err_domain_inactive – домен не принимает почту или не существует;
err_destination_misconfigured – домен не принимает почту из-за неверной настройки на стороне получателя, причем ответ сервера содержит информацию об устранимой причине (например, используется неработающий блеклист и т. п.);
err_delivery_failed – доставка не удалась по иным причинам;
err_spam_skipped – отправка отменена из-за блокировки рассылки как спама;
err_lost – письмо не было отправлено из-за несогласованности его частей, или было утеряно из-за сбоя на нашей стороне. Отправитель должен переотправить письмо самостоятельно, т.к. оригинал не сохранился;

Мы оставляем за собой право менять и добавлять внутренние статусы, поэтому остальные используемые на данный момент статусы перечислим только справочно, без пояснений: ok_sent, ok_delivered, ok_read, ok_link_visited, ok_unsubscribed, ok_resubscribed, ok_spam_folder, ok_fbl, not_sent, skip_dup_unreachable, skip_dup_temp_unreachable, skip_dup_mailbox_full, err_spam_removed, err_resend, err_unknown, err_retry_letter, err_src_invalid, err_dest_invalid, err_not_available, err_internal, err_no_dns, err_no_smtp, err_giveup.
»»»» destination_response Опциональный
string
Ответ SMTP-сервера.
»»»» user_agent Опциональный
string
Строка user agent получателя. Присутствует только если получилось её определить, для статусов “clicked” и “opened”.
»»»» ip Опциональный
string
IP-адрес получателя. Присутствует только если получилось его определить, для статусов “clicked” и “opened”.
»»» 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://us1.unione.io/ru/transactional/api/v1/webhook/get.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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",
"subscribed",
"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://us1.unione.io/ru/transactional/api/v1/webhook/list.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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",
"subscribed",
"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://us1.unione.io/ru/transactional/api/v1/webhook/delete.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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.

Suppression методы

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

suppression-set

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

{
"email": "user@example.com",
"cause": "unsubscribed",
"created": "2021-12-19 10:15:49"
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"email" => "user@example.com",
"cause" => "unsubscribed",
"created" => "2021-12-19 10:15:49"
];

try {
$response = $client->request('POST','suppression/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"email": "user@example.com",
"cause": "unsubscribed",
"created": "2021-12-19 10:15:49"
}
r = requests.post(base_url+'/suppression/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 = {
"email" => "user@example.com",
"cause" => "unsubscribed",
"created" => "2021-12-19 10:15:49"
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/suppression/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"email\": \"user@example.com\","
+" \"cause\": \"unsubscribed\","
+" \"created\": \"2021-12-19 10:15:49\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("suppression/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://us1.unione.io/ru/transactional/api/v1/suppression/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 = "{"
+" \"email\": \"user@example.com\","
+" \"cause\": \"unsubscribed\","
+" \"created\": \"2021-12-19 10:15:49\""
+"}";

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 = {
"email": "user@example.com",
"cause": "unsubscribed",
"created": "2021-12-19 10:15:49"
};
fetch('https://us1.unione.io/ru/transactional/api/v1/suppression/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/suppression/set.json

Добавляет email-адрес в список недоступных. Вы всегда сможете позже удалить этот адрес из списка недоступных методом suppression/delete.

Параметры

Название Тип Описание
email Обязательный
string(email)
Email-адрес, который надо добавить в список недоступных.
cause Обязательный
string
Причина, по которой отправка на этот email блокируется. Одна из следующих:
  • unsubscribed - указанный адрес отписан;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”.
created Опциональный
string(utc-date-time)
Когда была установлена недоступность, в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.

200 Ответ

{
"status": "success"
}

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

HTTP код 200:

Email-адрес добавлен в список недоступных.

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

HTTP код default:

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

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

suppression-get

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

{
"email": "user@example.com",
"all_projects": false
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"email" => "user@example.com",
"all_projects" => false
];

try {
$response = $client->request('POST','suppression/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"email": "user@example.com",
"all_projects": false
}
r = requests.post(base_url+'/suppression/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 = {
"email" => "user@example.com",
"all_projects" => false
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/suppression/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

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

var response = client.PostAsync("suppression/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://us1.unione.io/ru/transactional/api/v1/suppression/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 = "{"
+" \"email\": \"user@example.com\","
+" \"all_projects\": false"
+"}";

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 = {
"email": "user@example.com",
"all_projects": false
};
fetch('https://us1.unione.io/ru/transactional/api/v1/suppression/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/suppression/get.json

Возвращает причину и дату блокировки email-адреса.

Параметры

Название Тип Описание
email Обязательный
string(email)
Email-адрес, для которого надо получить данные о недоступности.
all_projects Опциональный
boolean
Если у пользователя включены проекты, all_projects=true позволит искать по данным всех проектов.

200 Ответ

{
"status": "success",
"email": "user@example.com",
"suppressions": [
{
"project_id": "6123462132634",
"cause": "unsubscribed",
"source": "user",
"is_deletable": true,
"created": "2021-12-19 10:15:49"
}
]
}

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

HTTP код 200:

Вызов завершился успешно (но массив suppressions может быть пуст, если email не заблокирован).

Название Тип Описание
status Обязательный
string
Строка “success”.
email Обязательный
string(email)
Email-адрес, для которого были запрошены данные о недоступности.
suppressions Обязательный
array
Массив объектов с информацией о недоступности.
» project_id Опциональный
string
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной.
» cause Обязательный
string
Причина, по которой отправка на этот email блокируется. Одна из следующих:
  • unsubscribed - указанный адрес отписан;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”.
  • blocked - отправка на этот адрес запрещена администрацией UniOne.
В будущем могут появиться и другие причины.
» source Обязательный
string
Источник попадания в список недоступных. Один из следующих:
  • user - действия пользователя с помощью метода suppression/set;
  • system - отправка на этот адрес запрещена системой, например из-за многократных недоставок;
  • subscriber - в связи с действиями получателя. В одном из предыдущих писем адресат нажал “Это спам” или отписался.
» is_deletable Обязательный
boolean
Можно ли удалить запись с помощью вызова suppression/delete.
» created Обязательный
string(utc-date-time)
Когда была установлена недоступность, в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.

HTTP код default:

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

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

suppression-list

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

{
"cause": "unsubscribed",
"source": "user",
"start_time": "2020-10-14 17:00:00",
"cursor": "Ajfb6Hvdkn3hdhhvG57xbdufhG5",
"limit": 50
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"cause" => "unsubscribed",
"source" => "user",
"start_time" => "2020-10-14 17:00:00",
"cursor" => "Ajfb6Hvdkn3hdhhvG57xbdufhG5",
"limit" => 50
];

try {
$response = $client->request('POST','suppression/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"cause": "unsubscribed",
"source": "user",
"start_time": "2020-10-14 17:00:00",
"cursor": "Ajfb6Hvdkn3hdhhvG57xbdufhG5",
"limit": 50
}
r = requests.post(base_url+'/suppression/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 = {
"cause" => "unsubscribed",
"source" => "user",
"start_time" => "2020-10-14 17:00:00",
"cursor" => "Ajfb6Hvdkn3hdhhvG57xbdufhG5",
"limit" => 50
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/suppression/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"cause\": \"unsubscribed\","
+" \"source\": \"user\","
+" \"start_time\": \"2020-10-14 17:00:00\","
+" \"cursor\": \"Ajfb6Hvdkn3hdhhvG57xbdufhG5\","
+" \"limit\": 50"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("suppression/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://us1.unione.io/ru/transactional/api/v1/suppression/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 = "{"
+" \"cause\": \"unsubscribed\","
+" \"source\": \"user\","
+" \"start_time\": \"2020-10-14 17:00:00\","
+" \"cursor\": \"Ajfb6Hvdkn3hdhhvG57xbdufhG5\","
+" \"limit\": 50"
+"}";

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 = {
"cause": "unsubscribed",
"source": "user",
"start_time": "2020-10-14 17:00:00",
"cursor": "Ajfb6Hvdkn3hdhhvG57xbdufhG5",
"limit": 50
};
fetch('https://us1.unione.io/ru/transactional/api/v1/suppression/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/suppression/list.json

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

Параметры

Название Тип Описание
cause Опциональный
string
Причина, по которой отправка на этот email блокируется. Одна из следующих:
  • unsubscribed - указанный адрес отписан;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”.
  • blocked - отправка на этот адрес запрещена администрацией UniOne.
В будущем могут появиться и другие причины.
source Опциональный
string
Источник попадания в список недоступных. Один из следующих:
  • user - действия пользователя с помощью метода suppression/set;
  • system - отправка на этот адрес запрещена системой, например из-за многократных недоставок;
  • subscriber - в связи с действиями получателя. В одном из предыдущих писем адресат нажал “Это спам” или отписался.
start_time Опциональный
string(utc-date)
Дата в формате ГГГГ-ММ-ДД чч:мм:сс, чтобы получить список блокировки с “start_time” по сегодняшний день. Игнорируется, если параметр “cursor” не пуст.
cursor Опциональный
string
Параметр указывает, с какой позиции начинать выборку. Должен быть пуст или отсутствовать для получения первой порции данных и который необходимо задавать для получения второй и последующих порций данных, подставляя значение поля “cursor” из предыдущей порции.
limit Опциональный
integer
Максимум записей, выдаваемых за один раз, по умолчанию 50.

200 Ответ

{
"status": "success",
"suppressions": [
{
"email": "user@example.com",
"cause": "unsubscribed",
"source": "user",
"is_deletable": true,
"created": "2021-12-19 10:15:49"
}
],
"cursor": "Ajfb6Hvdkn3hdhhvG57xbdufhG5"
}

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
suppressions Обязательный
array
Массив объектов с информацией о недоступности.
» email Опциональный
string(email)
Email-адрес который находится в списке недоступных.
» cause Обязательный
string
Причина, по которой отправка на этот email блокируется. Одна из следующих:
  • unsubscribed - указанный адрес отписан;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”.
  • blocked - отправка на этот адрес запрещена администрацией UniOne.
В будущем могут появиться и другие причины.
» source Обязательный
string
Источник попадания в список недоступных. Один из следующих:
  • user - действия пользователя с помощью метода suppression/set;
  • system - отправка на этот адрес запрещена системой, например из-за многократных недоставок;
  • subscriber - в связи с действиями получателя. В одном из предыдущих писем адресат нажал “Это спам” или отписался.
» is_deletable Обязательный
boolean
Можно ли удалить запись с помощью вызова suppression/delete.
» created Обязательный
string(utc-date-time)
Когда была установлена недоступность, в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
cursor Обязательный
string
Параметр указывает, с какой позиции начинать выборку. Должен быть пуст или отсутствовать для получения первой порции данных и который необходимо задавать для получения второй и последующих порций данных, подставляя значение поля “cursor” из предыдущей порции.

HTTP код default:

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

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

suppression-delete

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

{
"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://us1.unione.io/ru/transactional/api/v1/'
]);

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

try {
$response = $client->request('POST','suppression/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"email": "user@example.com"
}
r = requests.post(base_url+'/suppression/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 = {
"email" => "user@example.com"
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/suppression/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

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

var response = client.PostAsync("suppression/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://us1.unione.io/ru/transactional/api/v1/suppression/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 = "{"
+" \"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 = {
"email": "user@example.com"
};
fetch('https://us1.unione.io/ru/transactional/api/v1/suppression/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/suppression/delete.json

Удаляет email-адрес из списка недоступных (только записи с is_deletable=true). Если ни одной записи для email не было найдено, возвращается ошибка API 3003. Если записи о недоступности были найдены, но ни одну из них удалить нельзя, возвращается ошибка API 3004. Если превышен лимит удалений в сутки, возвращается ошибка API 906.

Параметры

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

200 Ответ

{
"status": "success"
}

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

HTTP код 200:

Email-адрес удалён из списка недоступных.

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

HTTP код default:

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

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

Domain методы

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

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

domain-get-dns-records

POST https://us1.unione.io/ru/transactional/api/v1/domain/get-dns-records.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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-провайдеров могут отличаться:

Для реализации white-label решений, есть возможность изменить стандартные DNS-записи на те, что не включают в себя подстроки “unione”. Что бы узнать подробнее - напишите в техподдержку.

Параметры

Название Тип Описание
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://us1.unione.io/ru/transactional/api/v1/domain/validate-verification-record.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.unione.io/ru/transactional/api/v1/domain/validate-dkim.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.unione.io/ru/transactional/api/v1/domain/list.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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.

Event-dump методы

Методы для получения списка произошедших событий за определенный период. Данные хранятся до 45 дней, в зависимости от вашего тарифа. Это значит, что можно запросить события начиная с 00:00:00 45 дня назад и до текущего момента времени. Для индивидуальных тарифов с большими объёмами по умолчанию события доступны только за последние 7 дней.

event-dump-create

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

{
"start_time": "2022-07-20 00:00:00",
"end_time": "2022-07-21 00:00:00",
"limit": 50,
"all_projects": false,
"filter": {
"job_id": "1ZymBc-00041N-9X",
"status": "sent",
"delivery_status": "string",
"email": "david@example.org",
"email_from": "sender@example.com",
"domain": "example.org",
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"delimiter": ";",
"format": "csv"
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"start_time" => "2022-07-20 00:00:00",
"end_time" => "2022-07-21 00:00:00",
"limit" => 50,
"all_projects" => false,
"filter" => [
"job_id" => "1ZymBc-00041N-9X",
"status" => "sent",
"delivery_status" => "string",
"email" => "david@example.org",
"email_from" => "sender@example.com",
"domain" => "example.org",
"campaign_id" => "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
],
"delimiter" => ";",
"format" => "csv"
];

try {
$response = $client->request('POST','event-dump/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"start_time": "2022-07-20 00:00:00",
"end_time": "2022-07-21 00:00:00",
"limit": 50,
"all_projects": false,
"filter": {
"job_id": "1ZymBc-00041N-9X",
"status": "sent",
"delivery_status": "string",
"email": "david@example.org",
"email_from": "sender@example.com",
"domain": "example.org",
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"delimiter": ";",
"format": "csv"
}
r = requests.post(base_url+'/event-dump/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 = {
"start_time" => "2022-07-20 00:00:00",
"end_time" => "2022-07-21 00:00:00",
"limit" => 50,
"all_projects" => false,
"filter" => {
"job_id" => "1ZymBc-00041N-9X",
"status" => "sent",
"delivery_status" => "string",
"email" => "david@example.org",
"email_from" => "sender@example.com",
"domain" => "example.org",
"campaign_id" => "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"delimiter" => ";",
"format" => "csv"
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/event-dump/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"start_time\": \"2022-07-20 00:00:00\","
+" \"end_time\": \"2022-07-21 00:00:00\","
+" \"limit\": 50,"
+" \"all_projects\": false,"
+" \"filter\": {"
+" \"job_id\": \"1ZymBc-00041N-9X\","
+" \"status\": \"sent\","
+" \"delivery_status\": \"string\","
+" \"email\": \"david@example.org\","
+" \"email_from\": \"sender@example.com\","
+" \"domain\": \"example.org\","
+" \"campaign_id\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\""
+" },"
+" \"delimiter\": \";\","
+" \"format\": \"csv\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("event-dump/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://us1.unione.io/ru/transactional/api/v1/event-dump/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 = "{"
+" \"start_time\": \"2022-07-20 00:00:00\","
+" \"end_time\": \"2022-07-21 00:00:00\","
+" \"limit\": 50,"
+" \"all_projects\": false,"
+" \"filter\": {"
+" \"job_id\": \"1ZymBc-00041N-9X\","
+" \"status\": \"sent\","
+" \"delivery_status\": \"string\","
+" \"email\": \"david@example.org\","
+" \"email_from\": \"sender@example.com\","
+" \"domain\": \"example.org\","
+" \"campaign_id\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\""
+" },"
+" \"delimiter\": \";\","
+" \"format\": \"csv\""
+"}";

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 = {
"start_time": "2022-07-20 00:00:00",
"end_time": "2022-07-21 00:00:00",
"limit": 50,
"all_projects": false,
"filter": {
"job_id": "1ZymBc-00041N-9X",
"status": "sent",
"delivery_status": "string",
"email": "david@example.org",
"email_from": "sender@example.com",
"domain": "example.org",
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"delimiter": ";",
"format": "csv"
};
fetch('https://us1.unione.io/ru/transactional/api/v1/event-dump/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/event-dump/create.json

Асинхронный метод, который инициирует подготовку для скачивания файлов дампа в CSV формате. Максимальное количество хранимых/создаваемых дампов ограничено десятью. При достижении лимита для запроса на подготовку нового дампа нужно удалить старые. Время хранения сформированного дампа - 8 часов, после чего он автоматически удаляется. Если период запроса данных больше суток или событий много, будут сформированы несколько файлов, в каждом из которых будет не более 100 000 событий. Файл содержит колонки со следующей информацией - ‘event_time’, ‘job_id’, ‘from_email’, ‘email’, ‘status’, ‘delivery_status’, ‘metadata’, ‘destination_response’, ‘user_agent’, ‘url’, ‘ip’, ‘tags’ и ‘project_id’ (если у пользователя включены проекты).

Параметры

Название Тип Описание
start_time Обязательный
string(utc-date-time)
Дата и время в формате ГГГГ-ММ-ДД чч:мм:сс, начиная с которой необходимо получить события. Данные хранятся до 45 дней, в зависимости от вашего тарифа.
end_time Опциональный
string(utc-date-time)
Дата и время в формате ГГГГ-ММ-ДД чч:мм:сс, до какого (не включая) запрашиваются события.
limit Опциональный
integer
Максимальное количество возвращаемых событий, по умолчанию 50. Если это значение превышает 100 000, будет создано несколько файлов, каждый из которых содержит максимум 100 000 событий.
all_projects Опциональный
boolean
Если у пользователя включены проекты, all_projects=true позволит получить данные всех проектов.
filter Опциональный
object
Объект со свойствами фильтра дампа событий.
» job_id Опциональный
string
Идентификатор задания, ранее возвращённый методом email/send.
» status Опциональный
string
Статус email. Можно указать одно из следующих значений:

sent — сообщение отправлено, но пока не доставлено.
delivered — сообщение доставлено.
opened — сообщение доставлено и зарегистрировано его прочтение.
clicked — сообщение доставлено, прочитано, был зарегистрирован переход по одной из ссылок в письме.
unsubscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался по ссылке в письме.
subscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался, а потом снова подписался по ссылке в письме.
soft_bounced — временная недоставка сообщения. UniOne продолжает попытки доставки в течение 2 суток.
hard_bounced - доставка не удалась, попыток доставки больше не будет.
spam — сообщение доставлено, но отмечено как “спам” получателем.
» delivery_status Опциональный
string
Внутренний детальный статус доставки UniOne. Можно указать несколько статусов через запятую. Вот некоторые из возможных статусов:

err_user_unknown – адрес не существует (и неизвестно, существовал ли когда-либо);
err_user_inactive – адрес не используется;
err_will_retry – письмо было временно отклонено и позднее будет осуществлена повторная попытка доставки;
err_mailbox_discarded – адрес удален (т.е. когда-то существовал, но теперь его нет);
err_mailbox_full – почтовый ящик переполнен;
err_spam_rejected – письмо отвергнуто как спам;
err_blacklisted – письмо было отклонено по причине наличия IP-адреса или домена отправителя в каком-то из чёрных списков;
err_too_large – по мнению сервера получателя, письмо превышает допустимый размер;
err_unsubscribed – адресат ранее отписался от ваших рассылок;
err_unreachable – адрес помечен как постоянно недоступный по причине многократных ошибок доставки на этот адрес;
err_skip_letter – отправка отменена, так как email адрес временно недоступен;
err_domain_inactive – домен не принимает почту или не существует;
err_destination_misconfigured – домен не принимает почту из-за неверной настройки на стороне получателя, причем ответ сервера содержит информацию об устранимой причине (например, используется неработающий блеклист и т. п.);
err_delivery_failed – доставка не удалась по иным причинам;
err_spam_skipped – отправка отменена из-за блокировки рассылки как спама;
err_lost – письмо не было отправлено из-за несогласованности его частей, или было утеряно из-за сбоя на нашей стороне. Отправитель должен переотправить письмо самостоятельно, т.к. оригинал не сохранился;

Мы оставляем за собой право менять и добавлять внутренние статусы, поэтому остальные используемые на данный момент статусы перечислим только справочно, без пояснений: ok_sent, ok_delivered, ok_read, ok_link_visited, ok_unsubscribed, ok_resubscribed, ok_spam_folder, ok_fbl, not_sent, skip_dup_unreachable, skip_dup_temp_unreachable, skip_dup_mailbox_full, err_spam_removed, err_resend, err_unknown, err_retry_letter, err_src_invalid, err_dest_invalid, err_not_available, err_internal, err_no_dns, err_no_smtp, err_giveup.
» email Опциональный
string(email)
Адрес получателя
» email_from Опциональный
string(email)
Адрес отправителя
» domain Опциональный
string
Домен получателя
» campaign_id Опциональный
string
Идентификатор рассылки, неотрицательное десятичное целое или UUID до 128 бит, переданное в метаданных в поле с именем “campaign_id” (имя можно настроить через техподдержку).
delimiter Опциональный
string
Разделитель полей, по умолчанию ‘,’. Допустимые значения ‘,’ и ‘;’.
format Опциональный
string
Формат получаемого файла “csv” (по умолчанию) или “csv_gzip”.

200 Ответ

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

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

HTTP код 200:

Вызов завершился успешно.

Название Тип Описание
status Обязательный
string
Строка “success”.
dump_id Обязательный
string
Идентификатор дампа. Используется для вызова метода event-dump/get.

HTTP код default:

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

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

event-dump-get

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

{
"dump_id": "Gqfasjh34tlasd"
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"dump_id" => "Gqfasjh34tlasd"
];

try {
$response = $client->request('POST','event-dump/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"dump_id": "Gqfasjh34tlasd"
}
r = requests.post(base_url+'/event-dump/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 = {
"dump_id" => "Gqfasjh34tlasd"
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/event-dump/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

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

var response = client.PostAsync("event-dump/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://us1.unione.io/ru/transactional/api/v1/event-dump/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 = "{"
+" \"dump_id\": \"Gqfasjh34tlasd\""
+"}";

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 = {
"dump_id": "Gqfasjh34tlasd"
};
fetch('https://us1.unione.io/ru/transactional/api/v1/event-dump/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/event-dump/get.json

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

Параметры

Название Тип Описание
dump_id Обязательный
string
Идентификатор дампа полученный методом event-dump/create.

200 Ответ

{
"status": "success",
"event_dump": {
"dump_id": "Gqfasjh34tlasd",
"dump_status": "in_process",
"files": [
{
"url": "https://eu1.unione.io/event-dump/Agejmh63Efmngaow4tDFGqwqt-1.csv",
"size": 512345
}
]
}
}

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
event_dump Обязательный
object
Объект со свойствами дампа событий.
» dump_id Обязательный
string
Идентификатор дампа полученный методом event-dump/create.
» dump_status Обязательный
string
Статус задачи. Одно из четырех значений:
  • queued - ожидает в очереди, обработка еще не начиналась;
  • in_process - идет обработка;
  • ready - обработка завершена, файлы доступны для скачивания;
  • failed - обработка прервана с ошибкой.
» files Опциональный
array
Массив объектов, каждый из которых обозначает готовый к скачиванию файл. Даже если “dump_status”=“in_process”, уже можно скачивать те файлы, которые указаны в “files”. В случае отсутствия событий, по заданным параметрам, будет возвращен пустой массив.
»» url Обязательный
string
Уникальный URL для скачивания файла с расширением .csv или .csv.gz, в зависимости от запрошенного формата.
»» size Обязательный
integer
Размер файла.

HTTP код default:

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

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

event-dump-list

POST https://us1.unione.io/ru/transactional/api/v1/event-dump/list.json HTTP/1.1
Host: us1.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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [];

try {
$response = $client->request('POST','event-dump/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://us1.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+'/event-dump/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 = {}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/event-dump/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://us1.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("event-dump/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://us1.unione.io/ru/transactional/api/v1/event-dump/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 = "{}";

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://us1.unione.io/ru/transactional/api/v1/event-dump/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/event-dump/list.json

Метод без параметров, возвращает список всех дампов событий.

200 Ответ

{
"status": "success",
"event_dumps": [
{
"dump_id": "Gqfasjh34tlasd",
"dump_status": "in_process",
"files": [
{
"url": "https://eu1.unione.io/event-dump/Agejmh63Efmngaow4tDFGqwqt-1.csv",
"size": 512345
}
]
}
]
}

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

HTTP код 200:

Информация со списком заданий успешно возвращена.

Название Тип Описание
status Обязательный
string
Строка “success”.
event_dumps Обязательный
array
Массив объектов, описывающих дампы событий. Каждый объект содержит те же свойства, что и объект ‘event_dump’, возвращаемый методом event-dump/get.
» dump_id Обязательный
string
Идентификатор дампа полученный методом event-dump/create.
» dump_status Обязательный
string
Статус задачи. Одно из четырех значений:
  • queued - ожидает в очереди, обработка еще не начиналась;
  • in_process - идет обработка;
  • ready - обработка завершена, файлы доступны для скачивания;
  • failed - обработка прервана с ошибкой.
» files Опциональный
array
Массив объектов, каждый из которых обозначает готовый к скачиванию файл. Даже если “dump_status”=“in_process”, уже можно скачивать те файлы, которые указаны в “files”. В случае отсутствия событий, по заданным параметрам, будет возвращен пустой массив.
»» url Обязательный
string
Уникальный URL для скачивания файла с расширением .csv или .csv.gz, в зависимости от запрошенного формата.
»» size Обязательный
integer
Размер файла.

HTTP код default:

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

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

event-dump-delete

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

{
"dump_id": "Gqfasjh34tlasd"
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"dump_id" => "Gqfasjh34tlasd"
];

try {
$response = $client->request('POST','event-dump/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"dump_id": "Gqfasjh34tlasd"
}
r = requests.post(base_url+'/event-dump/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 = {
"dump_id" => "Gqfasjh34tlasd"
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/event-dump/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

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

var response = client.PostAsync("event-dump/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://us1.unione.io/ru/transactional/api/v1/event-dump/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 = "{"
+" \"dump_id\": \"Gqfasjh34tlasd\""
+"}";

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 = {
"dump_id": "Gqfasjh34tlasd"
};
fetch('https://us1.unione.io/ru/transactional/api/v1/event-dump/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/event-dump/delete.json

Удаляет дамп из очереди и/или из хранилища.

Параметры

Название Тип Описание
dump_id Обязательный
string
Идентификатор дампа, полученный методом event-dump/create.

200 Ответ

{
"status": "success"
}

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

HTTP код 200:

Дамп успешно удалён.

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

HTTP код default:

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

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

Tag методы

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

tag-list

POST https://us1.unione.io/ru/transactional/api/v1/tag/list.json HTTP/1.1
Host: us1.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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [];

try {
$response = $client->request('POST','tag/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://us1.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+'/tag/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 = {}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/tag/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://us1.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("tag/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://us1.unione.io/ru/transactional/api/v1/tag/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 = "{}";

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://us1.unione.io/ru/transactional/api/v1/tag/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/tag/list.json

Метод без параметров, возвращает список всех пользовательских меток.

200 Ответ

{
"status": "success",
"tags": [
{
"tag_id": 54,
"tag": "example-tag1"
}
]
}

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

HTTP код 200:

Информация со списком меток успешно возвращена.

Название Тип Описание
status Обязательный
string
Строка “success”.
tags Обязательный
array
Массив объектов, с данными пользовательских меток.
» tag_id Обязательный
integer
Уникальный id метки.
» tag Обязательный
string
Название метки.

HTTP код default:

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

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

tag-delete

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

{
"tag_id": 54
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

$requestBody = [
"tag_id" => 54
];

try {
$response = $client->request('POST','tag/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://us1.unione.io/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"tag_id": 54
}
r = requests.post(base_url+'/tag/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 = {
"tag_id" => 54
}

begin
result = RestClient.post(
'https://us1.unione.io/ru/transactional/api/v1/tag/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://us1.unione.io/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

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

var response = client.PostAsync("tag/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://us1.unione.io/ru/transactional/api/v1/tag/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 = "{"
+" \"tag_id\": 54"
+"}";

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 = {
"tag_id": 54
};
fetch('https://us1.unione.io/ru/transactional/api/v1/tag/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/tag/delete.json

Удаляет метку.

Параметры

Название Тип Описание
tag_id Обязательный
integer
Уникальный id метки.

200 Ответ

{
"status": "success"
}

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

HTTP код 200:

Метка успешно удалена.

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

HTTP код default:

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

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

Project методы

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

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

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

project-create

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

{
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

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

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://us1.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",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
}
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",
"country" => "ES",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true,
"backend_id" => 1234
}
}

begin
result = RestClient.post(
'https://us1.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://us1.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\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_id\": 1234"
+" }"
+"}";
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://us1.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\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_id\": 1234"
+" }"
+"}";

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",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
};
fetch('https://us1.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
Название проекта, уникальное в рамках аккаунта пользователя.
» country Опциональный
string
Двухбуквенный код страны по правилам ISO-3166 alpha-2. Если задан, то UniOne обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то UniOne добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).
» backend_id Опциональный
integer
Уникальный идентификатор backend-домена который определяет домен ссылок или пул выделенных IP-адресов по умолчанию. Если отсутствует - аккаунту/проекту будет назначен системный backend-домен по умолчанию.

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://us1.unione.io/ru/transactional/api/v1/project/update.json HTTP/1.1
Host: us1.unione.io
Content-Type: application/json
Accept: application/json

{
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
}
<?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://us1.unione.io/ru/transactional/api/v1/'
]);

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

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://us1.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",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
}
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",
"country" => "ES",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true,
"backend_id" => 1234
}
}

begin
result = RestClient.post(
'https://us1.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://us1.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\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_id\": 1234"
+" }"
+"}";
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://us1.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\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_id\": 1234"
+" }"
+"}";

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",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
};
fetch('https://us1.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
Название проекта, уникальное в рамках аккаунта пользователя.
» country Опциональный
string
Двухбуквенный код страны по правилам ISO-3166 alpha-2. Если задан, то UniOne обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то UniOne добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).
» backend_id Опциональный
integer
Уникальный идентификатор backend-домена который определяет домен ссылок или пул выделенных IP-адресов по умолчанию. Если отсутствует - аккаунту/проекту будет назначен системный backend-домен по умолчанию.

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://us1.unione.io/ru/transactional/api/v1/project/list.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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",
"country": "ES",
"reg_time": "2020-12-28 17:15:45",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_id": 1234
}
]
}

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

HTTP код 200:

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

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

HTTP код default:

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

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

project-delete

POST https://us1.unione.io/ru/transactional/api/v1/project/delete.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.unione.io/ru/transactional/api/v1/system/info.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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.

Устаревшие методы

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

unsubscribed-set

POST https://us1.unione.io/ru/transactional/api/v1/unsubscribed/set.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.unione.io/ru/transactional/api/v1/unsubscribed/check.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.unione.io/ru/transactional/api/v1/unsubscribed/list.json HTTP/1.1
Host: us1.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://us1.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://us1.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://us1.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://us1.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://us1.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://us1.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.

Ошибки 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 синтаксисе запроса.
401 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 125 Указано несколько DKIM-ключей в DNS домена
Вам надо внести одну корректную DKIM-запись в DNS вашего домена.
400 126 В записи DNS присутствуют другие типы записей, отличных от DKIM.
Добавьте DNS-запись с DKIM-ключом, полученным с помощью метода domain/get-dns-records.
400 127 Достигнут лимит записей DKIM для основного домена.
Допускается не более 10 DKIM записей для основного домена.
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 208 Недопустимое имя приложенных файлов. Запрещенный символ ‘$symbol’.
Переименуйте файлы с запрещенными символами.
400 209 В приложенных файлах повторяются имена.
Переименуйте файлы с повторяющимися именами.
400 210 В файлах, приложенных к телу письма, повторяются имена.
Переименуйте файлы с повторяющимися именами.
400 211 Недопустимое имя в файлах, приложенных к телу письма. Запрещенный символ ‘$symbol’.
Переименуйте файлы с запрещенными символами.
400 212 Некорректно заданы подстановки в массиве получателей (не задан массив подстановок).
Убедитесь, что не превышен максимальный лимит подстановок и отсутствуют подстановки неправильного типа данных (допустимо string/integer).
400 213 Некорректный или несуществующий ‘custom_backend_id’.
Укажите активный backend-домен доступный вашему аккаунту/проекту.
403 215 Пользователь не может отправлять.
Попробуйте обратиться в службу поддержки.
400 216 Данные адресатов переданы неправильно.
Значение ‘metadata’ должно быть типа string или integer. Для передачи нескольких параметров в ‘metadata’ используйте синтаксис массива.
400 217 Превышен лимит параметров в ‘metadata’.
Сократите количество параметров в ‘metadata’, их должно быть не больше 10.
400 218 Данные адресатов переданы неправильно.
Убедитесь, что ключ параметра ‘metadata’ короче 64 символов.
400 219 Данные адресатов переданы неправильно.
Убедитесь, что значение параметра ‘metadata’ короче 1024 символов.
400 220 Данные адресатов переданы неправильно.
Ключ параметра ‘metadata’ не должен быть пустым.
400 221 В запросе нет html-тега <body>.
Поместите html-тег <body> внутрь тега <html>. Тег <body> необходим для отображения содержимого HTML письма.
400 223 В ‘attachments’ пропущено тело ‘content’ или передано пустоту.
Добавьте тело ‘content’ и укажите для него значение.
400 224 Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква.
Убедитесь, что названия переменных переданы правильно.
403 225 Нет прав для использования template engine ‘none’.
Свяжитесь с техподдержкой.
400 226 Значение параметров ‘track_links’ и ‘track_read’ должно быть равно 0 для использования ‘template_engine’:‘none’.
Убедитесь что значение передаваемых параметров ‘track_links’ и ‘track_read’ равно 0.
400 227 Некорректный или несуществующий ‘smtp_pool_id’.
Укажите корректный ‘smtp_pool_id’ доступный вашему аккаунту/проекту.
400 303 Список событий, переданный в запросе, содержит неподдерживаемое значение/событие не поддерживается.
Проверьте корректность ввода списка событий.
400 304 Не удалось найти Webhook с указанным URL.
Убедитесь в правильности передаваемого URL.
400 305 URL не передан.
Убедитесь в правильности передаваемого URL.
400 601 Шаблон не найден.
Проверьте корректность ввода id шаблона.
400 602 Название шаблона не передано.
Проверьте корректность ввода названия шаблона.
400 603 Название шаблона, переданное в запросе, уже принадлежит другому шаблону.
Используйте другое название шаблона.
400 604 Достигнуто максимальное значение количества шаблонов.
Удалите уже созданные шаблоны, чтобы создать новые. Количество шаблонов не должно превышать 10000.
400 701 Причина не найдена.
Недопустимая причина блокировки адреса. Свяжитесь с техподдержкой.
403 901 Отправка заблокирована из-за превышения дневного лимита.
У каждого пользователя есть максимальный дневной лимит отправок для предотвращения спама. Этот лимит автоматически увеличивается при успешных доставках. Вы можете либо плавно увеличивать объём отправок и лимит увеличится автоматически, либо запросить увеличение, обратившись в техподдержку.
403 902 Достигнут дневной лимит отправок на бесплатном тарифе.
Ждите следующего дня либо переключитесь на платный тариф.
403 903 На бесплатном тарифе разрешена отправка только на свои собственные подтверждённые домены.
Пожалуйста, подтвердите владение всеми доменами, на которые вы хотите слать письма либо переключитесь на платный тариф.
403 904 Недостаточно средств. Ошибка оплаты по карте.
Попробуйте подключить другую карту или свяжитесь с техподдержкой для разрешения ситуации.
403 905 Вы достигли предела отправок по вашему тарифному плану.
Обычно тарифные планы позволяют платное превышение лимита. В вашем случае это запрещено - возможно, из-за неоплаченных счетов. Пожалуйста, убедитесь, что все счета оплачены или свяжитесь с техподдержкой для решения проблемы.
400 906 Достигнут дневной лимит сброса блокировок email.
На сегодня вы использовали доступный лимит сброса блокировок. Попробуйте завтра или свяжитесь с техподдержкой для увеличения лимита.
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 1525 Ошибка в поле ‘options.send_at’.
Убедитесь, что дата и время запланированной отправки указаны не более чем на 24 часа вперёд.
400 1526 Ошибка в поле ‘headers[“X-UNIONE-Template-Engine”]’. Значение headers[“X-UNIONE-Template-Engine”] должно быть ‘velocity’ либо ‘simple’.
Передавайте значение параметра [“X-UNIONE-Template-Engine”] равным ‘velocity’ либо ‘simple’.
400 1527 Ошибка в поле ‘headers[“X-UNIONE-Global-Language”]’. Недопустимое значение поля.
Убедитесь, что передается одно из допустимых значений: ‘ru’, ‘en’, ‘ua’, ‘be’, ‘es’, ‘fr’, ‘pl’, de’, ‘pt’, ‘it’.
400 1528 Ошибка в поле ‘global_language’. Недопустимое значение поля.
Убедитесь, что передается одно из допустимых значений: ‘ru’, ‘en’, ‘ua’, ‘be’, ‘es’, ‘fr’, ‘pl’, ‘de’, ‘pt’, ‘it’.
400 1529 Ошибка в поле ‘options.send_at’. Значение должно быть в пределах 24 часов от текущего времени.
Передавайте значение параметра в пределах 24 часов от текущего времени.
400 1530 Ошибка в поле ‘options.send_at’. Это значение должно быть строкового типа или время указано в неверном формате.
Используйте строку для параметра ‘options.send_at’, убедитесь, что дата и время переданы правильно.
400 1532 Массив ‘tags’ должен содержать не более 4 элементов.
Пожалуйста, ограничьте количество строк до 4.
400 1533 Ошибка в поле ‘tags’. Достигнуто максимально допустимое количество меток.
Удалите уже созданные теги, чтобы создать новые. Количество тегов ограничено 10000.
400 1534 Слишком длинное название тега.
Убедитесь что передается не более 50 символов.
400 1535 Один или несколько тегов содержат недопустимые символы.
Убедитесь, что названия тегов переданы правильно.
400 1537 Ошибка в поле ‘bypass_global’. Значение параметра ‘bypass_global’ должно быть равно 1.
Убедитесь что значение параметра ‘bypass_global’ равно 1.
400 1538 Ошибка в поле ‘bypass_unsubscribed’. Запрещено использовать поле ‘bypass_unsubscribed’ без флага ‘allow_skip_unsubscribe’.
Свяжитесь с техподдержкой.
400 1539 Ошибка в поле ‘bypass_complained’. Запрещено использовать поле ‘bypass_complained’ без флага ‘allow_skip_unsubscribe’.
Свяжитесь с техподдержкой.
400 1540 Ошибка в поле ‘metadata’. Размер поля ‘metadata’ не должен превышать 4000 байт.
Уменьшите размер поля до 4000 байт.
400 1541 Ошибка в поле ‘global_metadata’. Размер поля ‘global_metadata’ не должен превышать 4000 байт.
Уменьшите размер поля до 4000 байт.
400 1542 Ошибка в поле ‘metadata’ и ‘global_metadata’. Размер поля ‘metadata’ и ‘global_metadata’ не должен превышать 4000 байт.
Уменьшите размер поля до 4000 байт.
400 1543 Ошибка в поле ‘global_metadata.campaign_id’. Это значение должно быть строкой.
Убедитесь, что в поле ‘global_metadata.campaign_id’ передана строка.
400 1544 Ошибка в поле ‘metadata.campaign_id’. Это значение должно быть строкой.
Убедитесь, что в поле ‘metadata.campaign_id’ передана строка.
400 1545 Ошибка в поле ‘metadata.campaign_id’. Указано недопустимое значение.
Используйте неотрицательное десятичное целое или UUID до 128 бит.
400 1546 Ошибка в поле ‘subject’. В подстановках присутствуют недопустимые значения.
Проверьте правильность подстановок в поле ‘subject’.
400 1547 Ошибка в поле ‘from_name’. В подстановках присутствуют недопустимые значения.
Проверьте правильность подстановок в поле ‘from_name’.
400 1548 Ошибка в поле ‘unsubscribe_url’. Это значение должно быть строкой.
Убедитесь, что в поле ‘unsubscribe_url’ передана строка.
400 1549 Ошибка в поле ‘unsubscribe_url’. В подстановках присутствуют недопустимые значения.
Проверьте правильность подстановок в поле ‘unsubscribe_url’.
400 1550 Ошибка в поле ‘options’. Это значение должно быть объектом.
Убедитесь, что в поле ‘options’ передан объект.
400 1551 Ошибка в поле ‘metadata’ или ‘global_metadata’. Значение должно быть строкового типа.
Передавайте строку в параметрах ‘metadata’ и ‘global_metadata’.
400 1554 Ошибка в поле ‘headers[‘Cc’]’. Количество email в заголовке “Cc” не должно превышать ‘N’.
Убедитесь, что количество адресов в заголовке “Cc” не превышает допустимое значение.
400 1555 Ошибка в поле 'headers[‘Cc’]». Email передаваемые в заголовке “Cc” должны присутствовать в массиве ‘recipients’.
Используйте только email из массива ‘recipients’.
400 1556 Ошибка в поле 'headers[‘Cc’]». Заголовок «Cc» допускается только с непустым заголовком «To».
Убедитесь, что переданы заголовки «headers[‘To’]».
400 1557 Ошибка в поле ‘headers[‘To’]’. Количество email в заголовке “To” не должно превышать ‘N’.
Убедитесь, что количество адресов в заголовке “To” не превышает допустимое значение.
400 1558 Ошибка в поле ‘headers[‘To’]’. Email передаваемые в заголовке “To” должны присутствовать в массиве ‘recipients’.
Используйте только email из массива ‘recipients’.
400 1559 Ошибка в поле ‘recipients’. Email не указан в заголовках “To” или “Cc”, или домен электронной почты не подтвержден
BCC может содержать только email переданные в заголовках “To” и “Cc” или на вашем подтвержденном домене.
400 1560 Ошибка в поле ‘recipients’. Количество email в ‘recipients’ не должно превышать лимит суммы адресов указанных в заголовках “To” и “Cc”.
Убедитесь, что количество писем в заголовках “To” и “Cc” не превышает допустимое.
400 1561 Ошибка в поле ‘headers[‘Cc’]’. Недопустимое значение заголовка.
Убедитесь, что заголовки переданы правильно.
400 1562 Ошибка в поле ‘headers[‘To’]’. Недопустимый значение заголовка.
Убедитесь, что заголовки переданы правильно.
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 1609, 1716 Ошибка в поле ‘country’. Это значение должно быть строкой.
Используйте строковый тип для поля ‘country’.
400 1610, 1717 Ошибка в поле ‘country’. Указан невалидный код страны.
Убедитесь что двухбуквенный код страны по правилам ISO-3166 alpha-2 указан верно.
400 1611, 1718 Ошибка в поле ‘backend_domain_id’. Это значение должно быть целочисленным.
Передавайте значение целочисленного типа в параметре ‘backend_domain_id’.
400 1612, 1719 Ошибка в поле ‘backend_domain_id’. Указанный backend-домен не принадлежит пользователю.
Укажите backend-домен доступный вашему аккаунту/проекту.
400 1613, 1720 Ошибка в поле ‘backend_domain_id’. Backend-домен неактивен.
Проверьте статус указанного backend-домена, он должен быть активен.
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 2306 Ошибка в поле ‘recipients’. Значение не должно быть пустым.
Убедитесь, что поле ‘recipients’ заполнено.
400 2307 Ошибка в поле ‘recipients’. Это значение должно быть строкового типа.
Используйте строку для параметра ‘recipients’.
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 2517 Ошибка в поле ‘subject’. Это значение должно быть строкой.
Убедитесь, что в поле ‘subject’ метода template/set передана строка.
400 2518 Ошибка в поле ‘subject’. В подстановках присутствуют недопустимые значения.
Проверьте правильность подстановок в поле ‘subject’ метода template/set.
400 2519 Ошибка в поле ‘from_name’. Это значение должно быть строкой.
Убедитесь, что в поле ‘from_name’ метода template/set передана строка.
400 2520 Ошибка в поле ‘from_name’. В подстановках присутствуют недопустимые значения.
Проверьте правильность подстановок в поле ‘from_name’ метода template/set.
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).
400 2900, 3000, 3100 Ошибка в поле ‘email’. Значение не должно быть пустым.
Убедитесь, что email указан в значении параметра.
400 2901, 3001, 3101 Ошибка в поле ‘email’. Значение должно быть строкового типа.
Передавайте строку в параметре ‘email’.
400 2902, 3002, 3102 Ошибка в поле ‘email’. Указан невалидный адрес.
Проверьте корректность ввода email.
400 2903 Ошибка в поле ‘all_projects’. Значение должно быть булевым.
Передавайте только значения true или false.
400 3003 Ошибка в поле ‘email’. Адрес не существует.
Указанный email не найден в списке блокировок.
400 3004 Ошибка в поле ‘email’. Адрес недоступен для удаления.
Указанный email недоступен для удаления из списка заблокированных. Например, имеет причину блокировки blocked.
400 3103 Ошибка в поле ‘cause’. Значение не должно быть пустым.
Убедитесь, что поле ‘cause’ заполнено.
400 3104, 3200 Ошибка в поле ‘cause’. Это значение должно быть строкой.
Используйте строковый тип для поля ‘cause’.
400 3105, 3201 Ошибка в поле ‘cause’. Недопустимое значение поля.
Убедитесь, что передается одно из допустимых значений.
400 3106 Ошибка в поле ‘created’. Это значение должно быть строкой.
Используйте строковый тип для поля ‘created’.
400 3107 Ошибка в поле ‘created’. Недопустимое значение поля.
Убедитесь, что дата и время переданы правильно.
400 3202 Ошибка в поле ‘source’. Это значение должно быть строкой.
Используйте строковый тип для поля ‘source’.
400 3203 Ошибка в поле ‘source’. Недопустимое значение поля.
Убедитесь, что передается одно из допустимых значений.
400 3204 Ошибка в поле ‘start_time’. Это значение должно быть строкой.
Используйте строковый тип для поля ‘start_time’.
400 3205 Ошибка в поле ‘start_time’. Недопустимое значение поля.
Убедитесь, что дата и время переданы правильно.
400 3206 Ошибка в поле ‘cursor’. Это значение должно быть строкой.
Используйте строковый тип для поля ‘cursor’.
400 3207 Ошибка в поле ‘cursor’. Недопустимое значение поля.
Убедитесь, что передается одно из допустимых значений.
400 3208 Ошибка в поле ‘limit’. Это значение должно быть целочисленным.
Передавайте значение целочисленного типа в параметре ‘limit’.
400 3209 Ошибка в поле ‘limit’. Это значение должно быть больше или равно 0.
Значение ‘limit’ должно быть больше или равно 0.
400 3300 Ошибка в поле ‘start_time’. Значение не должно быть пустым.
Убедитесь, что поле ‘start_time’ заполнено.
400 3301 Ошибка в поле ‘start_time’. Недопустимое значение поля.
Убедитесь, что дата и время переданы правильно.
400 3302 Ошибка в поле ‘end_time’. Недопустимое значение поля.
Убедитесь, что дата и время переданы правильно.
400 3303 Ошибка в поле ‘limit’. Это значение должно быть больше или равно 0.
Убедитесь что передаваемое значение больше или равно 0.
400 3304 Ошибка в поле ‘format’. Недопустимое значение формата файла дампа событий.
Используйте только формат ‘csv’ или ‘csv_gzip’.
400 3305 Ошибка в поле ‘delimiter’. Недопустимое значение поля ‘delimiter’.
Используйте только ‘;’ или ‘,’ в качестве разделителя.
400 3308 Ошибка в поле ‘all_projects’. У пользователя нет доступа к использованию проектов.
Методы проектов по умолчанию отключены. Чтобы их включить, вам необходимо обратиться в службу поддержки.
400 3309 Достигнуто максимальное значение количества дампов событий.
Удалите уже созданные дампы, чтобы создать новые. Количество дампов не должно превышать 10.
400 3310 Ошибка в поле ‘start_time’. Дата начала интервала не может быть раньше, чем ‘$time’.
Убедитесь, что ‘start_time’ находится в допустимом диапазоне.
400 3311 Недопустимое значение поля ‘limit’. Это значение должно быть целочисленным.
Передавайте значение целочисленного типа в параметре ‘limit’.
400 3312 Ошибка в поле ‘delimiter’. Значение должно быть строкового типа.
Используйте строку для параметра ‘delimiter’.
400 3313 Ошибка в поле ‘format’. Значение должно быть строкового типа.
Используйте строку для параметра ‘format’.
400 3400 Поле ‘filter’ должно быть объектом.
Проверьте передаваемый JSON и используйте объект для поля ‘filter’ (не массив, строку или какой-то другой тип).
400 3401 Ошибка в поле ‘filter.job_id’. Значение должно быть строкового типа.
Передавайте строку в параметре ‘filter.job_id’.
400 3402 Ошибка в поле ‘filter.status’. Это значение должно быть строкой.
Убедитесь, что в поле ‘filter.status’ передана строка.
400 3403 Ошибка в поле ‘filter.status’. Недопустимый статус.
Убедитесь, что передается одно из допустимых значений.
400 3404 Ошибка в поле ‘filter.email’. Это значение должно быть строкой.
Убедитесь, что в поле ‘filter.email’ передана строка.
400 3405 Ошибка в поле ‘filter.email’. Недопустимый адрес.
Проверьте, корректно ли введен адрес.
400 3406 Ошибка в поле ‘filter.email_from’. Значение должно быть строкового типа.
Передавайте строку в параметре ‘filter.email_from’.
400 3407 Ошибка в поле ‘filter.email_from’. Недопустимый адрес.
Проверьте, корректно ли введен адрес.
400 3408 Ошибка в поле ‘filter.domain’. Значение должно быть строкового типа.
Передавайте строку в параметре ‘filter.domain’.
400 3409 Ошибка в поле ‘filter.domain’. Недопустимое значение домена.
Укажите корректное значение домена.
400 3410 Ошибка в поле ‘filter.domain’. Указанный домен отличается от передаваемого в email.
Убедитесь, что домен указан правильно.
400 3411 Ошибка в поле ‘filter.delivery_status’. Значение должно быть строкового типа.
Передавайте строку в параметре ‘filter.delivery_status’.
400 3412 Ошибка в поле ‘filter.delivery_status’. Недопустимый статус.
Убедитесь, что передается одно из допустимых значений.
400 3413 Ошибка в поле ‘filter.campaign_id’. Это значение должно быть строкой.
Убедитесь, что в поле ‘filter.campaign_id’ передана строка.
400 3414 Ошибка в поле ‘filter.campaign_id’. Указано недопустимое значение.
Используйте беззнаковое целочисленное строковое число до 128 бит.
400 3500, 3600 Ошибка в поле ‘dump_id’. Значение не должно быть пустым.
Убедитесь, что ‘dump_id’ указан в значении параметра.
400 3501, 3601 Ошибка в поле ‘dump_id’. Это значение не валидно.
Убедитесь в правильности передаваемого ‘dump_id’.
400 3502, 3602 Ошибка в поле ‘dump_id’. Дамп с ID ‘NNNN’ не существует.
Проверьте идентификатор дампа. Может быть, он был удалён или никогда и не существовал?
400 3700 Ошибка в поле ‘tag_id’. Значение не должно быть пустым.
Убедитесь, что ‘tag_id’ указан в значении параметра.
400 3701 Недопустимое значение поля ‘tag_id’. Это значение должно быть целочисленным.
Передавайте значение целочисленного типа в параметре ‘tag_id’.
400 3800 Ошибка в поле ‘email’. Максимальное количество одновременных запросов не должно превышать 4.
Убедитесь, что количество одновременных запросов не превышает 4.
400 3801 Ошибка в поле ‘email’. Значение не должно быть пустым.
Убедитесь, что поле ‘email’ заполнено.
400 3802 Ошибка в поле ‘email’. Это значение должно быть строкового типа.
Используйте строку для параметра ‘email’.
400 3803 Ошибка в поле ‘email’. Превышен дневной лимит вызова метода email-validation/single.
Попробуйте повторить вызов на следующий день.