Web API v1.67
Прокрутите вниз для просмотра примеров кода, а также примеров запросов и ответов. Выберите закладку с нужным языком примера кода, либо сделайте выбор языка с помощью мобильного меню.
Все методы Unisender Go API принимают только HTTPS POST-запросы в формате JSON размером максимум 10 мегабайт и возвращают ответ тоже в JSON. Все запросы отправляются на адрес, зависящий от дата-центра регистрации пользователя.
-
https://go1.unisender.ru/ru/transactional/api/v1 - Первый сервер Unisender Go
-
https://go2.unisender.ru/ru/transactional/api/v1 - Второй сервер Unisender Go
Aутентификация
Для вызова любого метода необходима аутентификация с помощью API-ключа пользователя или проекта, любым из этих двух способов:
- Либо в HTTP-заголовке X-API-KEY
- Либо в JSON-поле api_key в теле запроса
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
Метод для отправки писем вашим подписчикам.
При отправке вы можете использовать подстановки переменных, шаблоны, включить отслеживание прочтений или переходов по ссылкам и многое другое.
Ограничения:
- максимальный размер запроса - 10 MB
- максимальное количество получателей (recipients) – 500 email
- В названии вложений запрещен символ ‘/’
Если при отправке письма в списке получателей будут некорректно введенные, несуществующие, повторяющиеся, или отписанные адреса, они будут возвращены в ответе с помощью параметра failed_emails, письмо же будет отправлено на все остальные приемлемые адреса. Если все адреса попадут в failed_emails, отправка осуществлена не будет, будет возвращена ошибка c API-кодом 204.
Параметры
Название | Тип | Описание |
---|---|---|
message | Обязательный object |
Объект, содержащий все свойства отправляемого сообщения. |
» recipients | Обязательный array |
Массив объектов с email-адресами, подстановками и метаданными получателей. |
Обязательный string(email) |
Email-адрес получателя | |
»» substitutions | Опциональный object |
Объект, описывающий подстановки для конкретного получателя (например, имя, товар для показа именно данному получателю - см. Шаблонизаторы). Подстановки работают в параметрах:
|
»» 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” Подстановки работают в параметрах:
|
» 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”}. Возможные статусы адресов, на которые не удалось осуществить отправку:
|
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 секунд, результат проверки может быть неизвестен.
Параметры
Название | Тип | Описание |
---|---|---|
Обязательный 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”. |
Обязательный string(email) |
Проверяемый email. | |
result | Обязательный string |
Возможные статусы:
|
cause | Обязательный string |
Возможные статусы:
|
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
Создать или обновить шаблон.
Ограничения:
- Максимальный размер запроса - 10 MB.
- Количество шаблонов ограничено 10000.
Параметры
Название | Тип | Описание |
---|---|---|
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” Подстановки работают в параметрах:
|
» 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” Подстановки работают в параметрах:
|
» 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” Подстановки работают в параметрах:
|
» 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” Подстановки работают в параметрах:
|
» 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:
- transactional_email_status - событие изменения статуса доставки email. Можно подписаться только на оповещение об отдельных статусах.
- 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”. |
Опциональный 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.
Параметры
Название | Тип | Описание |
---|---|---|
Обязательный string(email) |
Email-адрес, который надо добавить в список недоступных. | |
cause | Обязательный string |
Причина, по которой отправка на этот email блокируется. Одна из следующих:
|
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-адреса.
Параметры
Название | Тип | Описание |
---|---|---|
Обязательный 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”. |
Обязательный string(email) |
Email-адрес, для которого были запрошены данные о недоступности. | |
suppressions | Обязательный array |
Массив объектов с информацией о недоступности. |
» project_id | Опциональный string |
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной. |
» cause | Обязательный string |
Причина, по которой отправка на этот email блокируется. Одна из следующих:
|
» source | Обязательный string |
Источник попадания в список недоступных. Один из следующих:
|
» 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 блокируется. Одна из следующих:
|
source | Опциональный string |
Источник попадания в список недоступных. Один из следующих:
|
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 |
Массив объектов с информацией о недоступности. |
Опциональный string(email) |
Email-адрес который находится в списке недоступных. | |
» cause | Обязательный string |
Причина, по которой отправка на этот email блокируется. Одна из следующих:
|
» source | Обязательный string |
Источник попадания в список недоступных. Один из следующих:
|
» 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.
Параметры
Название | Тип | Описание |
---|---|---|
Обязательный 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 вы должны сделать следующее:
- Подтвердите домен, с которого будут отправляться письма, внеся необходимые DNS записи, получив их с помощью метода domain/get-dns-records.
- После добавления раз в 5-10 минут вызывайте domain/list с указанием добавленного домена (или нескольких доменов сразу, если проверить надо несколько) и проверяйте verification-record.status и dkim.status в ответе domain/list. Можно делать запрос и чаще - но точно не чаще раза в минуту.
- Если verification-record.status=“unconfirmed”, то инициируйте проверку правильности записи владения доменом с помощью вызова domain/validate-verification-record.
- Если dkim.status=“inactive”, то инициируйте проверку правильности DKIM-записи с помощью вызова domain/validate-dkim (впрочем, DKIM-записи Unisender Go и сам проверяет раз в полчаса)
- И только когда domain/list возвратил verification-record.status=“confirmed” и dkim.status=“active” для домена, можно использовать домен для отправки и прекратить его ожидание и вызовы для него вышеуказанных методов.
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"
- Первая запись представлена содержимым поля “verification-record”.
- Вторая запись должна включать содержимое поля “dkim” сразу после “p=”. Обратите внимание на имя записи! Префикс “us._domainkey.” очень важен для того, чтобы DKIM селектор Unisender Go отрабатывал правильно.
- Третья запись опциональна, но мы её очень рекомендуем добавлять, это SPF-запись, которая повышает доставляемость. Возможно, она уже у вас есть - в этом случае просто добавьте include:spf.unisender.ru/go после v=spf1.
Требования к синтаксису записей у различных DNS-провайдеров могут отличаться:
- иногда требуется указывать полное имя домена с завершающей точкой, наподобие “example.com.” вместо символа @.
- некоторые провайдеры требуют указание времени жизни (TTL, например 3600)
- для некоторых провайдеров будет излишним помещения значений в двойные кавычки Пожалуйста, проверьте требования своего провайдера и подскажите это своим пользователям.
Для реализации 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. |
domain-delete
POST https://go1.unisender.ru/ru/transactional/api/v1/domain/delete.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/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 = {
"domain": "example.com"
}
r = requests.post(base_url+'/domain/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 = {
"domain" => "example.com"
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/domain/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 = "{"
+" \"domain\": \"example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("domain/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/domain/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 = "{"
+" \"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/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/domain/delete.json
Удаляет домен. Внимание: для удаления домена, принадлежащего проекту, вам надо использовать API-ключ проекта.
Удаляет домен.
Параметры
Название | Тип | Описание |
---|---|---|
domain | Опциональный string |
Имя домена, который надо удалить. |
200 Ответ
{
"status": "success",
"message": "Domain deleted"
}
Структура ответа
HTTP код 200:
Домен успешно удалён.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
message | Обязательный string |
Домен удален |
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. |
Опциональный 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 |
Позволяет получить агрегированную статистику за указанный период. Может принимать одно из двух значений:
|
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 |
Статус задачи. Одно из четырех значений:
|
» 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 |
Статус задачи. Одно из четырех значений:
|
» 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()) != 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/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/event-dump/delete.json
Удаляет дамп из очереди и/или из хранилища.
Параметры
Название | Тип | Описание |
---|---|---|
dump_id | Обязательный string |
Идентификатор дампа, полученный методом event-dump/create. |
200 Ответ
{
"status": "success"
}
Структура ответа
HTTP код 200:
Дамп успешно удалён.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
Tag методы
Методы управления пользовательскими метками. С помощью меток вы можете классифицировать письма по необходимым критериям. Отделить маркетинговые письма от транзакционных, или письма с подтверждением регистрации от уведомлений о заказе. Unisender Go позволяет помечать метками каждое исходящее сообщение, а после сегментировать и анализировать статистику на основании указанных при отправке меток.
tag-list
POST https://go1.unisender.ru/ru/transactional/api/v1/tag/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','tag/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://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+'/tag/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/tag/list.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://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("tag/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/tag/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/tag/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/tag/list.json
Метод без параметров, возвращает список всех пользовательских меток.
200 Ответ
{
"status": "success",
"tags": [
{
"tag_id": 54,
"tag": "example-tag1"
}
]
}
Структура ответа
HTTP код 200:
Информация со списком меток успешно возвращена.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
tags | Обязательный array |
Массив объектов, с данными пользовательских меток. |
» tag_id | Обязательный integer |
Уникальный id метки. |
» tag | Обязательный string |
Название метки. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
tag-delete
POST https://go1.unisender.ru/ru/transactional/api/v1/tag/delete.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"tag_id": 54
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"tag_id" => 54
];
try {
$response = $client->request('POST','tag/delete.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"tag_id": 54
}
r = requests.post(base_url+'/tag/delete.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"tag_id" => 54
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/tag/delete.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://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 = "{"
+" \"tag_id\": 54"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("tag/delete.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/tag/delete.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"tag_id\": 54"
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"tag_id": 54
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/tag/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/tag/delete.json
Удаляет метку.
Параметры
Название | Тип | Описание |
---|---|---|
tag_id | Обязательный integer |
Уникальный id метки. |
200 Ответ
{
"status": "success"
}
Структура ответа
HTTP код 200:
Метка успешно удалена.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
Project методы
Проекты позволяют объединить несколько независимых доменов с веб-хуками, шаблонами и списками отписки. Это очень полезно, если у вас есть свои клиенты и вы управляете их данными из одной учетной записи Unisender Go. Каждый проект получает свой собственный ключ API, а вызовы API методов с этим ключом обрабатывают только данные этого проекта. Таким образом, вы можете назначить отдельный проект для каждого пользователя и быть уверенным, что они не будут конфликтовать: например, отмена подписки на один проект не повлияет на другой.
Методы проектов по умолчанию отключены из-за мер по защите от спама. Чтобы их включить, вам необходимо обратиться в службу поддержки.
Обратите внимание: по умолчанию домены для отправки подтверждаются и используются независимо для основного аккаунта и каждого из проектов. Но есть возможность включить для проектов использование доменов, подтвержденных в основном аккаунте. Просто попросите об этом техподдержку.
project-create
POST https://go1.unisender.ru/ru/transactional/api/v1/project/create.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234
}
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"project" => [
"name" => "Project 1A",
"country" => "ES",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true,
"backend_domain_id" => 1234
]
];
try {
$response = $client->request('POST','project/create.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234
}
}
r = requests.post(base_url+'/project/create.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"project" => {
"name" => "Project 1A",
"country" => "ES",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true,
"backend_domain_id" => 1234
}
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/project/create.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_domain_id\": 1234"
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("project/create.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/project/create.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_domain_id\": 1234"
+" }"
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234
}
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/project/create.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/project/create.json
Создать новый проект.
Параметры
Название | Тип | Описание |
---|---|---|
project | Обязательный object |
Объект со свойствами проекта. |
» name | Обязательный string |
Название проекта, уникальное в рамках аккаунта пользователя. |
» country | Опциональный string |
Двухбуквенный код страны по правилам ISO-3166 alpha-2. Если задан, то Unisender Go обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран. |
» send_enabled | Опциональный boolean |
Разрешена ли отправка писем для проекта. |
» custom_unsubscribe_url_enabled | Опциональный boolean |
Если false, то Unisender Go добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена). |
» backend_domain_id | Опциональный integer |
Уникальный идентификатор backend-домена который определяет домен ссылок или пул выделенных IP-адресов по умолчанию. Если отсутствует - аккаунту/проекту будет назначен дефолтный backend-домен по умолчанию. |
200 Ответ
{
"status": "success",
"project_id": "6123462132634",
"project_api_key": "string"
}
Структура ответа
HTTP код 200:
Проект успешно создан.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
project_id | Обязательный string |
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной. |
project_api_key | Обязательный string |
API-ключ проекта. Вы можете использовать этот ключ вместо пользовательского api_key во всех методах, кроме project-методов. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
project-update
POST https://go1.unisender.ru/ru/transactional/api/v1/project/update.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234,
"email_counter": 0,
"email_counter_limit": 0,
"email_counter_mode": "default"
}
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"project_id" => "string",
"project_api_key" => "string",
"project" => [
"name" => "Project 1A",
"country" => "ES",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true,
"backend_domain_id" => 1234,
"email_counter" => 0,
"email_counter_limit" => 0,
"email_counter_mode" => "default"
]
];
try {
$response = $client->request('POST','project/update.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234,
"email_counter": 0,
"email_counter_limit": 0,
"email_counter_mode": "default"
}
}
r = requests.post(base_url+'/project/update.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"project_id" => "string",
"project_api_key" => "string",
"project" => {
"name" => "Project 1A",
"country" => "ES",
"send_enabled" => true,
"custom_unsubscribe_url_enabled" => true,
"backend_domain_id" => 1234,
"email_counter" => 0,
"email_counter_limit" => 0,
"email_counter_mode" => "default"
}
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/project/update.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\","
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_domain_id\": 1234,"
+" \"email_counter\": 0,"
+" \"email_counter_limit\": 0,"
+" \"email_counter_mode\": \"default\""
+" }"
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("project/update.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/project/update.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\","
+" \"project\": {"
+" \"name\": \"Project 1A\","
+" \"country\": \"ES\","
+" \"send_enabled\": true,"
+" \"custom_unsubscribe_url_enabled\": true,"
+" \"backend_domain_id\": 1234,"
+" \"email_counter\": 0,"
+" \"email_counter_limit\": 0,"
+" \"email_counter_mode\": \"default\""
+" }"
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"project_id": "string",
"project_api_key": "string",
"project": {
"name": "Project 1A",
"country": "ES",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234,
"email_counter": 0,
"email_counter_limit": 0,
"email_counter_mode": "default"
}
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/project/update.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/project/update.json
Изменить свойства проекта.
Параметры
Название | Тип | Описание |
---|---|---|
project_id | Опциональный string |
Идентификатор обновляемого проекта. Проект должен быть идентифицирован либо этим полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно. |
project_api_key | Опциональный string |
Необязательный API-ключ обновляемого проекта. Проект должен быть идентифицирован либо полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно. |
project | Обязательный object |
Объект со свойствами проекта. |
» name | Обязательный string |
Название проекта, уникальное в рамках аккаунта пользователя. |
» country | Опциональный string |
Двухбуквенный код страны по правилам ISO-3166 alpha-2. Если задан, то Unisender Go обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран. |
» send_enabled | Опциональный boolean |
Разрешена ли отправка писем для проекта. |
» custom_unsubscribe_url_enabled | Опциональный boolean |
Если false, то Unisender Go добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена). |
» backend_domain_id | Опциональный integer |
Уникальный идентификатор backend-домена который определяет домен ссылок или пул выделенных IP-адресов по умолчанию. Если отсутствует - аккаунту/проекту будет назначен дефолтный backend-домен по умолчанию. |
» email_counter | Опциональный integer |
Значение счётчика писем для проекта, увеличивается при отправке каждого письма. Принимает только значение 0 (т.е. сброс счётчика в ноль) или обновляется автоматически, в зависимости от режима работы счётчика заданного параметром ‘email_counter_mode’. Если поле не передано в запросе или передан null, то значение счётчика не изменяется. |
» email_counter_limit | Опциональный integer |
Позволяет ограничить количество отправленных писем проектом. При достижении этого лимита - отправка прекращается. Принимается любое положительное 64-битное целое число. Значение 0 (по умолчанию) означает отсутствие лимита. Если поле не передано в запросе или передан null, то значение лимита не изменяется. |
» email_counter_mode | Опциональный any |
Устанавливает режим работы счётчика писем. Позволяет выбрать, как должен вести себя счётчик, автоматически сбрасываться или оставаться постоянным. Допустимые значения: default - счётчик автоматически сбрасывается в ноль в начале каждого учётного периода, permanent - счётчик никогда не сбрасывается автоматически. Сброс может быть выполнен только вручную пользователем, передав значение 0 в поле ‘email_counter’. Если поле не передано в запросе или передано значение null, значение режима не изменяется. |
200 Ответ
{
"status": "success",
"project_api_key": "string"
}
Структура ответа
HTTP код 200:
Проект успешно обновлён.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
project_api_key | Опциональный string |
API-ключ проекта. Возвращается только в случае, если в параметре запроса был project_api_key. Если же проект был идентифицирован через project_id, то не возвращается. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
project-list
POST https://go1.unisender.ru/ru/transactional/api/v1/project/list.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"project_id": "string",
"project_api_key": "string"
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"project_id" => "string",
"project_api_key" => "string"
];
try {
$response = $client->request('POST','project/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"project_id": "string",
"project_api_key": "string"
}
r = requests.post(base_url+'/project/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"project_id" => "string",
"project_api_key" => "string"
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/project/list.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("project/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/project/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"project_id": "string",
"project_api_key": "string"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/project/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/project/list.json
Возвращает список проектов.
Параметры
Название | Тип | Описание |
---|---|---|
project_id | Опциональный string |
Опциональная возможность указать project_id для включения в список только указанного проекта. |
project_api_key | Опциональный string |
Опциональная возможность указать project_api_key для включения в список только указанного проекта. |
200 Ответ
{
"status": "success",
"projects": [
{
"id": "6123462132634",
"api_key": "string",
"name": "Project 1A",
"country": "ES",
"reg_time": "2020-12-28 17:15:45",
"send_enabled": true,
"custom_unsubscribe_url_enabled": true,
"backend_domain_id": 1234,
"email_counter": 0,
"email_counter_limit": 0,
"email_counter_mode": "default"
}
]
}
Структура ответа
HTTP код 200:
Список проектов успешно возвращён.
Название | Тип | Описание |
---|---|---|
status | Опциональный string |
Строка “success”. |
projects | Опциональный array |
Массив объектов, где каждый объект соответствует отдельному проекту. |
» id | Обязательный string |
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной. |
» api_key | Обязательный string |
API-ключ проекта. Вы можете использовать этот ключ вместо пользовательского api_key во всех методах, кроме project-методов. |
» name | Обязательный string |
Название проекта, уникальное в рамках аккаунта пользователя. |
» country | Обязательный string |
Двухбуквенный код страны по правилам ISO-3166 alpha-2. Если задан, то Unisender Go обрабатывает персональные данные проекта в соответствии с законами заданной страны - например, в соответствии с GDPR для европейских стран. |
» reg_time | Обязательный string(utc-date-time) |
Дата и время создания проекта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”. |
» send_enabled | Обязательный boolean |
Разрешена ли отправка писем для проекта. |
» custom_unsubscribe_url_enabled | Обязательный boolean |
Если false, то Unisender Go добавляет в конец каждого письма системную ссылку отписки. Значение true отключает автоматическое добавление системой ссылки отписки в конец письма и позволяет использовать свою ссылку отписки или отправлять письма вовсе без ссылки отписки. Подробнее см. здесь. Если вы не указываете значение custom_unsubscribe_url_enabled при создании проекта - то это значение копируется из главного аккаунта (если в главном аккаунте было установлено принудительное отключение ссылки отписки - то и у проекта ссылка отписки будет отключена). |
» backend_domain_id | Обязательный integer |
Уникальный идентификатор backend-домена который определяет домен ссылок или пул выделенных IP-адресов по умолчанию. Если отсутствует - аккаунту/проекту будет назначен дефолтный backend-домен по умолчанию. |
» email_counter | Обязательный integer |
Значение счётчика писем для проекта, увеличивается при отправке каждого письма. |
» email_counter_limit | Обязательный integer |
Позволяет ограничить количество отправленных писем проектом. При достижении этого лимита - отправка прекращается. Значение 0 (по умолчанию) означает отсутствие лимита. |
» email_counter_mode | Обязательный any |
‘default’ - счётчик автоматически сбрасывается в ноль в начале каждого учётного периода, ‘permanent’ - счётчик никогда не сбрасывается автоматически. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
project-delete
POST https://go1.unisender.ru/ru/transactional/api/v1/project/delete.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"project_id": "string",
"project_api_key": "string"
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"project_id" => "string",
"project_api_key" => "string"
];
try {
$response = $client->request('POST','project/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 = {
"project_id": "string",
"project_api_key": "string"
}
r = requests.post(base_url+'/project/delete.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"project_id" => "string",
"project_api_key" => "string"
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/project/delete.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("project/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/project/delete.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"project_id\": \"string\","
+" \"project_api_key\": \"string\""
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"project_id": "string",
"project_api_key": "string"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/project/delete.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/project/delete.json
Удалить проект.
Некоторое время проект не удаляется окончательно и ещё возможно его восстановить - для этого необходимо обратиться в техподдержку.
Параметры
Название | Тип | Описание |
---|---|---|
project_id | Опциональный string |
Идентификатор удаляемого проекта. Проект должен быть идентифицирован либо этим полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно. |
project_api_key | Опциональный string |
Необязательный API-ключ удаляемого проекта. Проект должен быть идентифицирован либо полем project_id, либо полем project_api_key. Мы рекомендуем использовать project_id, это более безопасно. |
200 Ответ
{
"status": "success"
}
Структура ответа
HTTP код 200:
Проект успешно удалён.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
System методы
Системные методы.
system-info
POST https://go1.unisender.ru/ru/transactional/api/v1/system/info.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','system/info.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://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+'/system/info.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/system/info.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://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("system/info.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/system/info.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/system/info.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/system/info.json
Возвращает информацию о пользователе или проекте по API ключу.
200 Ответ
{
"status": "success",
"user_id": 11344,
"email": "user@example.com",
"project_id": "6123462132634",
"project_name": "Project 1A",
"project_accounting": {
"email_counter": 0,
"email_counter_limit": 0,
"email_counter_mode": "default"
},
"accounting": {
"period_start": "2016-08-29 09:12:33",
"period_end": "2016-09-29 09:12:33",
"emails_included": 0,
"emails_sent": 0
}
}
Структура ответа
HTTP код 200:
Успешно возвращена информация о пользователе или проекте.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
user_id | Обязательный integer |
Уникальный идентификатор пользователя. |
Обязательный string(email) |
Email пользователя. | |
project_id | Опциональный string |
Уникальный идентификатор проекта, ASCII-строка до 36 символов длиной. Присутствует только если API-ключ, использованный для запроса, был API-ключом проекта. |
project_name | Опциональный string |
Название проекта, уникальное в рамках аккаунта пользователя. Присутствует только если API-ключ, использованный для запроса, был API-ключом проекта. |
project_accounting | Опциональный object |
Объект со свойствами счётчика писем. Присутствует только если API-ключ, использованный для запроса, был API-ключом проекта. |
» email_counter | Обязательный integer |
Значение счётчика писем для проекта, увеличивается при отправке каждого письма. |
» email_counter_limit | Обязательный integer |
Позволяет ограничить количество отправленных писем проектом. При достижении этого лимита - отправка прекращается. Значение 0 (по умолчанию) означает отсутствие лимита. |
» email_counter_mode | Обязательный any |
‘default’ - счётчик автоматически сбрасывается в ноль в начале каждого учётного периода, ‘permanent’ - счётчик никогда не сбрасывается автоматически. |
accounting | Опциональный object |
Объект со свойствами периода учёта. Присутствует только если API-ключ, использованный для запроса, был API-ключом пользователя. |
» period_start | Обязательный string(utc-date-time) |
Дата и время начала периода учёта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”. |
» period_end | Обязательный string(utc-date-time) |
Дата и время конца периода учёта в часовом поясе UTC в формате “ГГГГ-ММ-ДД чч:мм:сс”. |
» emails_included | Обязательный integer(int64) |
Количество писем, включённых в учётный период. |
» emails_sent | Обязательный integer(int64) |
Количество писем, отправленных за учётный период. Может быть больше emails_included в случае превышения. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
Устаревшие методы
Устаревшие методы работы с отписками. Мы рекомендуем пользоваться вместо них более гибкими методами suppression. Обратите внимание, что снова подписать отписанного адресата через WebAPI нельзя. Можно только выслать ему email со ссылкой повторной подписки с помощью метода email/subscribe.
unsubscribed-set
POST https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/set.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"address": "user@example.com"
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"address" => "user@example.com"
];
try {
$response = $client->request('POST','unsubscribed/set.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"address": "user@example.com"
}
r = requests.post(base_url+'/unsubscribed/set.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"address" => "user@example.com"
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/set.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("unsubscribed/set.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/set.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"address": "user@example.com"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/set.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/unsubscribed/set.json
Внести email в список отписавшихся.
После внесения email в список отписавшихся все будущие попытки отправить на него сообщение будут отклоняться. Учтите, что удалить email из отписавшихся напрямую с помощью API нельзя. Но можно отправить ему сообщение со ссылкой повторной подписки с помощью метода email/subscribe либо удалить его из отписавшихся вручную на странице Поиск email в панели управления (но количество таких удалений в день сильно ограничено).
Параметры
Название | Тип | Описание |
---|---|---|
address | Обязательный string(email) |
Email, который должен быть отписан. |
200 Ответ
{
"status": "success",
"address": "user@example.com",
"message": "unsubscribed"
}
Структура ответа
HTTP код 200:
Email успешно отписан.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
address | Обязательный string(email) |
Отписанный email. |
message | Обязательный string |
Подробности отписки:
|
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
unsubscribed-check
POST https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/check.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"address": "user@example.com"
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"address" => "user@example.com"
];
try {
$response = $client->request('POST','unsubscribed/check.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"address": "user@example.com"
}
r = requests.post(base_url+'/unsubscribed/check.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"address" => "user@example.com"
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/check.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("unsubscribed/check.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/check.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"address\": \"user@example.com\""
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"address": "user@example.com"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/check.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/unsubscribed/check.json
Проверяет, отписан ли email.
Параметры
Название | Тип | Описание |
---|---|---|
address | Обязательный string(email) |
Email, который необходимо проверить. |
200 Ответ
{
"status": "success",
"address": "user@example.com",
"is_unsubscribed": true
}
Структура ответа
HTTP код 200:
Статус отписки email успешно возвращён.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
address | Обязательный string(email) |
Email, который был проверен. |
is_unsubscribed | Обязательный boolean |
true если отписан, false если нет. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
unsubscribed-list
POST https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/list.json HTTP/1.1
Host: go1.unisender.ru
Content-Type: application/json
Accept: application/json
{
"date_from": "2020-10-14"
}
<?php
require 'vendor/autoload.php';
$headers = array(
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY',
);
$client = new \GuzzleHttp\Client([
'base_uri' => 'https://go1.unisender.ru/ru/transactional/api/v1/'
]);
$requestBody = [
"date_from" => "2020-10-14"
];
try {
$response = $client->request('POST','unsubscribed/list.json', array(
'headers' => $headers,
'json' => $requestBody,
)
);
print_r($response->getBody()->getContents());
}
catch (\GuzzleHttp\Exception\BadResponseException $e) {
// handle exception or api errors.
print_r($e->getMessage());
}
// ...
import requests
base_url = 'https://go1.unisender.ru/ru/transactional/api/v1'
headers = {
'Content-Type': 'application/json',
'Accept': 'application/json',
'X-API-KEY': 'API_KEY'
}
request_body = {
"date_from": "2020-10-14"
}
r = requests.post(base_url+'/unsubscribed/list.json', json=request_body, headers=headers)
r.raise_for_status() # throw an exception in case of error
print(r.json())
require 'rest-client'
require 'json'
headers = {
'Content-Type' => 'application/json',
'Accept' => 'application/json',
'X-API-KEY' => 'API_KEY'
}
params = {
"date_from" => "2020-10-14"
}
begin
result = RestClient.post(
'https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/list.json',
params.to_json,
headers
)
p JSON.parse(result)
rescue RestClient::ExceptionWithResponse => e
puts e.response.code
puts e.response.body
end
using System;
using System.IO;
using System.Text;
using System.Net.Http;
using System.Net.Http.Headers;
class Program {
static HttpClient client;
public static void Main(string[] args) {
client = new HttpClient();
client.BaseAddress = new Uri("https://go1.unisender.ru/ru/transactional/api/v1/");
client.DefaultRequestHeaders.Add("X-API-KEY", "API_KEY");
client.DefaultRequestHeaders.Accept.Add(
new MediaTypeWithQualityHeaderValue("application/json"));
string requestBody = "{"
+" \"date_from\": \"2020-10-14\""
+"}";
var content = new StringContent(requestBody, Encoding.UTF8, "application/json");
var response = client.PostAsync("unsubscribed/list.json", content).Result;
var responseBody = response.Content.ReadAsStringAsync().Result;
if(response.IsSuccessStatusCode) {
Console.WriteLine(responseBody);
}
else {
Console.WriteLine(String.Format("Request failed (HTTP {0}): {1}",
(int)response.StatusCode, responseBody));
}
}
}
URL obj = new URL("https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/list.json");
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
con.setRequestProperty("X-API-KEY", "API_KEY");
con.setDoOutput(true);
String requestBody = "{"
+" \"date_from\": \"2020-10-14\""
+"}";
try (OutputStream out = con.getOutputStream()) {
out.write(requestBody.getBytes());
out.flush();
}
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
System.out.println(responseCode);
System.out.println(response.toString());
const fetch = require('node-fetch');
const headers = {
'Content-Type':'application/json',
'Accept':'application/json',
'X-API-KEY':'API_KEY'
};
const inputBody = {
"date_from": "2020-10-14"
};
fetch('https://go1.unisender.ru/ru/transactional/api/v1/unsubscribed/list.json',
{
method: 'POST',
body: JSON.stringify(inputBody),
headers: headers
})
.then(function(res) {
return res.json();
}).then(function(body) {
console.log(body);
});
POST /ru/transactional/api/v1/unsubscribed/list.json
Возвращает список адресов, отписавшихся начиная с указанной даты.
Параметры
Название | Тип | Описание |
---|---|---|
date_from | Опциональный string(utc-date) |
Дата в формате ГГГГ-ММ-ДД, чтобы получить все отписанные адреса с “date_from” по сегодняшний день. Если параметр не указать, период по умолчанию будет с 00:00 сегодняшнего дня по UTC. |
200 Ответ
{
"status": "success",
"unsubscribed": [
{
"address": "user@example.com",
"unsubscribed_on": "2020-10-15 22:14:59"
}
]
}
Структура ответа
HTTP код 200:
Список отписавшихся возвращён успешно.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “success”. |
unsubscribed | Обязательный array |
Массив объектов с данными отписавшихся. |
» address | Опциональный string(email) |
Отписавшийся email. |
» unsubscribed_on | Опциональный string(utc-date-time) |
Дата и время отписки адреса в формате ГГГГ-ММ-ДД чч:мм:сс в часовом поясе UTC. |
HTTP код default:
Произошла ошибка.
Название | Тип | Описание |
---|---|---|
status | Обязательный string |
Строка “error”. |
message | Обязательный string |
Сообщение об ошибке на английском. |
code | Обязательный integer |
Код ошибки API. |
Ошибки API
HTTP/1.1 500 Internal Server Error
Content-Length: 90
Content-Type: application/json
Connection: Closed
{
"status": "error",
"code": 150,
"message": "Аn unknown internal error occurred"
}
Если вызов метода неуспешен и возвращает HTTP-код, отличный от 200, обычно в тело ответа помещается JSON-объект с подробностями:
Поле | Тип | Описание |
---|---|---|
status | string | Всегда содержит строку “error”. |
code | integer | API-код ошибки (не путайте с HTTP-кодом) |
message | string | Сообщение об ошибке на английском. |
Ниже перечислены почти все возможные коды ошибок API.
HTTP код | API код | Значение / Как исправить |
---|---|---|
401 | 101 | Не введен или не передан ключ API. Укажите ключ API в параметре api_key запроса. |
401 | 102 | Ключ API неправильный. Скопируйте ключ API со страницы настроек или используйте ключ одного из проектов. |
403 | 105 | Доступ к API выключен. Для того, чтобы включить API, перейдите в настройки аккаунта. |
403 | 106 | Пользователь неактивен. Для уточнения причин обратитесь в службу поддержки. |
400 | 111 | Ошибка формата JSON. Исправьте ошибку в JSON синтаксисе запроса. |
401 | 114 | Пользователь, отправивший запрос, не найден в базе. Возможно, этот пользователь удален. |
400 | 118 | Не найдены DNS TXT записи. Добавьте TXT записи со значениями, возвращаемыми методом domain/get-dns-records. |
500 | 120 | Внутренняя ошибка проверки DKIM. Пожалуйста, свяжитесь с техподдержкой. |
400 | 121 | Таймаут поиска домена. Истекло время DNS запроса. Убедитесь, что ваш DNS сервис работает и попробуйте снова. |
400 | 122 | DKIM-запись не найдена. Добавьте DNS-запись с DKIM-ключом, полученным с помощью метода domain/get-dns-records. Если вы уже сделали это - подождите несколько минут и повторите запрос. |
400 | 123 | Неверная DKIM-запись. Вам надо внести корректную DKIM-запись в DNS вашего домена. |
400 | 124 | DKIM-запись не совпадает с ожидаемой. Возможно, вы изменили запись. Запись в DNS корректна, но не совпадает с ожидаемой нами. Внесите запись с DKIM-ключом, который возвращается методом domain/get-dns-records. |
400 | 125 | Указано несколько DKIM-ключей в DNS домена Вам надо внести одну корректную DKIM-запись в DNS вашего домена. |
400 | 126 | В записи DNS присутствуют другие типы записей, отличных от DKIM. Добавьте DNS-запись с DKIM-ключом, полученным с помощью метода domain/get-dns-records. |
400 | 127 | Достигнут лимит записей DKIM для основного домена. Допускается не более 10 DKIM записей для основного домена. |
400 | 129 | Иная ошибка проверки DKIM, причина которой отличается от причин описанных выше ошибок 120-124. Вам надо внести корректную DKIM-запись в DNS вашего домена, взяв данные из результатов вызова domain/get-dns-records. Если это не помогает, обратитесь в техподдержку. |
400 | 130 | Домен верхнего уровня не может иметь пользовательские записи в соответствии с Registry policy. Укажите другой домен. |
500 | 150 | Неизвестная внутренняя ошибка. Попробуйте повторить запрос или обратитесь в службу поддержки. |
413 | 199 | Запрос слишком большой. Данных в запросе должно быть не больше 10Mб. |
400 | 201 | Тело письма не передано. Убедитесь, что тело письма передается правильно. |
400 | 202 | Не указан адрес отправителя. Укажите адрес отправителя. |
400 | 203 | Не указана тема письма. Укажите тему письма. |
400 | 204 | Получатели письма заданы некорректно. Убедитесь, что список получателей задан массивом, в котором каждый получатель является массивом, где обязательно задан параметр ‘email’. |
400 | 205 | Неверный адрес отправителя. Убедитесь, что параметр ‘email_from’ заполнен верно. |
400 | 206 | В качестве адреса отправителя используется неподтвержденный адрес. Используйте адрес, находящийся на подтвержденном домене. |
400 | 207 | MIME-тип файла не соответствует заданному. Проверьте указанный тип и файл на соответствие. |
400 | 208 | Недопустимое имя приложенных файлов. Запрещенный символ ‘$symbol’. Переименуйте файлы с запрещенными символами. |
400 | 209 | В приложенных файлах повторяются имена. Переименуйте файлы с повторяющимися именами. |
400 | 210 | В файлах, приложенных к телу письма, повторяются имена. Переименуйте файлы с повторяющимися именами. |
400 | 211 | Недопустимое имя в файлах, приложенных к телу письма. Запрещенный символ ‘$symbol’. Переименуйте файлы с запрещенными символами. |
400 | 212 | Некорректно заданы подстановки в массиве получателей (не задан массив подстановок). Убедитесь, что не превышен максимальный лимит подстановок и отсутствуют подстановки неправильного типа данных (допустимо string/integer). |
400 | 213 | Некорректный или несуществующий ‘custom_backend_id’. Укажите активный backend-домен доступный вашему аккаунту/проекту. |
403 | 215 | Пользователь не может отправлять. Попробуйте обратиться в службу поддержки. |
400 | 216 | Данные адресатов переданы неправильно. Значение ‘metadata’ должно быть типа string или integer. Для передачи нескольких параметров в ‘metadata’ используйте синтаксис массива. |
400 | 217 | Превышен лимит параметров в ‘metadata’. Сократите количество параметров в ‘metadata’, их должно быть не больше 10. |
400 | 218 | Данные адресатов переданы неправильно. Убедитесь, что ключ параметра ‘metadata’ короче 64 символов. |
400 | 219 | Данные адресатов переданы неправильно. Убедитесь, что значение параметра ‘metadata’ короче 1024 символов. |
400 | 220 | Данные адресатов переданы неправильно. Ключ параметра ‘metadata’ не должен быть пустым. |
400 | 221 | В запросе нет html-тега <body>. Поместите html-тег <body> внутрь тега <html>. Тег <body> необходим для отображения содержимого HTML письма. |
400 | 223 | В ‘attachments’ пропущено тело ‘content’ или передано пустоту. Добавьте тело ‘content’ и укажите для него значение. |
400 | 224 | Названия переменных могут содержать буквы латинского алфавита, цифры, символ “_”. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
403 | 225 | Нет прав для использования template engine ‘none’. Свяжитесь с техподдержкой. |
400 | 226 | Значение параметров ‘track_links’ и ‘track_read’ должно быть равно 0 для использования ‘template_engine’:‘none’. Убедитесь что значение передаваемых параметров ‘track_links’ и ‘track_read’ равно 0. |
400 | 227 | Некорректный или несуществующий ‘smtp_pool_id’. Укажите корректный ‘smtp_pool_id’ доступный вашему аккаунту/проекту. |
400 | 228 | Передача ‘smtp_pool_id’ требует также передачи ‘custom_backend_id’. Убедитесь, что ‘custom_backend_id’ передан. |
400 | 229 | Для отправки требуется пользовательский бекенд домен или домен трекинга. Убедитесь, что пользовательский бекенд домен или домен трекинга передан. |
400 | 230 | Для отправки требуется только бекенд домен по умолчанию или домен трекинга. Убедитесь, что бекенд домен по умолчанию или домен трекинга передан. |
400 | 303 | Список событий, переданный в запросе, содержит неподдерживаемое значение/событие не поддерживается. Проверьте корректность ввода списка событий. |
400 | 304 | Не удалось найти Webhook с указанным URL. Убедитесь в правильности передаваемого URL. |
400 | 305 | URL не передан. Убедитесь в правильности передаваемого URL. |
400 | 601 | Шаблон не найден. Проверьте корректность ввода id шаблона. |
400 | 602 | Название шаблона не передано. Проверьте корректность ввода названия шаблона. |
400 | 603 | Название шаблона, переданное в запросе, уже принадлежит другому шаблону. Используйте другое название шаблона. |
400 | 604 | Достигнуто максимальное значение количества шаблонов. Удалите уже созданные шаблоны, чтобы создать новые. Количество шаблонов не должно превышать 10000. |
400 | 701 | Причина не найдена. Недопустимая причина блокировки адреса. Свяжитесь с техподдержкой. |
403 | 901 | Отправка заблокирована из-за превышения дневного лимита. У каждого пользователя есть максимальный дневной лимит отправок для предотвращения спама. Этот лимит автоматически увеличивается при успешных доставках. Вы можете либо плавно увеличивать объём отправок и лимит увеличится автоматически, либо запросить увеличение, обратившись в техподдержку. |
403 | 902 | Достигнут дневной лимит отправок на бесплатном тарифе. Ждите следующего дня либо переключитесь на платный тариф. |
403 | 903 | На бесплатном тарифе разрешена отправка только на свои собственные подтверждённые домены. Пожалуйста, подтвердите владение всеми доменами, на которые вы хотите слать письма либо переключитесь на платный тариф. |
403 | 904 | Недостаточно средств. Ошибка оплаты по карте. Попробуйте подключить другую карту или свяжитесь с техподдержкой для разрешения ситуации. |
403 | 905 | Вы достигли предела отправок по вашему тарифному плану. Обычно тарифные планы позволяют платное превышение лимита. В вашем случае это запрещено - возможно, из-за неоплаченных счетов. Пожалуйста, убедитесь, что все счета оплачены или свяжитесь с техподдержкой для решения проблемы. |
400 | 906 | Достигнут дневной лимит сброса блокировок email. На сегодня вы использовали доступный лимит сброса блокировок. Попробуйте завтра или свяжитесь с техподдержкой для увеличения лимита. |
500 | 908 | Внутренняя ошибка, владелец проекта не найден. Свяжитесь с техподдержкой. |
400 | 1000 | Не указан адрес получателя. Укажите адрес получателя. |
400 | 1001 | Недопустимое значение адреса получателя. Проверьте, корректно ли введен адрес получателя. |
400 | 1002 | Не указан адрес отправителя. Укажите адрес отправителя. |
400 | 1003 | Адрес отправителя не подтвержден. Подтвердите домен адреса отправителя. |
400 | 1004 | Недопустимое значение адреса отправителя. Проверьте, корректно ли введен адрес отправителя. |
400 | 1005 | Слишком длинное имя отправителя. Сделайте короче имя отправителя. |
400 | 1006 | Превышен дневной лимит вызова метода. Попробуйте повторить вызов на следующий день. |
400 | 1100 | Не указано доменное имя. Укажите домен, который необходимо подтвердить. |
400 | 1101 | Недопустимое значение домена. Укажите корректное значение домена. |
400 | 1102 | Ошибка в поле ‘domain’. Отправка писем с указанного домена запрещена. Укажите другой домен. |
400 | 1103 | Ошибка в поле ‘domain’. Публичные бесплатные домены не допускаются. Используйте только свои собственные домены. |
400 | 1200 | Не указано доменное имя. Укажите н имя для проверки. |
400 | 1201 | Недопустимое значение домена. Укажите корректное значение домена, который вам принадлежит. |
400 | 1202 | Домен не зарегистрирован в Unisender Go. Вызовите метод domain/get-dns-records для регистрации домена в Unisender Go. |
400 | 1301 | Недопустимое значение домена. Укажите корректное значение домена, который вам принадлежит. |
400 | 1302 | Недопустимое значение лимита. Значение limit должно быть целым числом в диапазоне 1 - 100. |
400 | 1303 | Недопустимое значение позиции. Значение offset должно быть больше или равно 0. |
400 | 1304 | Неверный тип значения позиции. Значение offset должно иметь тип integer. |
400 | 1305 | Неверный тип значения лимита. Значение limit должно иметь тип integer. |
400 | 1350 | Ошибка в поле ‘domain’. Значение не должно быть пустым. Убедитесь, что поле ‘domain’ заполнено. |
400 | 1351 | Ошибка в поле ‘domain’. Недопустимое значение домена. Укажите корректное значение домена. |
400 | 1352 | Ошибка в поле ‘domain’. Указанный домен не найден. Убедитесь, что домен указан верно. |
400 | 1400 | Не указано доменное имя. Укажите доменное имя для проверки. |
400 | 1401 | Некорректный или несуществующий домен. Либо вы допустили ошибку в имени домена и её надо исправить, либо изменения в DNS ещё не распространились и вам надо подождать несколько часов и сделать повторную попытку. У домена должна быть A, AAAA или MX запись. |
400 | 1402 | Домен не зарегистрирован в Unisender Go. Зарегистрируйте домен с помощью вызова domain/get-dns-records. |
400 | 1506 | Поле ‘headers’ должно быть объектом. Проверьте передаваемый JSON и используйте объект для поля ‘headers’ (не массив, строку или какой-то другой тип). |
400 | 1507 | Более 50 элементов в массиве ‘headers’. Пожалуйста, сократите количество элементов массива ‘headers’ до 50. |
400 | 1508 | Ошибка в поле ‘template_id’. Шаблон с указанным ID не существует. Убедитесь, что ID шаблона указан правильно. |
400 | 1509 | Поле ‘body’ должно быть объектом. Проверьте передаваемый JSON и используйте объект для поля ‘headers’ (не массив, строку или какой-то другой тип). |
400 | 1510 | Ошибка в поле ‘body.html’. Это значение должно быть строкой. Убедитесь, что в поле ‘body.html’ передана строка. |
400 | 1511 | Ошибка в поле ‘body.plaintext’. Это значение должно быть строкой. Убедитесь, что в поле ‘body.plaintext’ передана строка. |
400 | 1512 | Ошибка в поле ‘body.amp’. Это значение должно быть строкой. Убедитесь, что в поле ‘body.amp’ передана строка. |
400 | 1516 | Ошибка в поле ‘body.html’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘body.html’. |
400 | 1517 | Ошибка в поле ‘body.plaintext’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘body.plaintext’. |
400 | 1518 | Ошибка в поле ‘body.amp’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘body.amp’. |
400 | 1519, 2514 | Ошибка в поле ‘reply_to’. Это значение должно быть строкой. Убедитесь, что в поле ‘reply_to’ передана строка. |
400 | 1520, 2515 | Ошибка в поле ‘reply_to’. Недопустимый адрес. Проверьте, корректно ли введен адрес. |
400 | 1521 | Ошибка в поле ‘from_name’. Это значение должно быть строкой. Убедитесь, что в поле ‘from_name’ передана строка. |
400 | 1522 | Ошибка в поле ‘subject’. Это значение должно быть строкой. Убедитесь, что в поле ‘subject’ передана строка. |
400 | 1523, 2516 | Ошибка в поле ‘template_engine’. Значение ‘template_engine’ должно быть ‘velocity’ либо ‘simple’. Передавайте значение параметра ‘template_engine’ равным ‘velocity’ либо ‘simple’. |
400 | 1524 | Более 500 элементов в массиве ‘recipients’. Пожалуйста, сократите количество элементов массива ‘recipients’ до 500. |
400 | 1525 | Ошибка в поле ‘options.send_at’. Убедитесь, что дата и время запланированной отправки указаны не более чем на 24 часа вперёд. |
400 | 1526 | Ошибка в поле ‘headers[“X-UNISENDER-GO-Template-Engine”]’. Значение headers[“X-UNISENDER-GO-Template-Engine”] должно быть ‘velocity’ либо ‘simple’. Передавайте значение параметра [“X-UNISENDER-GO-Template-Engine”] равным ‘velocity’ либо ‘simple’. |
400 | 1527 | Ошибка в поле ‘headers[“X-UNISENDER-GO-Global-Language”]’. Недопустимое значение поля. Убедитесь, что передается одно из допустимых значений: ‘ru’, ‘en’, ‘ua’, ‘be’, ‘es’, ‘fr’, ‘pl’, ‘de’, ‘pt’, ‘it’. |
400 | 1528 | Ошибка в поле ‘global_language’. Недопустимое значение поля. Убедитесь, что передается одно из допустимых значений: ‘ru’, ‘en’, ‘ua’, be’, ‘es’, ‘fr’, ‘pl’, ‘de’, ‘pt’, ‘it’. |
400 | 1529 | Ошибка в поле ‘options.send_at’. Значение должно быть в пределах 24 часов от текущего времени. Передавайте значение параметра в пределах 24 часов от текущего времени. |
400 | 1530 | Ошибка в поле ‘options.send_at’. Это значение должно быть строкового типа или время указано в неверном формате. Используйте строку для параметра ‘options.send_at’, убедитесь, что дата и время переданы правильно. |
400 | 1532 | Массив ‘tags’ должен содержать не более 4 элементов. Пожалуйста, ограничьте количество строк до 4. |
400 | 1533 | Ошибка в поле ‘tags’. Достигнуто максимально допустимое количество меток. Удалите уже созданные теги, чтобы создать новые. Количество тегов ограничено 10000. |
400 | 1534 | Слишком длинное название тега. Убедитесь что передается не более 50 символов. |
400 | 1535 | Один или несколько тегов содержат недопустимые символы. Убедитесь, что названия тегов переданы правильно. |
400 | 1537 | Ошибка в поле ‘bypass_global’. Значение параметра ‘bypass_global’ должно быть равно 1. Убедитесь что значение параметра ‘bypass_global’ равно 1. |
400 | 1538 | Ошибка в поле ‘bypass_unsubscribed’. Запрещено использовать поле ‘bypass_unsubscribed’ без флага ‘allow_skip_unsubscribe’. Свяжитесь с техподдержкой. |
400 | 1539 | Ошибка в поле ‘bypass_complained’. Запрещено использовать поле ‘bypass_complained’ без флага ‘allow_skip_unsubscribe’. Свяжитесь с техподдержкой. |
400 | 1540 | Ошибка в поле ‘metadata’. Размер поля ‘metadata’ не должен превышать 4000 байт. Уменьшите размер поля до 4000 байт. |
400 | 1541 | Ошибка в поле ‘global_metadata’. Размер поля ‘global_metadata’ не должен превышать 4000 байт. Уменьшите размер поля до 4000 байт. |
400 | 1542 | Ошибка в поле ‘metadata’ и ‘global_metadata’. Размер поля ‘metadata’ и ‘global_metadata’ не должен превышать 4000 байт. Уменьшите размер поля до 4000 байт. |
400 | 1543 | Ошибка в поле ‘global_metadata.campaign_id’. Это значение должно быть строкой. Убедитесь, что в поле ‘global_metadata.campaign_id’ передана строка. |
400 | 1544 | Ошибка в поле ‘metadata.campaign_id’. Это значение должно быть строкой. Убедитесь, что в поле ‘metadata.campaign_id’ передана строка. |
400 | 1545 | Ошибка в поле ‘metadata.campaign_id’. Указано недопустимое значение. Используйте неотрицательное десятичное целое или UUID до 128 бит. |
400 | 1546 | Ошибка в поле ‘subject’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘subject’. |
400 | 1547 | Ошибка в поле ‘from_name’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘from_name’. |
400 | 1548, 2527 | Ошибка в поле ‘options.unsubscribe_url’. Это значение должно быть объектом. Убедитесь, что в поле ‘options.unsubscribe_url’ передан объект. |
400 | 1549 | Ошибка в поле ‘options.unsubscribe_url’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1550 | Ошибка в поле ‘options’. Это значение должно быть объектом. Убедитесь, что в поле ‘options’ передан объект. |
400 | 1551 | Ошибка в поле ‘metadata’ или ‘global_metadata’. Значение должно быть строкового типа. Передавайте строку в параметрах ‘metadata’ и ‘global_metadata’. |
400 | 1554 | Ошибка в поле ‘headers[‘Cc’]’. Количество email в заголовке “Cc” не должно превышать ‘N’. Убедитесь, что количество адресов в заголовке “Cc” не превышает допустимое значение. |
400 | 1555 | Ошибка в поле 'headers[‘Cc’]». Email передаваемые в заголовке “Cc” должны присутствовать в массиве ‘recipients’. Используйте только email из массива ‘recipients’. |
400 | 1556 | Ошибка в поле 'headers[‘Cc’]». Заголовок «Cc» допускается только с непустым заголовком «To». Убедитесь, что переданы заголовки «headers[‘To’]». |
400 | 1557 | Ошибка в поле ‘headers[‘To’]’. Количество email в заголовке “To” не должно превышать ‘N’. Убедитесь, что количество адресов в заголовке “To” не превышает допустимое значение. |
400 | 1558 | Ошибка в поле ‘headers[‘To’]’. Email передаваемые в заголовке “To” должны присутствовать в массиве ‘recipients’. Используйте только email из массива ‘recipients’. |
400 | 1559 | Ошибка в поле ‘recipients’. Email не указан в заголовках “To” или “Cc”, или домен электронной почты не подтвержден BCC может содержать только email переданные в заголовках “To” и “Cc” или на вашем подтвержденном домене. |
400 | 1560 | Ошибка в поле ‘recipients’. Количество email в ‘recipients’ не должно превышать лимит суммы адресов указанных в заголовках “To” и “Cc”. Убедитесь, что количество писем в заголовках “To” и “Cc” не превышает допустимое. |
400 | 1561 | Ошибка в поле ‘headers[‘Cc’]’. Недопустимое значение заголовка. Убедитесь, что заголовки переданы правильно. |
400 | 1562 | Ошибка в поле ‘headers[‘To’]’. Недопустимый значение заголовка. Убедитесь, что заголовки переданы правильно. |
400 | 1563 | Ошибка в поле ‘headers[“Unisender-Go-Product”]’. Яндекс.Облако: недопустимый или пустой заголовок ‘Unisender-Go-Product’. Убедитесь, что заголовки переданы правильно. |
403 | 1564 | Ошибка в поле ‘headers[“Unisender-Go-Product”]’. Несоответствие тарифов Яндекс.Облака и внутренних тарифов. Убедитесь, что тарифы совпадают. |
400 | 1565 | Ошибка в поле ‘body.html’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1566 | Ошибка в поле ‘subject’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1567 | Ошибка в поле ‘from_name’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1568 | Ошибка в поле ‘reply_to_name’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1569 | Ошибка в поле ‘body.plaintext’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1570 | Ошибка в поле ‘body.amp’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1571 | Ошибка в поле ‘options.unsubscribe_url’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 1601, 1701 | Ошибка в поле ‘project’, отсутствует секция project. Исправьте структуру JSON запроса. |
400 | 1602, 1702 | Ошибка в поле ‘name’ - оно не должно быть пустым. Передавайте непустое значение name. |
400 | 1603, 1703 | Ошибка в поле ‘name’ - не строковый тип. Передавайте строку в параметре name. |
400 | 1604, 1704 | Ошибка в поле ‘name’ - превышена максимальная длина, количество символов больше 255. Используйте более короткие имена проектов. |
400 | 1605, 1705 | Ошибка в поле ‘name’ - проект с таким именем уже существует. Передавайте уникальное название проекта, либо сначала удалите уже существующий проект с таким именем. |
400 | 1606 | Ошибка в поле ‘send_enabled’ - значение должно быть булевым. Передавайте только значения true или false. |
400 | 1607 | Ошибка в поле ‘custom_unsubscribe_url_enabled’ - значение должно быть булевым. Передавайте только значения true или false. |
400 | 1608, 1711 | Запрещено использовать поле ‘custom_unsubscribe_url_enabled’ Свяжитесь с техподдержкой. |
400 | 1609, 1716 | Ошибка в поле ‘country’. Это значение должно быть строкой. Используйте строковый тип для поля ‘country’. |
400 | 1610, 1717 | Ошибка в поле ‘country’. Указан невалидный код страны. Убедитесь что двухбуквенный код страны по правилам ISO-3166 alpha-2 указан верно. |
400 | 1611, 1718 | Ошибка в поле ‘backend_domain_id’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘backend_domain_id’. |
400 | 1612, 1719 | Ошибка в поле ‘backend_domain_id’. Указанный backend-домен не принадлежит пользователю. Укажите backend-домен доступный вашему аккаунту/проекту. |
400 | 1613, 1720 | Ошибка в поле ‘backend_domain_id’. Backend-домен неактивен. Проверьте статус указанного backend-домена, он должен быть активен. |
400 | 1706 | Ошибка в поле ‘project_api_key’ - одно из двух свойств [‘project_api_key’ или ‘project_id’] обязательно. Передайте непустое значение в project_id или project_api_key. |
400 | 1707, 1802 | Ошибка в поле ‘project_api_key’ - проект не найден. Передавайте правильный project_api_key. Вы можете получить список всех проектов с их ключами с помощью метода project/list. |
400 | 1708 | Ошибка в поле ‘project_api_key’ - значение должно быть строковым. Используйте строковый тип для ‘project_api_key’. |
400 | 1709 | Ошибка в поле ‘send_enabled’ - значение должно быть булевым. Передавайте только значения true или false. |
400 | 1710 | Ошибка в поле ‘custom_unsubscribe_url_enabled’. Это значение должно быть булевым. Передавайте только значения true или false. |
400 | 1712, 1805, 1905 | Ошибка в поле ‘project_id’. Это значение должно быть строкой. Используйте строковый тип для поля project_id. |
400 | 1713, 1804 | Ошибка в поле ‘project_api_key’. Одно из двух свойств [‘project_api_key’ или ‘project_id’] должно быть пустым. Передавайте только один из параметров - либо project_id, либо project_api_key, но не оба сразу. |
400 | 1714, 1806 | Ошибка в поле ‘project_id’. Проект с ID: ‘NNNN’ не существует. Проверьте идентификатор проекта. Может быть, он был удалён или никогда и не существовал? |
400 | 1715, 1807 | Ошибка в поле ‘project_id’. Это значение не валидно. Убедитесь, что вы передаёте project_id именно таким, каким получили его при вызове метода project/create. |
400 | 1721 | Недопустимое значение поля ‘email_counter’.Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘email_counter’. |
400 | 1722 | Недопустимое значение поля ‘email_counter’. Это значение должно быть равно 0. Укажите в параметре ‘email_counter’ значение равно 0. |
400 | 1723 | Недопустимое значение поля ‘email_counter_limit’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘email_counter_limit’. |
400 | 1724 | Недопустимое значение поля ‘email_counter_limit’. Это значение должно быть больше или равно 0. Укажите в параметре ‘email_counter_limit’ значение больше или равно 0. |
400 | 1725 | Недопустимое значение поля ‘email_counter_mode’ - значение должно быть булевым. Передавайте только значения default или permanent. |
400 | 1801 | Ошибка в поле ‘project_api_key’ - одно из двух свойств [‘project_api_key’ или 'project_id’] обязательно. Передайте непустое значение в project_id или project_api_key. |
400 | 1803, 1902 | Ошибка в поле ‘project_api_key’ - параметр не строкового типа. Используйте строковый тип для ‘project_api_key’. |
400 | 1904 | Ошибка в поле ‘project_id’ - неверный формат. Убедитесь, что вы передаёте параметр ‘project_id’ в том же виде, в котором его возвращает project/create. |
400 | 2306 | Ошибка в поле ‘recipients’. Значение не должно быть пустым. Убедитесь, что поле ‘recipients’ заполнено. |
400 | 2307 | Ошибка в поле ‘recipients’. Это значение должно быть строкового типа. Используйте строку для параметра ‘recipients’. |
400 | 2500 | Ошибка в поле ‘editor_type’. Допустимое значение ‘html’. Убедитесь, что в поле ‘editor_type’ передано ‘html’. |
400 | 2501 | Шаблон был создан в визуальном редакторе. Убедитесь, что шаблон создан в HTML редакторе. |
400 | 2502 | Поле ‘editor_type’ не должно быть пустым. Передайте в поле ‘editor_type’ значение ‘html’. |
400 | 2503 | Ошибка в поле ‘id’. Шаблон с указанным ID не найден. Убедитесь, что ID шаблона указано верно. |
400 | 2504 | Поле ‘headers’ должно быть объектом. Проверьте передаваемый JSON и используйте объект для поля ‘headers’ (не массив, строку или какой-то другой тип). |
400 | 2505 | Более 50 элементов в массиве ‘headers’. Пожалуйста, сократите количество элементов массива ‘headers’ до 50. |
400 | 2514 | Ошибка в поле ‘reply_to’. Это значение должно быть строкой. Убедитесь, что в поле ‘reply_to’ передана строка. |
400 | 2515 | Ошибка в поле ‘reply_to’. Недопустимый адрес. Проверьте, корректно ли введен адрес. |
400 | 2516 | Ошибка в поле ‘template_engine’. Значение ‘template_engine’ должно быть ‘velocity’ либо ‘simple’. Передавайте значение параметра ‘template_engine’ равным ‘velocity’ либо ‘simple’. |
400 | 2517 | Ошибка в поле ‘subject’. Это значение должно быть строкой. Убедитесь, что в поле ‘subject’ метода template/set передана строка. |
400 | 2518 | Ошибка в поле ‘subject’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘subject’ метода template/set. |
400 | 2519 | Ошибка в поле ‘from_name’. Это значение должно быть строкой. Убедитесь, что в поле ‘from_name’ метода template/set передана строка. |
400 | 2520 | Ошибка в поле ‘from_name’. В подстановках присутствуют недопустимые значения. Проверьте правильность подстановок в поле ‘from_name’ метода template/set. |
400 | 2521 | Ошибка в поле ‘from_name’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 2522 | Ошибка в поле ‘subject’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 2523 | Ошибка в поле ‘reply_to_name’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 2524 | Ошибка в поле ‘options’. Это значение должно быть строкой. Убедитесь, что в поле ‘options’ передана строка. |
400 | 2525 | Ошибка в поле ‘options.unsubscribe_url’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 2526 | Ошибка в поле ‘options.unsubscribe_url’. Названия переменных могут содержать буквы латинского алфавита, цифры, символ ‘_’. Первым символом может быть только буква. Убедитесь, что названия переменных переданы правильно. |
400 | 2600 | Недопустимое значение поля ‘limit’. Это значение должно быть больше или равно 0. Укажите в параметре ‘limit’ значение больше или равно 0. |
400 | 2601 | Недопустимое значение поля ‘limit’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘limit’. |
400 | 2602 | Недопустимое значение поля ‘offset’. Это значение должно быть больше или равно 0. Укажите в параметре ‘offset’ значение больше или равно 0. |
400 | 2603 | Недопустимое значение поля ‘offset’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘offset’. |
400 | 2700 | Ошибка в поле ‘url’. Значение должно быть строкового типа. Передавайте строку в параметре ‘url’. |
400 | 2701 | Ошибка в поле ‘url’. Значение не должно быть пустым. Убедитесь, что URL указан в значении параметра. |
400 | 2702 | Ошибка в поле ‘offset’. Значение должно быть больше или равно 0. Установите значение параметра больше или равное 0. |
400 | 2703 | Ошибка в поле ‘eventFormat’. Выбранное вами значение недопустимо. Используйте только формат ‘json_post’ или ‘json_post_gzip’. |
400 | 2704 | Ошибка в поле ‘deliveryInfo’. Значение ‘delivery_info’ должно быть 1/0 либо true/false. Передавайте значение параметра ‘delivery_info’ равным 1/0 либо true/false. |
400 | 2705 | Ошибка в поле ‘singleEvent’. Значение ‘single_event’ должно быть 1/0 либо true/false. Передавайте значение параметра ‘single_event’ равным 1/0 либо true/false. |
400 | 2706 | Ошибка в поле ‘maxParallel’. Значение должно иметь целочисленный тип. Передавайте значение целочисленного типа в параметре ‘maxParallel’. |
400 | 2707 | Ошибка в поле ‘maxParallel’. Значение должно находиться в диапазоне от 5 до 100. Используйте допустимое значение от 5 до 100. |
400 | 2708 | Ошибка в поле ‘events’. Это значение должно быть массивом. Убедитесь, что список событий в параметре ‘events’ передан массивом. |
400 | 2709 | Ошибка в поле ‘events’. Значение не должно быть пустым. Убедитесь, что в параметре ‘events’ переданы значения. |
400 | 2710 | Ошибка в поле ‘events’. Поле ‘email_status’ обязательно. Убедитесь, что передан параметр ‘email_status’. |
400 | 2711 | Ошибка в поле ‘email_status’.Значение ‘test’ недопустимо для ‘email_status’. Укажите верный статус сообщений. |
400 | 2712 | Ошибка в поле ‘spam_block’. Значение ‘test’ недопустимо для ‘spam_block’. Укажите верное событие спам-блокировок. |
400 | 2713 | Ошибка в поле ‘url’. Домен для Webhook не найден. Убедитесь, что домен указан правильно. |
400 | 2714 | Ошибка в поле ‘status’. Недопустимое значение, статус может быть только ‘active’ или ‘disabled’. Укажите статус ‘active’ или ‘disabled’. |
400 | 2715 | Ошибка в поле ‘status’. Это значение должно быть строкового типа. Используйте строку для параметра ‘status’. |
400 | 2800 | Ошибка в поле ‘name’. Значение не должно быть пустым. Убедитесь, что поле ‘name’ заполнено. |
400 | 2801 | Ошибка в поле ‘name’. Это значение должно быть строкой. Убедитесь, что в поле ‘name’ передана строка. |
400 | 2802 | Ошибка в поле ‘type’. Это значение должно быть строкой. Убедитесь, что в поле ‘type’ передана строка. |
400 | 2803 | Ошибка в поле ‘content’. Это значение должно быть строкой. Убедитесь, что в поле ‘content’ передана строка. |
400 | 2804 | Размер поля ‘content’ не должен превышать 7Мб. Уменьшите размер поля ‘content’ до 7Мб (9786710 байт в base64). |
400 | 2900, 3000, 3100 | Ошибка в поле ‘email’. Значение не должно быть пустым. Убедитесь, что email указан в значении параметра. |
400 | 2901, 3001, 3101 | Ошибка в поле ‘email’. Значение должно быть строкового типа. Передавайте строку в параметре ‘email’. |
400 | 2902, 3002, 3102 | Ошибка в поле ‘email’. Указан невалидный адрес. Проверьте корректность ввода email. |
400 | 2903 | Ошибка в поле ‘all_projects’. Значение должно быть булевым. Передавайте только значения true или false. |
400 | 3003 | Ошибка в поле ‘email’. Адрес не существует. Указанный email не найден в списке блокировок. |
400 | 3004 | Ошибка в поле ‘email’. Адрес недоступен для удаления. Указанный email недоступен для удаления из списка заблокированных. Например, имеет причину блокировки blocked. |
400 | 3103 | Ошибка в поле ‘cause’. Значение не должно быть пустым. Убедитесь, что поле ‘cause’ заполнено. |
400 | 3104, 3200 | Ошибка в поле ‘cause’. Это значение должно быть строкой. Используйте строковый тип для поля ‘cause’. |
400 | 3105, 3201 | Ошибка в поле ‘cause’. Недопустимое значение поля. Убедитесь, что передается одно из допустимых значений. |
400 | 3106 | Ошибка в поле ‘created’. Это значение должно быть строкой. Используйте строковый тип для поля ‘created’. |
400 | 3107 | Ошибка в поле ‘created’. Недопустимое значение поля. Убедитесь, что дата и время переданы правильно. |
400 | 3202 | Ошибка в поле ‘source’. Это значение должно быть строкой. Используйте строковый тип для поля ‘source’. |
400 | 3203 | Ошибка в поле ‘source’. Недопустимое значение поля. Убедитесь, что передается одно из допустимых значений. |
400 | 3204 | Ошибка в поле ‘start_time’. Это значение должно быть строкой. Используйте строковый тип для поля ‘start_time’. |
400 | 3205 | Ошибка в поле ‘start_time’. Недопустимое значение поля. Убедитесь, что дата и время переданы правильно. |
400 | 3206 | Ошибка в поле ‘cursor’. Это значение должно быть строкой. Используйте строковый тип для поля ‘cursor’. |
400 | 3207 | Ошибка в поле ‘cursor’. Недопустимое значение поля. Убедитесь, что передается одно из допустимых значений. |
400 | 3208 | Ошибка в поле ‘limit’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘limit’. |
400 | 3209 | Ошибка в поле ‘limit’. Это значение должно быть больше или равно 0. Значение ‘limit’ должно быть больше или равно 0. |
400 | 3300 | Ошибка в поле ‘start_time’. Значение не должно быть пустым. Убедитесь, что поле ‘start_time’ заполнено. |
400 | 3301 | Ошибка в поле ‘start_time’. Недопустимое значение поля. Убедитесь, что дата и время переданы правильно. |
400 | 3302 | Ошибка в поле ‘end_time’. Недопустимое значение поля. Убедитесь, что дата и время переданы правильно. |
400 | 3303 | Ошибка в поле ‘limit’. Это значение должно быть больше или равно 0. Убедитесь что передаваемое значение больше или равно 0. |
400 | 3304 | Ошибка в поле ‘format’. Недопустимое значение формата файла дампа событий. Используйте только формат ‘csv’ или ‘csv_gzip’. |
400 | 3305 | Ошибка в поле ‘delimiter’. Недопустимое значение поля ‘delimiter’. Используйте только ‘;’ или ‘,’ в качестве разделителя. |
400 | 3308 | Ошибка в поле ‘all_projects’. У пользователя нет доступа к использованию проектов. Методы проектов по умолчанию отключены. Чтобы их включить, вам необходимо обратиться в службу поддержки. |
400 | 3309 | Достигнуто максимальное значение количества дампов событий. Удалите уже созданные дампы, чтобы создать новые. Количество дампов не должно превышать 10. |
400 | 3310 | Ошибка в поле ‘start_time’. Дата начала интервала не может быть раньше, чем ‘$time’. Убедитесь, что ‘start_time’ находится в допустимом диапазоне. |
400 | 3311 | Недопустимое значение поля ‘limit’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘limit’. |
400 | 3312 | Ошибка в поле ‘delimiter’. Значение должно быть строкового типа. Используйте строку для параметра ‘delimiter’. |
400 | 3313 | Ошибка в поле ‘format’. Значение должно быть строкового типа. Используйте строку для параметра ‘format’. |
400 | 3315 | Ошибка в поле ‘aggregate’. Это значение должно быть строкой. Убедитесь, что в поле ‘aggregate’ передана строка. |
400 | 3316 | **Ошибка в поле ‘filter’. Недопустимо использовать ‘filter’ с параметром’aggregate’. Убедитесь, что передается только один из двух параметров. |
400 | 3317 | Ошибка в поле ‘dumpFields’. Это значение должно быть массивом. Убедитесь, что список событий в параметре ‘dumpFields’ передан массивом. |
400 | 3318 | Ошибка в поле ‘dumpFields’. Недопустимое значение поля. Убедитесь, что передается одно из допустимых значений. |
400 | 3319 | **Ошибка в поле ‘aggregate’. Недопустимое значение, может быть только ‘day_status’ или пустым. Передавайте значение параметра ‘aggregate’ равным ‘day_status’ либо пустым. |
400 | 3400 | Поле ‘filter’ должно быть объектом. Проверьте передаваемый JSON и используйте объект для поля ‘filter’ (не массив, строку или какой-то другой тип). |
400 | 3401 | Ошибка в поле ‘filter.job_id’. Значение должно быть строкового типа. Передавайте строку в параметре ‘filter.job_id’. |
400 | 3402 | Ошибка в поле ‘filter.status’. Это значение должно быть строкой. Убедитесь, что в поле ‘filter.status’ передана строка. |
400 | 3403 | Ошибка в поле ‘filter.status’. Недопустимый статус. Убедитесь, что передается одно из допустимых значений. |
400 | 3404 | Ошибка в поле ‘filter.email’. Это значение должно быть строкой. Убедитесь, что в поле ‘filter.email’ передана строка. |
400 | 3405 | Ошибка в поле ‘filter.email’. Недопустимый адрес. Проверьте, корректно ли введен адрес. |
400 | 3406 | Ошибка в поле ‘filter.email_from’. Значение должно быть строкового типа. Передавайте строку в параметре ‘filter.email_from’. |
400 | 3407 | Ошибка в поле ‘filter.email_from’. Недопустимый адрес. Проверьте, корректно ли введен адрес. |
400 | 3408 | Ошибка в поле ‘filter.domain’. Значение должно быть строкового типа. Передавайте строку в параметре ‘filter.domain’. |
400 | 3409 | Ошибка в поле ‘filter.domain’. Недопустимое значение домена. Укажите корректное значение домена. |
400 | 3410 | Ошибка в поле ‘filter.domain’. Указанный домен отличается от передаваемого в email. Убедитесь, что домен указан правильно. |
400 | 3411 | Ошибка в поле ‘filter.delivery_status’. Значение должно быть строкового типа. Передавайте строку в параметре ‘filter.delivery_status’. |
400 | 3412 | Ошибка в поле ‘filter.delivery_status’. Недопустимый статус. Убедитесь, что передается одно из допустимых значений. |
400 | 3413 | Ошибка в поле ‘filter.campaign_id’. Это значение должно быть строкой. Убедитесь, что в поле ‘filter.campaign_id’ передана строка. |
400 | 3414 | Ошибка в поле ‘filter.campaign_id’. Указано недопустимое значение. Используйте беззнаковое целочисленное строковое число до 128 бит. |
400 | 3500, 3600 | Ошибка в поле ‘dump_id’. Значение не должно быть пустым. Убедитесь, что ‘dump_id’ указан в значении параметра. |
400 | 3501, 3601 | Ошибка в поле ‘dump_id’. Это значение не валидно. Убедитесь в правильности передаваемого ‘dump_id’. |
400 | 3502, 3602 | Ошибка в поле ‘dump_id’. Дамп с ID ‘NNNN’ не существует. Проверьте идентификатор дампа. Может быть, он был удалён или никогда и не существовал? |
400 | 3700 | Ошибка в поле ‘tag_id’. Значение не должно быть пустым. Убедитесь, что ‘tag_id’ указан в значении параметра. |
400 | 3701 | Недопустимое значение поля ‘tag_id’. Это значение должно быть целочисленным. Передавайте значение целочисленного типа в параметре ‘tag_id’. |
400 | 3800 | Ошибка в поле ‘email’. Максимальное количество одновременных запросов не должно превышать 4. Убедитесь, что количество одновременных запросов не превышает 4. |
400 | 3801 | Ошибка в поле ‘email’. Значение не должно быть пустым. Убедитесь, что поле ‘email’ заполнено. |
400 | 3802 | Ошибка в поле ‘email’. Это значение должно быть строкового типа. Используйте строку для параметра ‘email’. |
400 | 3803 | Ошибка в поле ‘email’. Превышен дневной лимит вызова метода email-validation/single. Попробуйте повторить вызов на следующий день. |
400 | 3804 | Ошибка в поле ‘headers[“Unisender-Go-Product”]’. Яндекс.Облако: недопустимый или пустой заголовок ‘Unisender-Go-Product’. Убедитесь, что заголовки переданы правильно. |
403 | 3805 | Ошибка в поле ‘headers[“Unisender-Go-Product”]’. Несоответствие тарифов Яндекс.Облака и внутренних тарифов. Убедитесь, что тарифы совпадают. |