ГлавнаяДокументацияКалькуляторКонтактыВойти
документация api

МигКон API

Полная документация REST API для интеграции с сервисом мониторинга иностранных сотрудников. Аутентификация, управление персоналиями, проверки по реестрам и webhooks.

Открыть Swagger UIBase URL: https://api.migcon.ru

Быстрый старт

Примеры запросов к API на разных языках программирования. Скопируйте код и адаптируйте под свои нужды.

terminal
# Проверка доступности
curl https://api.migcon.ru/_ping

# Добавить персоналию
curl -X POST https://api.migcon.ru/api/v1/persons \
  -H "token: YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '[{
    "first_name": "Рашид",
    "last_name": "Алиев",
    "bday": "1990-05-15",
    "doc_num": "4512 123456",
    "doc_issued": "2015-03-20"
  }]'

# Получить данные персоналии
curl https://api.migcon.ru/api/v1/persons/PERSON_UUID \
  -H "token: YOUR_TOKEN"

# Запустить мониторинг
curl -X POST https://api.migcon.ru/api/v1/checks/start \
  -H "token: YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '["PERSON_UUID"]'

Аутентификация

Все эндпоинты API (кроме системных) требуют B2B-токен в заголовке запроса.

B2B TokenДля серверных интеграций

Передайте токен в заголовке запроса:

token: YOUR_API_TOKEN

Токен выдаётся при подключении. Запросите через info@migcon.ru

Система

/Без авторизации

Проверка доступности API и состояния компонентов системы.

GET/_pingPublic
Health-check
Response
"pong"
200API доступен
GET/_healthPublic
Состояние системы (БД + очередь)
Response
{
  "db": "ok",
  "queue": "ok"
}
200Все компоненты работают503Один или несколько компонентов недоступны

Персоналии (B2B)

/api/v1Заголовок token (B2B-токен)

CRUD-операции с персоналиями для B2B-интеграций. Авторизация через заголовок token.

POST/api/v1/personsB2B Token
Добавить персоналии (до 50 шт.)
Автоматически ставятся в очередь на первичную проверку по реестрам.
Request
[
  {
    "first_name": "Рашид",
    "last_name": "Алиев",
    "middle_name": "Маратович",
    "bday": "1990-05-15",
    "doc_num": "4512 123456",
    "doc_issued": "2015-03-20",
    "patent_series": "77",
    "patent_number": "1234567"
  }
]
Response
[
  {
    "person_id": "550e8400-...",
    "first_name": "Рашид",
    "last_name": "Алиев",
    "bday": "1990-05-15",
    "doc_num": "4512 123456",
    ...
  }
]
200Персоналии добавлены400Превышен лимит или невалидные данные
GET/api/v1/persons/{person_id}B2B Token
Получить персоналию
Response
{
  "person_id": "550e8400-...",
  "first_name": "Рашид",
  "last_name": "Алиев",
  "bday": "1990-05-15",
  "monitoring_enabled": true,
  "never_checked": false,
  "registries": {
    "rkl":    { "present": false, "checked_at": "2025-02-20T09:41Z" },
    "patent": { "present": true,  "comment": "Истекает 2025-08-12" },
    "fines":  { "present": false, "checked_at": "2025-02-20T09:41Z" }
  }
}
200Данные персоналии404Персоналия не найдена
PUT/api/v1/persons/{person_id}B2B Token
Обновить персоналию
Автоматически ставится в очередь на повторную проверку.
Request
{
  "first_name": "Рашид",
  "last_name": "Алиев",
  "bday": "1990-05-15",
  "doc_num": "4512 123456",
  "doc_issued": "2015-03-20",
  "patent_number": "7654321"
}
Response
{
  "person_id": "550e8400-...",
  "first_name": "Рашид",
  ...
}
200Обновлено
DELETE/api/v1/persons/{person_id}B2B Token
Удалить персоналию
Response
{
  "status": "deleted",
  "person_id": "550e8400-..."
}
200Удалено404Не найдена

Мониторинг (B2B)

/api/v1Заголовок token (B2B-токен)

Управление регулярным мониторингом персоналий по реестрам.

