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

Web API v1.36

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

Все методы Unisender Go 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 – Внутренняя ошибка серверов Unisender Go (может быть 500, 502, 503 etc.). Попробуйте повторить запрос позднее.

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

Email методы

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

email-send

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

{
"message": {
"recipients": [
{
"email": "user@example.com",
"substitutions": {
"CustomerId": 12452,
"to_name": "John Smith"
},
"metadata": {
"campaign_id": "email61324",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"skip_unsubscribe": 0,
"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",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"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://go1.unisender.ru/ru/transactional/api/v1/'
]);

$requestBody = [
"message" => [
"recipients" => [
[
"email" => "user@example.com",
"substitutions" => [
"CustomerId" => 12452,
"to_name" => "John Smith"
],
"metadata" => [
"campaign_id" => "email61324",
"customer_hash" => "b253ac7"
]
]
],
"template_id" => "string",
"skip_unsubscribe" => 0,
"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",
"track_links" => 0,
"track_read" => 0,
"headers" => [
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
],
"attachments" => [
[
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
]
],
"inline_attachments" => [
[
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
]
],
"options" => [
"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://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}

request_body = {
"message": {
"recipients": [
{
"email": "user@example.com",
"substitutions": {
"CustomerId": 12452,
"to_name": "John Smith"
},
"metadata": {
"campaign_id": "email61324",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"skip_unsubscribe": 0,
"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",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"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" => "email61324",
"customer_hash" => "b253ac7"
}
}
],
"template_id" => "string",
"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",
"track_links" => 0,
"track_read" => 0,
"headers" => {
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments" => [
{
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments" => [
{
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options" => {
"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://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));

string requestBody = "{"
+" \"message\": {"
+" \"recipients\": ["
+" {"
+" \"email\": \"user@example.com\","
+" \"substitutions\": {"
+" \"CustomerId\": 12452,"
+" \"to_name\": \"John Smith\""
+" },"
+" \"metadata\": {"
+" \"campaign_id\": \"email61324\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"skip_unsubscribe\": 0,"
+" \"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\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ],"
+" \"options\": {"
+" \"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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/email/send.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"message\": {"
+" \"recipients\": ["
+" {"
+" \"email\": \"user@example.com\","
+" \"substitutions\": {"
+" \"CustomerId\": 12452,"
+" \"to_name\": \"John Smith\""
+" },"
+" \"metadata\": {"
+" \"campaign_id\": \"email61324\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"skip_unsubscribe\": 0,"
+" \"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\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ],"
+" \"options\": {"
+" \"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": "email61324",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"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",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"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://go1.unisender.ru/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”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» template_id Опциональный
string(uuid)
Уникальный идентификатор шаблона, созданного ранее методом template/set. Если указан, то поля шаблона подставляются вместо пропущенных полей email/send. Например, если в email/send не указан body - берётся тело письма из шаблона, а если не указан subject - берётся тема из шаблона.
» skip_unsubscribe Опциональный
integer
Пропустить или не пропускать добавление стандартного блока со ссылкой отписки к HTML-части письма. 1=пропустить, 0=добавить, по умолчанию 0. Для использования skip_unsubscribe=1 вам надо попросить техподдержку включить такую возможность.
» global_language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» 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 символа. Метаданные передаются при вызове вебхуков.
» 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-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNISENDER-GO-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”.
»» X-UNISENDER-GO-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-адресов и использовать эту опцию для выбора. Обратитесь в техподдержку, чтобы получить право для аккаунта или проекта на использование данной опции и идентификаторы ваших backend-доменов.
»» smtp_pool_id Опциональный
string(uuid)
Идентификатор пула SMTP, через который отправляется сообщение. Если отсутствует - отправка будет через пул, назначенный вашему аккаунту/проекту по умолчанию. Вы можете приобрести один или несколько выделенных IP-адресов и использовать эту опцию для выбора, отправлять письмо через определённые IP или через общий пул. Обратитесь в техподдержку, чтобы получить идентификаторы ваших выделенных IP и общего пула.

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

email-subscribe

POST https://go1.unisender.ru/ru/transactional/api/v1/email/subscribe.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/email/subscribe.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

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

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

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

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

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

Параметры

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

200 Ответ

{
"status": "success"
}

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

HTTP код 200:

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

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

HTTP код default:

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

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

Template методы

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

template-set

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

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

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

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

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

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

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

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

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

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

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

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

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

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

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

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

Параметры

Название Тип Описание
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Обязательный
string(uuid)
Уникальный идентификатор шаблона.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Обязательный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNISENDER-GO-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”.
»» X-UNISENDER-GO-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",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Обязательный
string(uuid)
Уникальный идентификатор шаблона.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Обязательный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNISENDER-GO-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”.
»» X-UNISENDER-GO-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://go1.unisender.ru/ru/transactional/api/v1/template/get.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/template/get.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

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

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Обязательный
string(uuid)
Уникальный идентификатор шаблона.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”. По умолчанию - “simple”.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символы “_” и “-”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Обязательный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNISENDER-GO-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”.
»» X-UNISENDER-GO-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://go1.unisender.ru/ru/transactional/api/v1/template/list.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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",
"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”. По умолчанию - “simple”.
» 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 символа. Метаданные передаются при вызове вебхуков.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Обязательный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки List-Unsubscribe, List-Subscribe, List-Help, List-Owner, List-Archive, In-Reply-To и References.
»» X-UNISENDER-GO-Global-Language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”.
»» X-UNISENDER-GO-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://go1.unisender.ru/ru/transactional/api/v1/template/delete.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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 методы

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

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

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

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

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

webhook-set

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

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

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

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

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

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

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

begin
result = RestClient.post(
'https://go1.unisender.ru/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://go1.unisender.ru/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/unisender-go-webhook\","
+" \"status\": \"active\","
+" \"event_format\": \"json_post\","
+" \"delivery_info\": 0,"
+" \"single_event\": 0,"
+" \"max_parallel\": 10,"
+" \"events\": {"
+" \"spam_block\": ["
+" \"*\""
+" ],"
+" \"email_status\": ["
+" \"delivered\","
+" \"opened\","
+" \"clicked\","
+" \"unsubscribed\","
+" \"soft_bounced\","
+" \"hard_bounced\","
+" \"spam\""
+" ]"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("webhook/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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/unisender-go-webhook\","
+" \"status\": \"active\","
+" \"event_format\": \"json_post\","
+" \"delivery_info\": 0,"
+" \"single_event\": 0,"
+" \"max_parallel\": 10,"
+" \"events\": {"
+" \"spam_block\": ["
+" \"*\""
+" ],"
+" \"email_status\": ["
+" \"delivered\","
+" \"opened\","
+" \"clicked\","
+" \"unsubscribed\","
+" \"soft_bounced\","
+" \"hard_bounced\","
+" \"spam\""
+" ]"
+" }"
+"}";

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

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

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

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

callback-format

 

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

Unisender Go предоставляет два типа событий, различающихся полем 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/unisender-go-webhook HTTP/1.1
Host: yourhost.example.com
Content-Type: application/json

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

Параметры

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

sent — сообщение отправлено, но пока не доставлено.
delivered — сообщение доставлено. Может измениться на “opened”, “clicked”, “unsubscribed” или “spam”.
opened — сообщение доставлено и зарегистрировано его прочтение. Может измениться на “clicked”, “unsubscribed” или “spam”.
clicked — сообщение доставлено, прочитано, был зарегистрирован переход по одной из ссылок в письме. Может измениться на “unsubscribed” или “spam”.
unsubscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался по ссылке в письме. Статус окончательный.
soft_bounced — временная недоставка сообщения. Unisender Go продолжает попытки доставки в течение 2 суток. В случае успешной доставки письмо перейдёт в статус “delivered”, в случае неуспешной - в “hard_bounced”.
hard_bounced - доставка не удалась, попыток доставки больше не будет. Статус окончательный. Возможных причин неудачной доставки масса, для их анализа можно использовать текст ответа SMTP-сервера из поля delivery_info.destination_response или нашу внутреннюю классификацию ошибок из поля delivery_info.delivery_status.
spam — сообщение доставлено, но отмечено как “спам” получателем. Статус окончательный. Вот некоторые домены, от которых Unisender Go может получить и обработать жалобу о спаме (используя технологию 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
Внутренний детальный статус доставки Unisender Go. Вот некоторые из возможных статусов:

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_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 из общего пула Unisender Go будет пробовать ещё несколько. Свойство присутствует только если 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://go1.unisender.ru/ru/transactional/api/v1/webhook/get.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/webhook/get.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

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

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

webhook-list

POST https://go1.unisender.ru/ru/transactional/api/v1/webhook/list.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/webhook/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

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

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

webhook-delete

POST https://go1.unisender.ru/ru/transactional/api/v1/webhook/delete.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/webhook/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

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

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

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

Параметры

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

200 Ответ

{
"status": "success"
}

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

HTTP код 200:

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

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

HTTP код default:

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

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

Unsubscribed методы

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

unsubscribed-set

POST https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/set.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/check.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/list.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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.

Suppression методы

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

suppression-set

POST https://go1.unisender.ru/ru/transactional/api/v1/suppression/set.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/suppression/get.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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 - отправка на этот адрес запрещена администрацией Unisender Go.
В будущем могут появиться и другие причины.
» 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://go1.unisender.ru/ru/transactional/api/v1/suppression/list.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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 - отправка на этот адрес запрещена администрацией Unisender Go.
В будущем могут появиться и другие причины.
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": [
{
"project_id": "6123462132634",
"cause": "unsubscribed",
"source": "user",
"is_deletable": true,
"created": "2021-12-19 10:15:49"
}
],
"cursor": "Ajfb6Hvdkn3hdhhvG57xbdufhG5"
}

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
suppressions Обязательный
array
Массив объектов с информацией о блокировках.
» project_id Опциональный
string
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной.
» cause Обязательный
string
Причина, по которой отправка на этот email блокируется. Одна из следующих:
  • unsubscribed - указанный адрес отписан;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”.
  • blocked - отправка на этот адрес запрещена администрацией Unisender Go.
В будущем могут появиться и другие причины.
» 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://go1.unisender.ru/ru/transactional/api/v1/suppression/delete.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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 методы

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

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

domain-get-dns-records

POST https://go1.unisender.ru/ru/transactional/api/v1/domain/get-dns-records.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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 для использования домена в Unisender Go.

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

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

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

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

Параметры

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

200 Ответ

{
"status": "success",
"domain": "example.com",
"verification-record": "unisender-go-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://go1.unisender.ru/ru/transactional/api/v1/domain/validate-verification-record.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/domain/validate-dkim.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/ru/transactional/api/v1/domain/list.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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": "unisender-go-validate-hash=483bb362ebdbeedd755cfb1d4d661",
"status": "confirmed"
},
"dkim": {
"key": "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDo7",
"status": "active"
}
}
]
}

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

HTTP код 200:

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

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

HTTP код default:

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

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

Project методы

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

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

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

project-create

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

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

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

base_url = 'https://go1.unisender.ru/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
}
}
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
}
}

begin
result = RestClient.post(
'https://go1.unisender.ru/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://go1.unisender.ru/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"
+" }"
+"}";
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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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"
+" }"
+"}";

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
}
};
fetch('https://go1.unisender.ru/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. Если задан, то Unisender Go обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то Unisender Go добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

project-update

POST https://go1.unisender.ru/ru/transactional/api/v1/project/update.json HTTP/1.1
Host: go1.unisender.ru
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
}
}
<?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://go1.unisender.ru/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
]
];

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://go1.unisender.ru/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
}
}
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
}
}

begin
result = RestClient.post(
'https://go1.unisender.ru/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://go1.unisender.ru/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"
+" }"
+"}";
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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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"
+" }"
+"}";

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
}
};
fetch('https://go1.unisender.ru/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. Если задан, то Unisender Go обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то Unisender Go добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена).

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

project-list

POST https://go1.unisender.ru/ru/transactional/api/v1/project/list.json HTTP/1.1
Host: go1.unisender.ru
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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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://go1.unisender.ru/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("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/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://go1.unisender.ru/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
}
]
}

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

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. Если задан, то Unisender Go обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран.
» reg_time Обязательный
string(utc-date-time)
Дата и время создания проекта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”.
» send_enabled Опциональный
boolean
Разрешена ли отправка писем для проекта.
» custom_unsubscribe_url_enabled Опциональный
boolean
Если false, то Unisender Go добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было у