Web API v1.65
Прокрутите вниз для просмотра примеров кода, а также примеров запросов и ответов. Выберите закладку с нужным языком примера кода, либо сделайте выбор языка с помощью мобильного меню.
Все методы 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. |
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()