POST/api/v1/checks/startB2B Token
Запустить мониторинг
Передаётся массив UUID персоналий. Система будет периодически проверять их по реестрам.
Request
[
  "550e8400-e29b-41d4-a716-446655440000",
  "660e8400-e29b-41d4-a716-446655440001"
]
Response
{ "status": "started" }
200Мониторинг запущен
POST/api/v1/checks/stopB2B Token
Остановить мониторинг
Request
[
  "550e8400-e29b-41d4-a716-446655440000"
]
Response
{ "status": "stopped" }
200Мониторинг остановлен

Webhooks

Получайте уведомления о событиях в реальном времени на свой сервер. Вебхуки настраиваются в личном кабинете в разделе «Интеграции».

POSThttps://ваш-сервер.com/webhookВходящий
МигКон отправляет POST-запрос на указанный URL при наступлении событий. Ваш сервер должен ответить HTTP 2xx в течение 10 секунд.
URL вебхука должен использовать HTTPS. При создании вебхука вы получите секретный ключ (показывается один раз) для проверки подписи запросов.

Доступные события

СобытиеОписание
status.rklРезультат проверки по реестру контролируемых лиц
status.patentРезультат проверки патента
status.finesРезультат проверки штрафов
balance.topupПополнение баланса организации
balance.withdrawalСписание с баланса организации
test.pingТестовое событие для проверки связи

HTTP-заголовки запроса

ЗаголовокОписание
X-Webhook-SignatureHMAC-SHA256 подпись тела запроса: sha256=<hex>
X-Webhook-EventТип события (например, status.rkl)
X-Webhook-DeliveryUUID уникальной доставки
X-Webhook-TimestampUnix timestamp момента создания события
Content-Typeapplication/json

Формат тела запроса

Проверка статуса
{
  "event": "status.rkl",
  "timestamp": 1709567890,
  "data": {
    "person_id": "550e8400-e29b-41d4-a716-446655440000",
    "person_name": "Алиев Рашид",
    "registry": 1,
    "present": true,
    "comment": "Найден в реестре"
  }
}
Изменение баланса
{
  "event": "balance.topup",
  "timestamp": 1709567890,
  "data": {
    "org_id": "660e8400-...",
    "amount": 5000.00,
    "new_balance": 15000.00,
    "reason": "Пополнение по счёту №12"
  }
}

Проверка подписи (HMAC-SHA256)

Каждый запрос подписывается секретным ключом вашего вебхука. Подпись передаётся в заголовке X-Webhook-Signature. Рекомендуем проверять подпись для защиты от подделки запросов.

verify_signature.py
import hmac
import hashlib

def verify_signature(payload: bytes, signature_header: str, secret: str) -> bool:
    """Проверка подписи вебхука."""
    expected = hmac.new(
        secret.encode("utf-8"),
        payload,
        hashlib.sha256,
    ).hexdigest()
    received = signature_header.removeprefix("sha256=")
    return hmac.compare_digest(expected, received)

# Использование (Flask):
@app.route("/webhook", methods=["POST"])
def handle_webhook():
    signature = request.headers.get("X-Webhook-Signature", "")
    if not verify_signature(request.data, signature, WEBHOOK_SECRET):
        abort(401)
    data = request.get_json()
    print(f"Событие: {data['event']}, данные: {data['data']}")
    return "", 200

Повторные попытки

Если ваш сервер не вернул HTTP 2xx или не ответил в течение 10 секунд, система повторит доставку:

ПопыткаЗадержкаОписание
1СразуПервая доставка
230 секПервый повтор
32 минПоследний повтор
После 3 неудачных попыток доставка прекращается. История доставок доступна в личном кабинете в разделе «Интеграции».

Коды ошибок

Все ошибки возвращаются в формате JSON с полем detail.

{
  "detail": "Описание ошибки"
}
КодОписание
400Невалидные данные запроса
401Не авторизован (невалидный или просроченный токен)
403Доступ запрещён (недостаточно прав или аккаунт деактивирован)
404Ресурс не найден
409Конфликт (дублирование email, организации и т.д.)
429Превышен лимит (например, 2 проверки/месяц для ФЛ)
503Сервис недоступен (БД или очередь сообщений)