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

Web API v1.65

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

Все методы 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": "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"tags": [
"string1"
],
"skip_unsubscribe": 0,
"global_language": "string",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"bypass_global": 0,
"bypass_unavailable": 0,
"bypass_unsubscribed": 0,
"bypass_complained": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"send_at": "2021-11-19 10:00:00",
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
}
<?php

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

base_url = 'https://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": "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"tags": [
"string1"
],
"skip_unsubscribe": 0,
"global_language": "string",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"bypass_global": 0,
"bypass_unavailable": 0,
"bypass_unsubscribed": 0,
"bypass_complained": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"send_at": "2021-11-19 10:00:00",
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
}
r = requests.post(base_url+'/email/send.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

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

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

begin
result = RestClient.post(
'https://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\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"tags\": ["
+" \"string1\""
+" ],"
+" \"skip_unsubscribe\": 0,"
+" \"global_language\": \"string\","
+" \"template_engine\": \"simple\","
+" \"global_substitutions\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"global_metadata\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"body\": {"
+" \"html\": \"<b>Hello, {{to_name}}</b>\","
+" \"plaintext\": \"Hello, {{to_name}}\","
+" \"amp\": \"<!doctype html><html amp4email><head> <meta charset=\\\"utf-8\\\"><script async src=\\\"https://cdn.ampproject.org/v0.js\\\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>\""
+" },"
+" \"subject\": \"string\","
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"John Smith\","
+" \"reply_to\": \"user@example.com\","
+" \"reply_to_name\": \"John Smith\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"bypass_global\": 0,"
+" \"bypass_unavailable\": 0,"
+" \"bypass_unsubscribed\": 0,"
+" \"bypass_complained\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ],"
+" \"options\": {"
+" \"send_at\": \"2021-11-19 10:00:00\","
+" \"unsubscribe_url\": \"https://example.org/unsubscribe/{{CustomerId}}\","
+" \"custom_backend_id\": 0,"
+" \"smtp_pool_id\": \"string\""
+" }"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("email/send.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("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\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\","
+" \"customer_hash\": \"b253ac7\""
+" }"
+" }"
+" ],"
+" \"template_id\": \"string\","
+" \"tags\": ["
+" \"string1\""
+" ],"
+" \"skip_unsubscribe\": 0,"
+" \"global_language\": \"string\","
+" \"template_engine\": \"simple\","
+" \"global_substitutions\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"global_metadata\": {"
+" \"property1\": \"string\","
+" \"property2\": \"string\""
+" },"
+" \"body\": {"
+" \"html\": \"<b>Hello, {{to_name}}</b>\","
+" \"plaintext\": \"Hello, {{to_name}}\","
+" \"amp\": \"<!doctype html><html amp4email><head> <meta charset=\\\"utf-8\\\"><script async src=\\\"https://cdn.ampproject.org/v0.js\\\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>\""
+" },"
+" \"subject\": \"string\","
+" \"from_email\": \"user@example.com\","
+" \"from_name\": \"John Smith\","
+" \"reply_to\": \"user@example.com\","
+" \"reply_to_name\": \"John Smith\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"bypass_global\": 0,"
+" \"bypass_unavailable\": 0,"
+" \"bypass_unsubscribed\": 0,"
+" \"bypass_complained\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ],"
+" \"options\": {"
+" \"send_at\": \"2021-11-19 10:00:00\","
+" \"unsubscribe_url\": \"https://example.org/unsubscribe/{{CustomerId}}\","
+" \"custom_backend_id\": 0,"
+" \"smtp_pool_id\": \"string\""
+" }"
+" }"
+"}";

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

const inputBody = {
"message": {
"recipients": [
{
"email": "user@example.com",
"substitutions": {
"CustomerId": 12452,
"to_name": "John Smith"
},
"metadata": {
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43",
"customer_hash": "b253ac7"
}
}
],
"template_id": "string",
"tags": [
"string1"
],
"skip_unsubscribe": 0,
"global_language": "string",
"template_engine": "simple",
"global_substitutions": {
"property1": "string",
"property2": "string"
},
"global_metadata": {
"property1": "string",
"property2": "string"
},
"body": {
"html": "<b>Hello, {{to_name}}</b>",
"plaintext": "Hello, {{to_name}}",
"amp": "<!doctype html><html amp4email><head> <meta charset=\"utf-8\"><script async src=\"https://cdn.ampproject.org/v0.js\"></script> <style amp4email-boilerplate>body{visibility:hidden}</style></head><body> Hello, AMP4EMAIL world.</body></html>"
},
"subject": "string",
"from_email": "user@example.com",
"from_name": "John Smith",
"reply_to": "user@example.com",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"bypass_global": 0,
"bypass_unavailable": 0,
"bypass_unsubscribed": 0,
"bypass_complained": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"options": {
"send_at": "2021-11-19 10:00:00",
"unsubscribe_url": "https://example.org/unsubscribe/{{CustomerId}}",
"custom_backend_id": 0,
"smtp_pool_id": "string"
}
}
};
fetch('https://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” - строка до 64 символов длиной, “value” - строка до 1024 символов длиной, максимальное количество ключей - 10. Метаданные передаются при вызове вебхуков и методов event-dump. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» template_id Опциональный
string(uuid)
Уникальный идентификатор шаблона, созданного ранее методом template/set. Если указан, то поля шаблона подставляются вместо пропущенных полей email/send. Например, если в email/send не указан body - берётся тело письма из шаблона, а если не указан subject - берётся тема из шаблона.
» tags Опциональный
array
Массив из строк, до 50 символов в каждой. Максимум 4 строки в массиве, строки должны быть уникальны. Для каждого аккаунта/проекта разрешено не более 10 000 меток, при превышении метод email/send будет возвращать ошибку. Метки могут использоваться для категоризации писем по выбранным вами критериям. Метки передаются при вызове вебхуков и методов event-dump.
» skip_unsubscribe Опциональный
integer
Пропустить или не пропускать добавление стандартного блока со ссылкой отписки к HTML-части письма. 1=пропустить, 0=добавить, по умолчанию 0. Для использования skip_unsubscribe=1 вам надо попросить техподдержку включить такую возможность.
» global_language Опциональный
string
Заголовок для выбора языка ссылки и страницы отписки. Допустимые значения “be”, “de”, “en”, “es”, “fr”, “it”, “pl”, “pt”, “ru”, “ua”, “kz”.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Обязательный
string
Тема письма.
» from_email Опциональный
string(email)
Email-адрес отправителя. Обязателен только при пустом template_id.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» bypass_global Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список глобальной недоступности, при отправке не будут учитываться данные о недоступности адресов или жалобы, полученные при отправке другими пользователями Unisender Go. Для некоторых системных записей может быть запрещено
» bypass_unavailable Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список недоступных адресов текущего аккаунта/проекта. Указание 1 возможно только при одновременном указании bypass_global=1.
» bypass_unsubscribed Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список отписавшихся от рассылок текущего аккаунта/проекта. Указание 1 возможно только при одновременном указании bypass_global=1. Параметр доступен только тем пользователям, которым техподдержка одобрила отключение ссылки отписки.
» bypass_complained Опциональный
integer
(0 или 1, по умолчанию 0) Значение 1=игнорировать список пожаловавшихся на аккаунт/проект. Указание 1 возможно только при одновременном указании bypass_global=1. Параметр доступен только тем пользователям, которым техподдержка одобрила отключение ссылки отписки.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки 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”, “kz”.
»» 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-адресов и использовать эту опцию для выбора.
»» smtp_pool_id Опциональный
string(uuid)
Идентификатор пула SMTP, через который отправляется сообщение. Обычно нет необходимости указывать пул явно, т.к. он выбирается автоматически либо как пул по умолчанию для вашего аккаунта/проекта, либо в соответствии с переданным параметром custom_backend_id.

200 Ответ

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

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

HTTP код 200:

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

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

Email-validation методы

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

email-validation-single

POST https://go1.unisender.ru/ru/transactional/api/v1/email-validation/single.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','email-validation/single.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}

// ...
import requests

base_url = 'https://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+'/email-validation/single.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

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

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

begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/email-validation/single.json',
params.to_json,
headers
)

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

class Program {
static HttpClient client;

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

client.BaseAddress = new Uri("https://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("email-validation/single.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-validation/single.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"email\": \"user@example.com\""
+"}";

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

const inputBody = {
"email": "user@example.com"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/email-validation/single.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/email-validation/single.json

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

Template методы

Вы можете сохранить шаблон на стороне 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",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}
<?php

require 'vendor/autoload.php';

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

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://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",
"reply_to_name" => "John Smith",
"track_links" => 0,
"track_read" => 0,
"headers" => [
"X-MyHeader" => "some data",
"List-Unsubscribe" => "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
],
"attachments" => [
[
"type" => "text/plain",
"name" => "readme.txt",
"content" => "SGVsbG8sIHdvcmxkIQ=="
]
],
"inline_attachments" => [
[
"type" => "image/gif",
"name" => "IMAGECID1",
"content" => "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
]
]
]
];

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

// ...
import requests

base_url = 'https://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",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
]
}
}
r = requests.post(base_url+'/template/set.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

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

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

begin
result = RestClient.post(
'https://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\","
+" \"reply_to_name\": \"John Smith\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ]"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("template/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("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\","
+" \"reply_to_name\": \"John Smith\","
+" \"track_links\": 0,"
+" \"track_read\": 0,"
+" \"headers\": {"
+" \"X-MyHeader\": \"some data\","
+" \"List-Unsubscribe\": \"<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>\""
+" },"
+" \"attachments\": ["
+" {"
+" \"type\": \"text/plain\","
+" \"name\": \"readme.txt\","
+" \"content\": \"SGVsbG8sIHdvcmxkIQ==\""
+" }"
+" ],"
+" \"inline_attachments\": ["
+" {"
+" \"type\": \"image/gif\","
+" \"name\": \"IMAGECID1\","
+" \"content\": \"R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw==\""
+" }"
+" ]"
+" }"
+"}";

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

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

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

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

Параметры

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

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

HTTP код 200:

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

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

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
template Обязательный
object
Объект, содержащий свойства шаблона.
» id Опциональный
string(uuid)
Уникальный идентификатор шаблона. Если указан, система попытается найти шаблон с указанным id и отредактировать его. Если не задан, будет создан новый шаблон.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» body Опциональный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Обязательный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки 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”, “kz”.
»» 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",
"reply_to_name": "John Smith",
"track_links": 0,
"track_read": 0,
"headers": {
"X-MyHeader": "some data",
"List-Unsubscribe": "<mailto: unsubscribe@example.com?subject=unsubscribe>, <http://www.example.com/unsubscribe/{{CustomerId}}>"
},
"attachments": [
{
"type": "text/plain",
"name": "readme.txt",
"content": "SGVsbG8sIHdvcmxkIQ=="
}
],
"inline_attachments": [
{
"type": "image/gif",
"name": "IMAGECID1",
"content": "R0lGODdhAwADAIABAP+rAP///ywAAAAAAwADAAACBIQRBwUAOw=="
}
],
"created": "string",
"user_id": 11344,
"project_id": "6123462132634",
"project_name": "Project 1A"
}
]
}

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
templates Обязательный
array
Массив объектов-шаблонов.
» id Обязательный
string(uuid)
Уникальный идентификатор шаблона.
» name Обязательный
string
Название шаблона.
» editor_type Опциональный
string
Тип редактора шаблона в веб-интерфейсе, “html” или “visual”. По умолчанию - “html”. Создание шаблонов с типом редактора “visual” возможно только через веб-интерфейс.
» template_engine Опциональный
string
Параметр для выбора шаблонизатора - либо “simple”, либо “velocity”, либо “none”. По умолчанию - “simple”. “none” доступен только для писем с ‘track_links’ и ‘track_read’ равно 0 и отключенным блоком отписки.
» global_substitutions Опциональный
object
Объект для передачи глобальных подстановок (например, название компании). Если названия переменных повторяются в объекте пользовательских подстановок “substitutions”, значения переменных будут взяты из объекта “substitutions” Подстановки работают в параметрах:
  • body.html
  • body.plaintext
  • body.amp
  • subject
  • from_name
  • options.unsubscribe_url
Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква, использование пробелов не допускается.
» global_metadata Опциональный
object
Объект для передачи метаданных, общих для всех получателей, в формате: “key”: “value”. Максимальное количество ключей: 10; максимальная длина ключа: 64 символа; максимальная длина значения ключа: 1024 символа. Метаданные передаются при вызове вебхуков. Для группировки писем в одну рассылку может использоваться системный ключ “campaign_id” со значением в виде неотрицательного десятичного целого или UUID до 128 бит.
» body Обязательный
object
Объект, который содержит в себе html, plaintext и amp части письма. Либо html, либо plaintext часть должна присутствовать обязательно.
»» html Опциональный
string
HTML-часть письма
»» plaintext Опциональный
string
Plaintext-часть письма.
»» amp Опциональный
string
Необязательная AMP-часть письма.
» subject Опциональный
string
Тема письма.
» from_email Обязательный
string
Email-адрес отправителя.
» from_name Опциональный
string
Имя отправителя.
» reply_to Опциональный
string
Необязательный email-адрес для ответов (на случай, если отличается от адреса отправителя)
» reply_to_name Опциональный
string
Необязательное имя для ответов (если указан email reply_to и вы хотите, чтобы отображался не только этот email, но и имя)
» track_links Опциональный
integer
1=отслеживание переходов по ссылкам включено (значение по умолчанию), 0=отключено.
» track_read Опциональный
integer
1=отслеживание прочтений письма включено (значение по умолчанию), 0=отключено.
» headers Опциональный
object
Объект, содержащий дополнительные заголовки письма, максимум 50 заголовков. Префикс “X-” в имени заголовка обязателен, заголовки без него будут проигнорированы, например X-UNISENDER-GO-Global-Language, X-UNISENDER-GO-Template-Engine. Стандартные заголовки “To”, “CC”, “BCC” передаются без префикса “X-”, но обрабатываются специальным образом, поэтому имеют ряд ограничений, подробнее об этом можно прочитать здесь. Также если техподдержка одобрила вам отключение ссылки отписки, то вы также можете передавать заголовки 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”, “kz”.
»» 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 событий в каждом (но вы можете настроить максимально разрешённое количество параллельных вызовов, увеличив их до 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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
<?php

require 'vendor/autoload.php';

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

$client = new \GuzzleHttp\Client([
'base_uri' => 'https://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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
]
];

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

// ...
import requests

base_url = 'https://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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
r = requests.post(base_url+'/webhook/set.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

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

params = {
"url" => "https://yourhost.example.com/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",
"subscribed",
"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\","
+" \"subscribed\","
+" \"soft_bounced\","
+" \"hard_bounced\","
+" \"spam\""
+" ]"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("webhook/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("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\","
+" \"subscribed\","
+" \"soft_bounced\","
+" \"hard_bounced\","
+" \"spam\""
+" ]"
+" }"
+"}";

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

const inputBody = {
"url": "https://yourhost.example.com/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",
"subscribed",
"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

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

callback-format

 

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

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”, “subscribed” или “spam”.
opened — сообщение доставлено и зарегистрировано его прочтение. Может измениться на “clicked”, “unsubscribed”, “subscribed” или “spam”.
clicked — сообщение доставлено, прочитано, был зарегистрирован переход по одной из ссылок в письме. Может измениться на “unsubscribed”, “subscribed” или “spam”.
unsubscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался по ссылке в письме. Может измениться на “subscribed”.
subscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался, а потом снова подписался по ссылке в письме. Может измениться на “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_resubscribed, ok_spam_folder, ok_fbl, not_sent, skip_dup_unreachable, skip_dup_temp_unreachable, skip_dup_mailbox_full, err_spam_removed, err_resend, err_unknown, err_retry_letter, err_src_invalid, err_dest_invalid, err_not_available, err_internal, err_no_dns, err_no_smtp, err_giveup.
»»»» destination_response Опциональный
string
Ответ SMTP-сервера.
»»»» user_agent Опциональный
string
Строка user agent получателя. Присутствует только если получилось её определить, для статусов “clicked” и “opened”.
»»»» ip Опциональный
string
IP-адрес получателя. Присутствует только если получилось его определить, для статусов “clicked” и “opened”.
»»» block_time Опциональный
string(utc-date-time)
Дата и время спам-блока в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”. Присутствует только если event_name=“transactional_spam_block”.
»»» block_type Опциональный
string
Тип спам-блока - заблокирован либо один отправляющий SMTP, либо сразу много. При блокировке одиночного SMTP из общего пула 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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
}

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

HTTP код 200:

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

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

HTTP код default:

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

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

webhook-list

POST https://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",
"subscribed",
"soft_bounced",
"hard_bounced",
"spam"
]
}
}
]
}

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

