Импорт и добавление контактов через Sendsay API
Sendsay API позволяет управлять базой контактов: добавлять контакты по одному, массово импортировать списки, обновлять данные существующих контактов.
Ключи данных и анкеты
Sendsay поддерживает два формата хранения данных контактов:
- Ключи данных (КД) — современный формат, используется в
member.set/member.get. Данные — произвольные ключи с любым уровнем вложенности (объекты, массивы). - Анкета-Вопрос- Ответ (АВО) — устаревший формат с привязкой к анкетам.
Ключи данных — более современный и удобный формат, с которым проще работать. Он более гибкий и поддерживает вложенные структуры.
Добавление одного контакта — member.set
Вызов member.set создаёт новый контакт или обновляет данные существующего. Работает с форматом Ключи данных (КД).
Минимальный запрос
{
"apikey": "ваш-api-ключ",
"action": "member.set",
"addr_type": "email",
"email": "test@test.com",
"datakey": [
["base.firstName", "set", "Анна"],
["base.city", "set", "Москва"]
]
}
Параметры
| Параметр | Описание |
|---|---|
action | member.set |
addr_type | Тип идентификатора: email, msisdn, viber, csid, push, vk, tg, vknotify, pushapp, id и др. Указывать его не обязательно — система сама распознаёт email или msisdn |
email | Адрес контакта (для addr_type: email) |
datakey | Массив операций над ключами данных. Каждая операция — массив: ["ключ", "режим", "значение"] или ["ключ", "режим", "значение", "тип"] |
if_exists | Поведение при существующем контакте: overwrite (по умолчанию) — обновить данные; error — вернуть ошибку; must — обновить только существующий, не создавать новый |
newbie.confirm | 1 — требовать подтверждения внесения в базу (по умолчанию 0). Используется только для email-адресов, действует лимит внесения без подтверждения |
Режимы изменения данных
| Режим | Описание |
|---|---|
set | Заменить данные новым значением |
update | Заменить, только если ключ уже существует |
insert | Добавить, только если ключа ещё нет |
merge | Объединить объекты: для каждого ключа нового значения выполняется set в существующий объект |
merge_update | Объединить объекты: заменяются только существующие ключи, новые игнорируются |
merge_insert | Объединить объекты: добавляются только отсутствующие ключи, существующие не трогаются |
push | Добавить значение в конец массива |
unshift | Добавить значение в начало массива |
delete | Удалить данные по ключу (значение не указывается) |
Каждый из режимов (кроме delete) имеет вариант с суффиксом .copy (например: set.copy, update.copy) — в этом случае вместо значения указывается ключ данных, из которого копируется значение.
Пример: задать несколько полей
{
"apikey": "ваш-api-ключ",
"action": "member.set",
"addr_type": "email",
"email": "test@test.com",
"datakey": [
["base.firstName", "set", "Анна"],
["base.lastName", "set", "Иванова"],
["base.city", "set", "Москва"],
["base.birthDate", "set", "1990-05-15", "dt:YD"]
]
}
Элемент "dt:YD" — необязательный тип данных. Для дат выполняется проверка и приведение к стандартному формату (например, "1990-5-4" станет "1990-05-04").
Добавление с указанием списка
Для управления списками используется псевдо-ключ -group.КОДГРУППЫ с режимом set и значением 1 (включить) или режимом delete (исключить):
{
"apikey": "ваш-api-ключ",
"action": "member.set",
"addr_type": "email",
"email": "test@test.com",
"datakey": [
["base.firstName", "set", "Анна"],
["-group.clients", "set", "1"],
["-group.newsletter", "set", "1"]
]
}
Обновление данных без автосоздания
Если нужно обновить данные только существующего контакта и не создавать новый, используйте if_exists: "must":
{
"apikey": "ваш-api-ключ",
"action": "member.set",
"addr_type": "email",
"email": "test@test.com",
"if_exists": "must",
"datakey": [
["member.cellphone", "set", "+79001234567"],
["loyalty_level", "set", "gold"]
]
}
Если контакта с таким адресом нет — вызов вернёт ошибку, а не создаст новый контакт.
Обновление только отсутствующих данных
Режим insert позволяет записать значение, только если ключ ещё не существует — удобно для первичного внесения данных без перезаписи:
{
"datakey": [
["base.firstName", "insert", "Неизвестный"],
["base.city", "insert", "Не указан"]
]
}
Удаление данных
{
"datakey": [
["loyalty_level", "delete"],
["-group.old_segment", "delete"]
]
}
Ответ
Успешн ый ответ:
{
"addr_type": "email",
"email": "test@test.com"
}
Все изменения в datakey применяются вместе — либо все операции выполняются, либо не одна (при любой ошибке).
Получение данных контакта — member.get
{
"apikey": "ваш-api-ключ",
"action": "member.get",
"addr_type": "email",
"email": "test@test.com",
"datakey": ["base.firstName", "base.city", "member.cellphone", "-group"]
}
В datakey перечисляются ключи, которые нужно получить.
Специальный ключ -group вернёт список групп контакта. Чтобы получить все данные, используйте "*":
{
"apikey": "ваш-api-ключ",
"action": "member.get",
"addr_type": "email",
"email": "test@test.com",
"datakey": ["*"]
}
Проверка существования контакта — member.exists
{
"apikey": "ваш-api-ключ",
"action": "member.exists",
"email": "test@test.com"
}
Ответ:
{
"list": {
"test@test.com": 1
}
}
Значение 1 — контакт существует, 0 — не существует, null — ошибка в адресе (невалидный формат).
Поиск контакта по всем типам идентификаторов — member.find
Одна и та же строка может соответствовать разным типам идентификаторов (email, csid и др.). Вызов member.find возвращает все совпадения:
{
"apikey": "ваш-api-ключ",
"action": "member.find",
"email": "test@test.com"
}
Ответ:
{
"list": [
{
"id": 12345,
"addr_type": "email",
"email": "test@test.com"
}
]
}
Информация об адресе — email.get
Запрос возвращает информацию об адресе, не связанную с существованием контакта — включая данные об ошибках доставки, стоп-листе и отписках. Работает, даже если контакт уже удалён.
{
"apikey": "ваш-api-ключ",
"action": "email.get",
"email": "test@test.com",
"with_stoplist": 2
}
Параметр with_stoplist: 2 возвращает расширенный формат стоп-листа с записями и по глобальному стоп-листу, и по отпискам от отдельных отправителей.
В ответе придёт блок member с информацией:
- номер адреса (
id), - наличие блокировки (
haslock), - ошибки доставки (
error), - статус отписки (
lockremove), - записи стоп-листа (
stoplist).
Удаление контакта — member.delete
{
"apikey": "ваш-api-ключ",
"action": "member.delete",
"addr_type": "email",
"email": "test@test.com"
}
Массовый импорт — member.import
Вызов member.import позволяет загрузить список контактов одним запросом. Адреса и данные передаются прямо в запросе через users.list или по ссылке через users.url. Параметр users.list поддерживает несколько форматов.
Формат определяется автоматически по типу значения:
- Если значение — объект → JSON-объект (АВО или КД, в зависимости от структуры
caption). - Если значение — строка ZIP с файлом workbook.xml → XLSX.
- Если значение — строка ZIP без workbook.xml → CSV (первый файл архива).
- Если значение — строка без ZIP → CSV.
При использовании users.url формат определяется по Content-Type ответа:
- если
application/json— данные должны быть объектом,