Подготавливаем страницу…
Подготавливаем страницу…
REST-эндпоинты, аутентификация, HMAC, Origin/IP whitelist, multi-form через forms_scope, коды ошибок.
https://v2.1opd.ru/api/v2get-user, см. ниже).API-KEY.API-SIGN и API-TIMESTAMP (HMAC).ok: true/false. В случае ошибки добавляется reason (на русском).Создать ключ для своего сайта → ваш ЛК 1ОПД.
Самая частая ошибка интеграторов — выпустить ключ без защиты или выбрать защиту, неподходящую под клиента (например, IP whitelist для Tilda — у посетителей разные IP). Сверьтесь с таблицей:
| Тип клиента | Ключ | Защита | Гайд |
|---|---|---|---|
| Браузерный JS — Tilda, лендинги, статичный HTML | pk_ | Origin whitelist (allowed_origins) | Открыть → |
| SPA — React / Vue / Next.js client-side | pk_ | Origin whitelist + wildcard *.domain.ru на поддомены | Открыть → |
| Server-side на static IP — VPS / bare-metal (PHP, Node, Python, WordPress hook) | sk_ | IP whitelist | Открыть → |
| Контейнеры / serverless — Docker, k8s, Cloud Run, Lambda | sk_ | HMAC-подпись | Открыть → |
| Bitrix CMS / Bitrix24 CRM (PHP-hook) | sk_ | IP whitelist (опционально + HMAC) | Открыть → |
| Параноидальный режим — фиксированный IP + защита от утечки ключа | sk_ | IP whitelist + HMAC одновременно | Открыть → |
Все запросы должны содержать заголовок API-KEY с вашим ключом из ЛК 1ОПД.
Безопасно публиковать в HTML/JS. Защита через allowed_origins. Для Tilda, WordPress JS, статичных сайтов, SPA.
Только server-side. IP whitelist или HMAC. Для PHP / Node.js / Python / Bitrix / WordPress hook.
Основной endpoint: создаёт запись согласия. Доступен для pk_ и sk_ (требует право create).
form_id (number) — ID формы. Опционально для single-form ключей, обязательно при forms_scope.hash_field (string, required) — значение поля-идентификатора (обычно email или phone).fields (array of {field, value}, required) — все поля формы.POST /api/v2/create-agreement HTTP/1.1
Host: v2.1opd.ru
API-KEY: pk_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{
"form_id": 1,
"hash_field": "user@example.com",
"fields": [
{ "field": "email", "value": "user@example.com" },
{ "field": "name", "value": "Иван Иванов" },
{ "field": "phone", "value": "+79991234567" }
]
}POST /api/v2/create-agreement HTTP/1.1
Host: v2.1opd.ru
API-KEY: pk_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
# Один ключ с forms_scope=[1,2,5] обслуживает все формы сайта.
# form_id в body выбирает конкретную форму:
{
"form_id": 2,
"hash_field": "user@example.com",
"fields": [
{ "field": "email", "value": "user@example.com" }
]
}HTTP/1.1 200 OK
Content-Type: application/json
{
"ok": true,
"hash": "a1b2c3d4e5f6...",
"created_at": "2026-05-16T10:23:11Z"
}Получить схему формы. Полезно для динамической генерации форм или валидации перед отправкой.
POST /api/v2/get-fields HTTP/1.1
Host: v2.1opd.ru
API-KEY: pk_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{ "form_id": 1 }HTTP/1.1 200 OK
Content-Type: application/json
{
"ok": true,
"form_id": 1,
"fields": [
{ "field": "email", "required": true, "hash": true },
{ "field": "name", "required": true, "hash": false },
{ "field": "phone", "required": false, "hash": false }
]
}Получить запись по hash. Требует право read. Параметры — в query-string (совместимость с v1).
POST /api/v2/get-user?API-KEY=sk_xxx&hash=a1b2c3...
# Ответ:
{
"ok": true,
"hash": "a1b2c3...",
"form_id": 1,
"fields": [
{ "field": "email", "value": "user@example.com" },
{ "field": "name", "value": "Иван Иванов" }
],
"created_at": "2026-05-16T10:23:11Z"
}Удалить запись по hash. Требует право delete. Для обработки запросов субъектов ПДн на удаление (статья 21 ФЗ-152).
POST /api/v2/delete-user HTTP/1.1
Host: v2.1opd.ru
API-KEY: sk_xxxxxxxxxxxxxxxxxxxx
Content-Type: application/json
{ "hash": "a1b2c3..." }
# Ответ:
{ "ok": true, "deleted": true }Опциональный механизм для sk_. Защищает от компрометации ключа и replay-атак.
# Псевдокод:
ts = str(int(time.time())) # unix timestamp, секунды
body_bytes = json.dumps(payload).encode() # тело как байты
secret = base64.b64decode(secret_b64) # секрет из ЛК — base64 → bytes
sign = base64.b64encode(
hmac.new(secret, ts.encode() + b"\n" + body_bytes, "sha256").digest()
).decode()
# Заголовки:
# API-KEY: sk_xxx
# API-SIGN: <base64 от HMAC>
# API-TIMESTAMP: <ts>ts + "\n" + body_bytes.base64_decode(secret_b64) — секрет хранится в base64, в HMAC подаётся как bytes.API-SIGN, API-TIMESTAMP.Для pk_. Если массив allowed_origins не пуст — проверяется заголовок Origin(или host из Referer).
https:// и порта. Например: example.com, www.example.com.*.example.com подходит для shop.example.com, но не для самого example.com.Для sk_. Список IPv4/IPv6 адресов или CIDR-сетей, с которых разрешён вызов.
curl ifconfig.me (исходящий, не входящий).10.0.0.0/24, 2001:db8::/32.У ключа можно указать forms_scope — JSON-массив form_id, с которыми он работает. Дефолтная и рекомендуемая модель для сайтов с несколькими формами:
// Ключ pk_abc с forms_scope: [1, 2, 5]
// Запрос с form_id=1 — OK
// Запрос с form_id=2 — OK
// Запрос с form_id=3 — 403 "Форма не разрешена ключом"Если forms_scope пуст — ключ single-form: form_id в body не обязателен (берётся из метаданных ключа). Если задан — form_id в body обязателен.
В случае ошибки ответ имеет вид:
{ "ok": false, "reason": "Неверный API-ключ" }| HTTP | Reason | Когда возникает |
|---|---|---|
| 401 | Неверный API-ключ | Ключа нет в базе или он отозван. |
| 401 | Подпись не совпадает | HMAC-проверка не прошла — проверьте, что байты body для подписи и для отправки идентичны. |
| 401 | Timestamp устарел | Разница между API-TIMESTAMP и серверным временем больше 300 секунд. |
| 403 | Origin не в whitelist | Заголовок Origin (или хост Referer) не совпадает ни с одним из allowed_origins ключа. |
| 403 | IP не в whitelist | Источник запроса не входит в IP-whitelist ключа (для server-side). |
| 403 | Форма не разрешена ключом | У ключа задан forms_scope, и form_id из body не входит в этот список. |
| 400 | Не указано обязательное поле hash_field | Поле hash_field отсутствует или пустое. |
| 400 | Отсутствует обязательное поле формы | В fields нет одного из полей, помеченных required в схеме формы. |
| 400 | Невалидный JSON | Тело запроса не парсится как JSON. |
| 404 | Запись не найдена | Для get-user / delete-user — по hash ничего нет. |
| 429 | Превышен rate-limit | Слишком много запросов с одного ключа. Подождите и повторите. |
Самый быстрый способ убедиться, что ключ работает — отправить запрос на create-agreement с тестовыми данными. В ЛК сразу появится новая запись. Для pk_ ключа вручную добавьте заголовок Origin с одним из разрешённых доменов — Postman сам его не подставляет.
Вопросы по API, кастомные права на ключе, кастомные интеграции — пишите на info@1opd.ru или открывайте ЛК → Интеграция — там персональные snippet'ы с уже подставленными ключами.