HTTP код 200:

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

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

HTTP код default:

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

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

webhook-delete

POST https://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.

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": [
{
"email": "user@example.com",
"cause": "unsubscribed",
"source": "user",
"is_deletable": true,
"created": "2021-12-19 10:15:49"
}
],
"cursor": "Ajfb6Hvdkn3hdhhvG57xbdufhG5"
}

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

HTTP код 200:

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

Название Тип Описание
status Обязательный
string
Строка “success”.
suppressions Обязательный
array
Массив объектов с информацией о недоступности.
» email Опциональный
string(email)
Email-адрес который находится в списке недоступных.
» cause Обязательный
string
Причина, по которой отправка на этот email блокируется. Одна из следующих:
  • unsubscribed - указанный адрес отписан;
  • temporary_unavailable - адрес временно недоступен. Это значит, что в течении следующих трех суток отправка на этот адрес будет возвращать ошибку. Email может быть временно недоступным по различным причинам, например:
    1. предыдущая отправка была отвергнута сервером получателя как спам;
    2. почтовый ящик получателя переполнен или не используется;
    3. домен не принимает почту из-за неверной настройки на стороне получателя или по другим причинам;
    4. сервер отправителя был отвергнут из-за блеклистинга;
  • permanent_unavailable - адрес перманентно недоступен из-за многократных недоставок;
  • complained - в одном из предыдущих писем адресат нажал “Это спам”.
  • blocked - отправка на этот адрес запрещена администрацией 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-провайдеров могут отличаться:

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

