MX Lookup API
Получайте MX-записи и почтовые данные домена через API.
Получайте MX-записи, маршрут и почтового провайдера одним запросом по домену. JSON-профиль также содержит SPF/DMARC, известные признаки домена, IP-адреса и ASN. Параметр variant=extended добавляет сведения о регистрации из реестра.
JSON-ответ сохраняет статус, источник и актуальность каждого наблюдения. Domain Intelligence не открывает SMTP-сессию, не проверяет ящик и не подтверждает подлинность письма.
GET для одного домена · Структурированный JSON · Обязательный Idempotency-Key · Общие кредиты
Запросите домен со своего сервера
Эндпоинт — GET /v1/domain/{domain}. Передайте домен в пути, учетные данные в Authorization: Bearer и обязательный Idempotency-Key. Учетные данные остаются на сервере. У запроса нет тела. Необязательный параметр variant принимает standard по умолчанию или extended.
curl -sS https://api.emvero.tech/v1/domain/example.com \
-H "Authorization: Bearer emv_your_credential" \
-H "Idempotency-Key: 3f0c9a52-6d1e-4b8e-a7f4-2c51d0e9b6aa"
example.com и значения в документации синтетические. Передавайте домен, а не email-адрес, URL или IP-адрес. Каждый запрос проверяет один домен; поддомен запрашивается как отдельный домен.
Чтобы получить сведения о регистрации, добавьте ?variant=extended. Для этой отдельной операции нужен новый ключ:
curl -sS "https://api.emvero.tech/v1/domain/example.com?variant=extended" \
-H "Authorization: Bearer emv_your_credential" \
-H "Idempotency-Key: 8c1d2e7a-4b9f-4f0e-9a3c-61e5d2b7c904"
Посмотреть полный JSON-ответ · Расширенный режим
Условный пример. Стандартный режим возвращает registration: null и billing.variant: standard. Здесь показан новый полный расширенный запрос с данными регистрации стоимостью 2 кредита.
{
"schema_version": "1",
"operation_id": "45eb36a9-b4e6-48ac-94a9-0ad145b6cf98",
"domain": "example.com",
"ascii_domain": "example.com",
"status": "complete",
"generated_at": "2026-10-02T10:00:00Z",
"mail_routing": {
"status": "routable",
"method": "mx",
"issues": [],
"meta": {
"status": "ok",
"reason": null,
"source": "dns",
"source_version": null,
"observed_at": "2026-10-02T10:00:00Z",
"expires_at": "2026-10-02T10:05:00Z",
"stale": false
}
},
"mx": {
"records": [
{
"host": "mx.example.com",
"priority": 10,
"provider_id": null
}
],
"provider_id": null,
"provider_match": "unknown",
"truncated": false,
"meta": {
"status": "ok",
"reason": null,
"source": "dns",
"source_version": "catalog:17",
"observed_at": "2026-10-02T10:00:00Z",
"expires_at": "2026-10-02T10:05:00Z",
"stale": false
}
},
"email": {
"classification": {
"disposable": false,
"public_provider": false,
"meta": {
"status": "ok",
"reason": null,
"source": "dataset",
"source_version": "bundle:example-v1",
"observed_at": null,
"expires_at": null,
"stale": false
}
},
"catch_all": {
"state": "unknown",
"provider_id": null,
"meta": {
"status": "unknown",
"reason": "not_observed",
"source": null,
"source_version": null,
"observed_at": null,
"expires_at": null,
"stale": false
}
}
},
"email_authentication": {
"spf": {
"present": true,
"syntax": "valid",
"record": "v=spf1 -all",
"all_qualifier": "fail",
"includes": [],
"redirect": null,
"evaluation": "not_performed",
"issues": [],
"meta": {
"status": "ok",
"reason": null,
"source": "dns",
"source_version": "spf-syntax:1",
"observed_at": "2026-10-02T10:00:00Z",
"expires_at": "2026-10-02T10:05:00Z",
"stale": false
}
},
"dmarc": {
"present": true,
"syntax": "valid",
"record": "v=DMARC1; p=reject",
"policy_domain": "example.com",
"inherited": false,
"published_policy": "reject",
"effective_policy": "reject",
"testing": false,
"adkim": "r",
"aspf": "r",
"evaluation": "not_performed",
"issues": [],
"meta": {
"status": "ok",
"reason": null,
"source": "dns",
"source_version": "dmarc-rfc9989:1",
"observed_at": "2026-10-02T10:00:00Z",
"expires_at": "2026-10-02T10:05:00Z",
"stale": false
}
}
},
"network": {
"mail": [
{
"host": "mx.example.com",
"priority": 10,
"addresses": [
{
"ip": "198.51.100.25",
"asn": 64500
},
{
"ip": "203.0.113.25",
"asn": 64511
},
{
"ip": "2001:db8::25",
"asn": 64500
}
]
}
],
"web": {
"host": "example.com",
"cname_chain": [],
"addresses": [
{
"ip": "198.51.100.80",
"asn": 64500
},
{
"ip": "2001:db8::80",
"asn": 64500
}
],
"truncated": false,
"edge_provider": null,
"meta": {
"status": "ok",
"reason": null,
"source": "dns",
"source_version": null,
"observed_at": "2026-10-02T10:00:00Z",
"expires_at": "2026-10-02T10:05:00Z",
"stale": false
}
},
"autonomous_systems": [
{
"asn": 64500,
"handle": "EXAMPLE-ISP",
"name": "Example Access",
"country": "DE",
"type": "isp"
},
{
"asn": 64511,
"handle": null,
"name": null,
"country": null,
"type": "unknown"
}
],
"meta": {
"status": "ok",
"reason": null,
"source": "dataset",
"source_version": "example-routing-dataset",
"observed_at": "2026-10-02T00:35:16Z",
"expires_at": null,
"stale": false
}
},
"registration": {
"registered_domain": "example.com",
"registered_at": "2020-10-02T10:00:00Z",
"age_days": 2191,
"expires_at": "2027-10-02T10:00:00Z",
"registrar": "Example Registrar",
"statuses": [
"client transfer prohibited"
],
"meta": {
"status": "ok",
"reason": null,
"source": "registry",
"source_version": "rdap.example.com",
"observed_at": "2026-10-02T10:00:00Z",
"expires_at": "2026-11-01T10:00:00Z",
"stale": false
}
},
"billing": {
"product": "domain-intelligence",
"variant": "extended",
"operation_credits": 2
}
}Прочитайте маршрут, MX и совпадение провайдера
mail_routing.status описывает маршрут домена. mx.records содержит принимающие серверы и их приоритеты. Наличие маршрута не подтверждает принятие конкретного получателя. Глоссарий MX объясняет эту DNS-запись.
mx.provider_match принимает matched, mixed, unknown или not_applicable. Если предпочтительные серверы указывают на одного известного оператора, API сообщает совпадение. Это может быть фильтрующий шлюз перед сервером ящиков. mx.truncated показывает, что список сокращен. Статья о том, как узнать почтового провайдера, разбирает ограничения такого определения.
email.classification содержит известные признаки одноразовой почты и публичного провайдера. Отрицательная классификация означает отсутствие совпадения в справочных данных, а не доказательство обратного. email.catch_all.state возвращает уже сохраненное состояние домена; этот запрос не устанавливает его новой SMTP-пробой.
email_authentication содержит поддерживаемые опубликованные данные SPF и DMARC. Их evaluation равен not_performed: API не проверяет письмо или отправителя, не ищет DKIM-ключи и не вычисляет SPF через рекурсивный обход includes. Репутация отправки и владелец домена в профиль не входят.
Прочитайте сетевые данные и регистрацию
network.mail группирует публичные IP-адреса и их asn по почтовым серверам. network.web содержит запрошенный домен, cname_chain, адреса, truncated и edge_provider. Запрос не добавляет www. и не проверяет доступность сайта по HTTP. CDN или прокси может скрывать исходный сервер.
network.autonomous_systems описывает каждый ASN через handle, name, country и type. Страна относится к регистрации сети, а не к геолокации IP. Неизвестные значения остаются null или unknown. Ошибки сетевых данных не меняют общий статус и стоимость: проверяйте network.meta и network.web.meta отдельно.
При variant=extended объект registration содержит registered_domain, registered_at, age_days, expires_at, registrar, statuses и meta. Для поддомена реестр возвращает сведения о регистрируемом родительском домене. Без даты регистрации расширенный ответ будет частичным; причину недоступности или отсутствия данных показывает registration.meta.reason. В стандартном режиме registration равен null. Возраст регистрации не подтверждает возраст компании или владение доменом.
Читайте общий статус вместе с метаданными полей
Статус профиля — complete или partial. В meta каждой части находятся статус, причина, источник, время наблюдения и срок актуальности, а также признак устаревших данных. meta.reason объясняет, почему значение не установлено. Не заменяйте исходное время наблюдения датой получения ответа.
Профиль partial может содержать пригодный маршрут, даже если дополнительное поле недоступно, устарело или сокращено. Совпадение провайдера unknown или отсутствие наблюдения catch-all сами по себе не делают весь профиль частичным. complete описывает полноту профиля, а не положительный вердикт о домене.
При отказе источника маршрута эндпоинт может вернуть 503 source_unavailable, а не предположение об отсутствии почты. Отделяйте ошибки запроса от наблюдений о домене, на которые опирается приложение.
Повторяйте запрос с тем же ключом
В течение 24 часов после завершения тот же ключ, домен и режим возвращают сохраненный ответ без изменений. Повтор не обновляет наблюдения. Использование ключа с другим доменом или режимом вызывает 409 idempotency_conflict. Если исходный запрос еще выполняется, дождитесь указанного интервала и повторите запрос с тем же ключом.
Полный standard стоит 1 общий кредит, полный extended — 2. Если стандартная часть завершена, но дата регистрации недоступна, extended стоит 1 кредит. Остальные частичные результаты, сохраненные повторы и подтвержденные отказы стоят 0. Сетевые сведения не влияют на стоимость. При повторе billing.operation_credits сохраняет исходную стоимость, а X-Credits-Charged описывает текущий запрос.
При commit_unknown или accounting_uncertain списание могло уже произойти. В ответе нет X-Credits-Charged; отсутствие заголовка не подтверждает нулевую стоимость. Повторите запрос с тем же ключом, чтобы обратиться к той же операции. Новый ключ создает новую работу.
Выберите подходящий сценарий домена
Страница Domain Intelligence в аккаунте объясняет запрос без программирования. Если нужен только ответ, может ли домен принимать почту, бесплатная проверка почтового домена решает эту более узкую задачу без аккаунта.
Проверка входных данных, полная схема ответа и обработка ошибок описаны в руководстве Domain Intelligence API. Ни один из этих двух доменных сценариев не проверяет конкретный ящик и не отправляет письма.
Вопросы
Часто спрашивают.
Какие поля домена возвращает API?
Ответ содержит маршрут, MX-серверы и приоритеты, провайдера, признаки одноразовой почты и публичного сервиса, сохраненное состояние catch-all, SPF/DMARC, IP-адреса почты и сайта, CNAME, распознанный CDN или прокси и автономные системы. Расширенный режим добавляет регистрацию. У наблюдений сохраняются источник и статус.
Подтверждает ли почтовый маршрут существование ящика?
Нет. Маршрут описывает домен. Запрос не делает SMTP-пробу и не подтверждает конкретный ящик, его владельца или будущую доставку во входящие.
Проверяет ли запрос прохождение SPF или DMARC отправителем?
Он читает опубликованные записи и поддерживаемые поля синтаксиса и политики. evaluation имеет значение not_performed. Запрос не анализирует письмо, не ищет DKIM-ключи и не проходит по SPF includes рекурсивно.
Можно ли использовать частичный профиль?
Читайте статус и метаданные нужной части. Ответ partial может содержать известный маршрут при недоступных или устаревших дополнительных сведениях. Неизвестное состояние catch-all само по себе не обязательно делает весь профиль частичным.
Сколько стоят полные запросы и повторы?
Полный standard стоит 1 общий кредит, полный extended — 2. Если стандартная часть завершена, но дата регистрации недоступна, extended стоит 1 кредит. Остальные частичные результаты, сохраненные повторы и подтвержденные отказы стоят 0. Сетевые сведения не влияют на стоимость. При повторе billing.operation_credits сохраняет исходную стоимость, а X-Credits-Charged описывает текущий запрос. При commit_unknown или accounting_uncertain списание неизвестно и этот заголовок отсутствует: повторите тот же ключ.
Подключить запрос по домену
Используйте профиль на сервере или прочитайте его в аккаунте.
Подтвердите новый аккаунт и получите 1 000 общих кредитов без карты. Полный стандартный запрос стоит 1 кредит, расширенный — 2. Если завершена только стандартная часть расширенного запроса, стоимость — 1 кредит.