Параметры

Название Тип Описание
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.

Event-dump методы

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

event-dump-create

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

{
"start_time": "2022-07-20 00:00:00",
"end_time": "2022-07-21 00:00:00",
"limit": 50,
"all_projects": false,
"filter": {
"job_id": "1ZymBc-00041N-9X",
"status": "sent",
"delivery_status": "string",
"email": "david@example.org",
"email_from": "sender@example.com",
"domain": "example.org",
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"dump_fields": [
"string1"
],
"aggregate": "day_status",
"delimiter": ";",
"format": "csv"
}
<?php

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

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

request_body = {
"start_time": "2022-07-20 00:00:00",
"end_time": "2022-07-21 00:00:00",
"limit": 50,
"all_projects": false,
"filter": {
"job_id": "1ZymBc-00041N-9X",
"status": "sent",
"delivery_status": "string",
"email": "david@example.org",
"email_from": "sender@example.com",
"domain": "example.org",
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"dump_fields": [
"string1"
],
"aggregate": "day_status",
"delimiter": ";",
"format": "csv"
}
r = requests.post(base_url+'/event-dump/create.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'

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

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

begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/event-dump/create.json',
params.to_json,
headers
)

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

class Program {
static HttpClient client;

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

client.BaseAddress = new Uri("https://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 = "{"
+" \"start_time\": \"2022-07-20 00:00:00\","
+" \"end_time\": \"2022-07-21 00:00:00\","
+" \"limit\": 50,"
+" \"all_projects\": false,"
+" \"filter\": {"
+" \"job_id\": \"1ZymBc-00041N-9X\","
+" \"status\": \"sent\","
+" \"delivery_status\": \"string\","
+" \"email\": \"david@example.org\","
+" \"email_from\": \"sender@example.com\","
+" \"domain\": \"example.org\","
+" \"campaign_id\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\""
+" },"
+" \"dump_fields\": ["
+" \"string1\""
+" ],"
+" \"aggregate\": \"day_status\","
+" \"delimiter\": \";\","
+" \"format\": \"csv\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

var response = client.PostAsync("event-dump/create.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/event-dump/create.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"start_time\": \"2022-07-20 00:00:00\","
+" \"end_time\": \"2022-07-21 00:00:00\","
+" \"limit\": 50,"
+" \"all_projects\": false,"
+" \"filter\": {"
+" \"job_id\": \"1ZymBc-00041N-9X\","
+" \"status\": \"sent\","
+" \"delivery_status\": \"string\","
+" \"email\": \"david@example.org\","
+" \"email_from\": \"sender@example.com\","
+" \"domain\": \"example.org\","
+" \"campaign_id\": \"c77f4f4e-3561-49f7-9f07-c35be01b4f43\""
+" },"
+" \"dump_fields\": ["
+" \"string1\""
+" ],"
+" \"aggregate\": \"day_status\","
+" \"delimiter\": \";\","
+" \"format\": \"csv\""
+"}";

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

const inputBody = {
"start_time": "2022-07-20 00:00:00",
"end_time": "2022-07-21 00:00:00",
"limit": 50,
"all_projects": false,
"filter": {
"job_id": "1ZymBc-00041N-9X",
"status": "sent",
"delivery_status": "string",
"email": "david@example.org",
"email_from": "sender@example.com",
"domain": "example.org",
"campaign_id": "c77f4f4e-3561-49f7-9f07-c35be01b4f43"
},
"dump_fields": [
"string1"
],
"aggregate": "day_status",
"delimiter": ";",
"format": "csv"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/event-dump/create.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/event-dump/create.json

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

Параметры

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

sent — сообщение отправлено, но пока не доставлено.
delivered — сообщение доставлено.
opened — сообщение доставлено и зарегистрировано его прочтение.
clicked — сообщение доставлено, прочитано, был зарегистрирован переход по одной из ссылок в письме.
unsubscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался по ссылке в письме.
subscribed — сообщение было доставлено получателю и прочитано им, но пользователь отписался, а потом снова подписался по ссылке в письме.
soft_bounced — временная недоставка сообщения. Unisender Go продолжает попытки доставки в течение 2 суток.
hard_bounced - доставка не удалась, попыток доставки больше не будет.
spam — сообщение доставлено, но отмечено как “спам” получателем.
» 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_resubscribed, ok_spam_folder, ok_fbl, not_sent, skip_dup_unreachable, skip_dup_temp_unreachable, skip_dup_mailbox_full, err_spam_removed, err_resend, err_unknown, err_retry_letter, err_src_invalid, err_dest_invalid, err_not_available, err_internal, err_no_dns, err_no_smtp, err_giveup.
» email Опциональный
string(email)
Адрес получателя
» email_from Опциональный
string(email)
Адрес отправителя
» domain Опциональный
string
Домен получателя
» campaign_id Опциональный
string
Идентификатор рассылки, неотрицательное десятичное целое или UUID до 128 бит, переданное в метаданных в поле с именем “campaign_id” (имя можно настроить через техподдержку).
dump_fields Опциональный
array
Массив из строк с перечислением названий столбцов которые необходимо получить в выгрузке (в порядке перечисления). Если ‘dump_fields’ отсутствует или пуст - то применяется набор и порядок полей по умолчанию. Допустимые значения (в порядке по умолчанию):‘project_id’, ‘event_time’, ‘job_id’, ‘from_email’, ‘email’, ‘status’, ‘delivery_status’, ‘metadata’, ‘destination_response’, ‘user_agent’, ‘url’, ‘ip’, ‘tags’. В целях большей конфиденциальности поле ‘subject’ не входит в набор полей по умолчанию, но вы можете добавить его, указав в параметре ‘dump_fields’.
aggregate Опциональный
string
Позволяет получить агрегированную статистику за указанный период. Может принимать одно из двух значений:
  • day_status - получить агрегированную статистику, при таком значении параметр filter должен отсутствовать или быть пустым объектом (фильтры недопустимы);
  • пустая строка - значение по умолчанию, эквивалентно отсутствию параметра aggregate и метод event_dump/create в этом случае работает как раньше.
delimiter Опциональный
string
Разделитель полей, по умолчанию ‘,’. Допустимые значения ‘,’ и ‘;’.
format Опциональный
string
Формат получаемого файла “csv” (по умолчанию) или “csv_gzip”.

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

event-dump-get

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

{
"dump_id": "Gqfasjh34tlasd"
}
<?php

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

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

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

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

params = {
"dump_id" => "Gqfasjh34tlasd"
}

begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/event-dump/get.json',
params.to_json,
headers
)

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

class Program {
static HttpClient client;

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

client.BaseAddress = new Uri("https://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 = "{"
+" \"dump_id\": \"Gqfasjh34tlasd\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

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

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

const inputBody = {
"dump_id": "Gqfasjh34tlasd"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/event-dump/get.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/event-dump/get.json

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

Параметры

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

event-dump-list

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

{}
<?php

require 'vendor/autoload.php';

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

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

$requestBody = [];

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

// ...
import requests

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

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

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

params = {}

begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/event-dump/list.json',
params.to_json,
headers
)

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

class Program {
static HttpClient client;

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

client.BaseAddress = new Uri("https://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 = "{}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

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

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

const inputBody = {};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/event-dump/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});

POST /ru/transactional/api/v1/event-dump/list.json

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

200 Ответ

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

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

HTTP код 200:

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

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

HTTP код default:

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

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

event-dump-delete

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

{
"dump_id": "Gqfasjh34tlasd"
}
<?php

require 'vendor/autoload.php';

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

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

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

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

// ...
import requests

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

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

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

params = {
"dump_id" => "Gqfasjh34tlasd"
}

begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/event-dump/delete.json',
params.to_json,
headers
)

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

class Program {
static HttpClient client;

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

client.BaseAddress = new Uri("https://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 = "{"
+" \"dump_id\": \"Gqfasjh34tlasd\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");

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

try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()