> ## Documentation Index
> Fetch the complete documentation index at: https://docs.didit.me/llms.txt
> Use this file to discover all available pages before exploring further.

# Проверка телефона: API проверки SMS-кода

> Didit API: POST /v3/phone/check/ проверяет SMS-код, оператора связи, виртуальные и временные номера. Оплата за использование, без минимума.

## Обработка сбоев у провайдера

Если провайдер телефонии временно недоступен, этот endpoint возвращает `502` со стабильным машиночитаемым кодом:

```json theme={null}
{
  "detail": "The phone verification provider is temporarily unavailable.",
  "code": "phone_provider_unavailable"
}
```

Считайте, что этот ответ допускает повторную попытку. Сделайте небольшую паузу перед повторным запросом и покажите пользователю сообщение о временной недоступности сервиса, а не просите его изменить правильный номер телефона или код.

## Дополнительная функция интеллектуального анализа

Установите `enable_enrichment` в `true`, чтобы дополнительно запустить анализ телефонного номера: оценку риска, тип линии, признак недавнего переноса номера к другому оператору и индекс доверия.
Дополнительная функция тарифицируется по \$0.05 за запрос по стандартной цене, сверх стоимости самой проверки.
Запрос возвращает `403`, если на вашем балансе недостаточно средств для её оплаты.

Четыре поля определяют, как действуют сигналы.
Каждое принимает значение `NO_ACTION` (по умолчанию) или `DECLINE`, и каждое учитывается только тогда, когда `enable_enrichment` равно `true`.

| Поле | Запрос отклоняется, когда |
| - | - |
| `phone_intelligence_score_action` | Оценка риска выше порога. |
| `phone_type_risk_action` | Номер относится к высокорисковому типу линии. |
| `recent_port_action` | Номер недавно перенесён к другому оператору. |
| `low_phone_trust_action` | Индекс доверия равен порогу или ниже него. |

При значении `NO_ACTION` сигнал всё равно возвращается в `phone.phone_intelligence`, так что вы можете применить собственное правило.


## OpenAPI

````yaml ru/openapi-25.json POST /v3/phone/check/
openapi: 3.0.0
info:
  version: 3.0.0
  title: Didit Verification API
  description: >-
    API верификации личности. Аутентификация выполняется с помощью заголовка
    x-api-key.
servers:
  - url: https://verification.didit.me
security: []
tags: []
paths:
  /v3/phone/check/:
    post:
      tags:
        - Standalone APIs
      summary: Проверить телефонный код
      description: >-
        Проверьте OTP, отправленный с помощью [`POST
        /v3/phone/send/`](/ru/standalone-apis/phone-send), и получите
        окончательный результат верификации вместе с аналитическими данными о
        номере: название оператора и тип линии, признаки виртуального (VoIP) и
        одноразового номера, а также информацию о повторном использовании номера
        в ваших сессиях.


        **Как проверка находит верификацию.** Поиск выполняется по вашему
        приложению и номеру в формате E.164 `phone_number` (`request_id` не
        передаётся во входных данных). Проверяется последняя ожидающая
        верификация, созданная за последние **5 минут**. Если такой нет (код не
        отправлялся, уже завершён или прошло более 5 минут), endpoint возвращает
        `200` со статусом `status: "Expired or Not Found"`.


        **Лимит попыток.** На каждую верификацию даётся **3 попытки ввода
        кода**. Первые два неверных кода возвращают `status: "Failed"` с
        количеством оставшихся попыток и `phone: null`; третий неверный код
        переводит верификацию в статус `Declined` с предупреждением
        `VERIFICATION_CODE_ATTEMPTS_EXCEEDED` и возвращает полный отчёт по
        номеру телефона.


        **Результаты.** `Approved`: код введён правильно, блокирующие риски
        отсутствуют. `Declined`: финальный статус: код был правильным, но
        сработал блокирующий риск (действие `DECLINE` ниже, номер из списка
        блокировки или номер высокого риска), либо был исчерпан лимит попыток.
        `Failed`: неверный код, попытки ещё остались. `Expired or Not Found`:
        нет данных для проверки. При статусах `Approved`/`Declined` параметр
        `request_id` совпадает с `request_id` отправки (идентификатором сессии),
        а объект `phone` содержит полный отчёт (`carrier`, `is_virtual`,
        `is_disposable`, `warnings`, `lifecycle`, `matches`); при статусах
        `Failed` и `Expired or Not Found` параметр `request_id` представляет
        собой одноразовый случайный UUID.


        **Действия при рисках.** Параметры `duplicated_phone_number_action`,
        `disposable_number_action` и `voip_number_action` определяют, что
        происходит при обнаружении соответствующего риска при правильном коде:
        `DECLINE` меняет итоговый статус на `Declined`; `NO_ACTION` (по
        умолчанию) фиксирует риск в `phone.warnings`, не влияя на статус.


        **Биллинг.** Сами проверки бесплатны: доставка тарифицируется на этапе
        отправки (см. [Цены на проверку
        телефона](/ru/getting-started/phone-verification-pricing)).


        **Сохранение сессии.** Завершённая проверка обновляет сессию, созданную
        при отправке (отображается в Business Console, доступна для запроса
        через `GET /v3/session/{sessionId}/decision/`), и отправляет событие
        webhook `status.updated`.


        **Песочница.** API-ключи песочницы не выполняют обработку: любой
        корректный код (от 4 до 8 цифр, включая `123456`) возвращает статический
        payload со статусом `Approved` и упрощённым плоским объектом `phone`
        (`status`, `phone_number`, `country_code`, `carrier_name`, `line_type`,
        `flags`); некорректный ввод по-прежнему возвращает `400`. Никакие данные
        не сохраняются.


        **Аутентификация.** Передавайте API-ключ вашего приложения в заголовке
        `x-api-key`. Отсутствующие или недействительные учётные данные
        возвращают `403` (`{"detail": "You do not have permission to perform
        this action."}`); этот API никогда не возвращает `401`.


        **Лимиты запросов.** Общий лимит на запись составляет 300 запросов/мин
        на API-ключ, плюс вышестоящее ограничение против злоупотреблений: 4
        попытки на один номер в час; превышение любого из них возвращает `429`.


        **Цифровой след в соцсетях.** Установите `enable_social` в `true`, чтобы
        добавить блок `phone_social`: платформы, на которых зарегистрирован этот
        номер, с количеством по категориям и доступными деталями профилей.
        Значение `profiles_registered: 0` означает, что платформы были проверены
        и номер ни на одной из них не найден - это корректный, оплачиваемый
        ответ. Блок отсутствует, если дополнение не запрашивалось или проверку
        не удалось выполнить; в этом случае плата не взимается. Биллинг
        добавляет одну единицу `phone_social` за запрос сверх стоимости самого
        endpoint.
      operationId: post_v3phone_check
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                phone_number:
                  type: string
                  maxLength: 20
                  description: >-
                    Тот же номер телефона, что использовался в соответствующем
                    вызове [`POST
                    /v3/phone/send/`](/ru/standalone-apis/phone-send), в формате
                    E.164. Именно он связывает проверку с отправкой.
                  example: '+14155552671'
                code:
                  type: string
                  minLength: 4
                  maxLength: 8
                  pattern: ^[0-9]{4,8}$
                  description: >-
                    Одноразовый код (OTP), полученный конечным пользователем.
                    Должен содержать от 4 до 8 цифр — любое другое значение
                    возвращает `400` без списания попытки. Корректно
                    сформированный, но неверный код возвращает `200` со статусом
                    `status: "Failed"` и списывает одну из 3 попыток.
                  example: '123456'
                duplicated_phone_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Что делать, если тот же номер уже использовался другим
                    пользователем (другой `vendor_data`) вашего приложения.
                    `DECLINE` меняет итоговый `status` на `Declined`;
                    `NO_ACTION` фиксирует риск в `phone.warnings` и заполняет
                    `phone.matches`.
                disposable_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, если проверка оператора связи помечает номер как
                    временный/одноразовый (`phone.is_disposable`). `DECLINE`
                    меняет итоговый `status` на `Declined`; `NO_ACTION`
                    фиксирует риск в `phone.warnings`.
                voip_number_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, если проверка оператора сообщает о виртуальном
                    типе линии — `voip`, `isp` или `vpn` (`phone.is_virtual`).
                    `DECLINE` переводит финальный `status` в `Declined`;
                    `NO_ACTION` фиксирует риск в `phone.warnings`.
                enable_enrichment:
                  type: boolean
                  default: false
                  description: >-
                    Когда `true`, также выполняет проверку номера телефона
                    (phone intelligence): оценку риска, тип линии, факт
                    недавнего переноса номера и индекс доверия. Тарифицируется
                    как одна единица `phone_intelligence_api` за запрос ($0.05
                    по прайс-листу) в дополнение к собственной цене этого
                    endpoint. Запрос возвращает `403`, если ваш баланс не может
                    покрыть списание.
                  example: false
                phone_intelligence_score_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, когда оценка риска при анализе телефона превышает
                    порог. `DECLINE` меняет итоговый `status` на `Declined`;
                    `NO_ACTION` фиксирует сигнал без отклонения. Действует
                    только тогда, когда `enable_enrichment` имеет значение
                    `true`.
                phone_type_risk_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, когда номер относится к типу линии с высоким
                    уровнем риска. `DECLINE` меняет итоговый `status` на
                    `Declined`; `NO_ACTION` фиксирует сигнал без отклонения.
                    Действует только тогда, когда `enable_enrichment` имеет
                    значение `true`.
                recent_port_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, когда номер был недавно перенесён к другому
                    оператору связи. `DECLINE` меняет итоговый `status` на
                    `Declined`; `NO_ACTION` фиксирует сигнал без отклонения.
                    Действует только тогда, когда `enable_enrichment` имеет
                    значение `true`.
                low_phone_trust_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, когда индекс доверия при анализе телефона
                    находится на уровне порога или ниже. `DECLINE` меняет
                    итоговый `status` на `Declined`; `NO_ACTION` фиксирует
                    сигнал без отклонения. Действует только тогда, когда
                    `enable_enrichment` имеет значение `true`.
                enable_social:
                  type: boolean
                  default: false
                  description: >-
                    Если true, также запрашивает цифровой след номера:
                    мессенджеры, социальные сети, площадки электронной коммерции
                    и профессиональные платформы, где он зарегистрирован.
                    Тарифицируется как одна единица `phone_social` за запрос
                    дополнительно к цене самого endpoint.
                  example: true
                phone_no_social_presence_action:
                  type: string
                  enum:
                    - NO_ACTION
                    - DECLINE
                  default: NO_ACTION
                  description: >-
                    Действие, когда проверка цифрового следа в соцсетях не
                    находит номер ни на одной из поддерживаемых платформ. В этом
                    endpoint принимаются только NO_ACTION и DECLINE; REVIEW
                    доступно в одноимённом ключе конфигурации сценария.
              required:
                - phone_number
                - code
            examples:
              Default:
                summary: Фиксировать любые риски, но никогда не отклонять автоматически
                value:
                  phone_number: '+14155552671'
                  code: '123456'
              Strict risk policy:
                summary: Автоматически отклонять VoIP и одноразовые номера
                value:
                  phone_number: '+14155552671'
                  code: '123456'
                  voip_number_action: DECLINE
                  disposable_number_action: DECLINE
      responses:
        '200':
          description: >-
            Проверка завершена — неверные коды и отсутствующие верификации также
            возвращают `200`; проверяйте `status`, а не HTTP-код. Поле `phone`
            заполняется только при финальных результатах
            (`Approved`/`Declined`), равно `null` при `Failed` и отсутствует при
            `Expired or Not Found`.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PhoneVerificationCheckResponse'
              examples:
                Approved:
                  summary: >-
                    Правильный код — полный отчёт по телефону с оператором
                    связи, жизненным циклом и совпадениями
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Approved
                    message: The verification code is correct.
                    phone:
                      status: Approved
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings: []
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: PHONE_DELIVERY_DELIVERED
                          timestamp: '2026-06-12T01:23:43.118220+00:00'
                          details:
                            channel: whatsapp
                            status: delivered
                          fee: 0
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_VERIFICATION_APPROVED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details: null
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Failed (attempts remaining):
                  summary: >-
                    Неверный код — пользователь может повторить попытку;
                    request_id здесь представляет собой одноразовый UUID
                  value:
                    request_id: 11111111-2222-3333-4444-555555555555
                    status: Failed
                    message: 'The verification code is incorrect. Attempts remaining: 2'
                    phone: null
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:21.512340+00:00'
                Declined (max attempts):
                  summary: >-
                    Третий неверный код — верификация завершена со статусом
                    «отклонена»
                  value:
                    request_id: e39cb057-92fc-4b59-b84e-02fec29a0f24
                    status: Declined
                    message: >-
                      The verification code is incorrect. Maximum attempts
                      reached.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '4155552671'
                      full_number: '+14155552671'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: AT&T
                        type: mobile
                      is_disposable: false
                      is_virtual: false
                      verification_method: whatsapp
                      verification_attempts: 1
                      verified_at: null
                      warnings:
                        - feature: PHONE
                          risk: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          additional_data: null
                          log_type: error
                          short_description: Verification code attempts exceeded
                          long_description: >-
                            The system detected that the phone number has
                            exceeded the maximum number of verification code
                            attempts.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: whatsapp
                          fee: 0.0509
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:01.118220+00:00'
                          details:
                            code_tried: '111111'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:21.512340+00:00'
                          details:
                            code_tried: '222222'
                            status: Failed
                          fee: 0
                        - type: INVALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '333333'
                            status: Failed
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VERIFICATION_CODE_ATTEMPTS_EXCEEDED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Declined (risk policy):
                  summary: >-
                    Правильный код, но линия является VoIP и
                    voip_number_action=DECLINE
                  value:
                    request_id: 7f1c9d2e-44a1-4b6e-9a3e-5b8e6f1c2d3a
                    status: Declined
                    message: The verification code is correct.
                    phone:
                      status: Declined
                      phone_number_prefix: '+1'
                      phone_number: '5005550006'
                      full_number: '+15005550006'
                      country_code: US
                      country_name: United States
                      carrier:
                        name: CLEC LLC
                        type: voip
                      is_disposable: false
                      is_virtual: true
                      verification_method: sms
                      verification_attempts: 1
                      verified_at: '2026-06-12T01:24:47.311323Z'
                      warnings:
                        - feature: PHONE
                          risk: VOIP_NUMBER_DETECTED
                          additional_data: null
                          log_type: error
                          short_description: VoIP number detected
                          long_description: >-
                            The system detected that the phone number is a VoIP
                            number, which is not allowed.
                      lifecycle:
                        - type: PHONE_VERIFICATION_MESSAGE_SENT
                          timestamp: '2026-06-12T01:23:39.580554+00:00'
                          details:
                            status: Success
                            reason: null
                            channel: whatsapp
                            actual_channel: sms
                          fee: 0.0509
                        - type: VALID_CODE_ENTERED
                          timestamp: '2026-06-12T01:24:47.311201+00:00'
                          details:
                            code_tried: '123456'
                            status: Approved
                          fee: 0
                        - type: PHONE_VERIFICATION_DECLINED
                          timestamp: '2026-06-12T01:24:47.384292+00:00'
                          details:
                            reason: VOIP_NUMBER_DETECTED
                          fee: 0
                      matches: []
                    vendor_data: user-1234
                    metadata: null
                    created_at: '2026-06-12T01:24:47.401719+00:00'
                Expired or Not Found:
                  summary: >-
                    Нет незавершённой верификации для этого номера за последние
                    5 минут
                  value:
                    request_id: 69cc35c6-280a-47a6-ab8c-4f32abc02ed0
                    status: Expired or Not Found
                    message: No pending phone verification found in the last 5 minutes.
                    vendor_data: null
                    metadata: null
                    created_at: '2026-06-12T01:24:47.311323+00:00'
        '400':
          description: >-
            Ошибка валидации — обёртка ошибок полей DRF: один массив сообщений
            на каждое некорректное поле.
          content:
            application/json:
              examples:
                Invalid code format:
                  summary: '`code` не состоит из 4–8 цифр'
                  value:
                    code:
                      - Invalid code format. Enter 4 to 8 numeric digits.
                Invalid phone number:
                  summary: '`phone_number` не является валидным номером в формате E.164'
                  value:
                    phone_number:
                      - Invalid phone number provided.
                Invalid action:
                  summary: Действия по рискам принимают только NO_ACTION или DECLINE
                  value:
                    voip_number_action:
                      - '"REVIEW" is not a valid choice.'
        '403':
          description: >-
            В доступе отказано. Возвращается, если заголовок `x-api-key`
            отсутствует; неверный, отозванный или истекший ключ возвращает
            `401`. Проверки бесплатны, поэтому проверка наличия кредитов здесь
            не выполняется.
          content:
            application/json:
              examples:
                Missing or invalid API key:
                  summary: >-
                    Отсутствует заголовок `x-api-key`, либо ключ
                    недействителен/отозван
                  value:
                    detail: You do not have permission to perform this action.
        '429':
          description: >-
            Превышен лимит запросов. Endpoint'ы POST/PATCH/DELETE делят общий
            лимит в 300 запросов на запись в минуту на один API-ключ (для
            создания транзакций и отправки событий действует отдельный лимит в
            600). Кроме того, выше по цепочке действует лимит для предотвращения
            злоупотреблений в 4 попытки верификации на один номер телефона в
            час. Ответ содержит заголовки `X-RateLimit-Limit`,
            `X-RateLimit-Remaining`, `X-RateLimit-Reset` и `Retry-After`.
            Примечание: заголовки `X-RateLimit-*`/`Retry-After` сопровождают
            только ошибку 429 при превышении лимита записи 300/мин; ошибка 429
            при превышении лимита на номер телефона не содержит заголовков
            лимитирования.
          content:
            application/json:
              examples:
                Per-number cap:
                  summary: >-
                    Более 4 попыток верификации для одного и того же номера за
                    последний час
                  value:
                    detail: >-
                      Maximum verification attempts reached for this phone
                      number. Only 4 authentication attempts are allowed per
                      hour. Try again later or use a different number.
                Write rate limit exceeded:
                  summary: Более 300 запросов на запись в текущую минуту
                  value:
                    detail: >-
                      Write request rate limit exceeded. You can make up to 300
                      requests per minute.
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '500':
          description: >-
            Непредвиденная ошибка при проверке кода вышестоящим сервисом, не
            связанная с известным сбоем провайдера. Повторная попытка безопасна;
            лимит попыток расходуется только завершёнными проверками.
          content:
            application/json:
              examples:
                Provider error:
                  summary: Не удалось завершить проверку кода
                  value:
                    detail: Error checking phone verification
              schema:
                type: object
                properties:
                  detail:
                    type: string
        '502':
          description: >-
            Провайдер проверки телефона временно недоступен: ответ с ошибкой
            5xx, таймаут или сбой подключения после встроенных повторных
            попыток. Повторить попытку безопасно: лимит попыток не расходуется.
          content:
            application/json:
              examples:
                Provider outage:
                  summary: Провайдер не ответил на запрос проверки
                  value:
                    detail: >-
                      Phone verification is temporarily unavailable. Please try
                      again shortly.
                    code: phone_provider_unavailable
              schema:
                type: object
                properties:
                  detail:
                    type: string
                  code:
                    type: string
      security:
        - ApiKeyAuth: []
      x-codeSamples:
        - lang: curl
          label: curl
          source: |-
            curl -X POST https://verification.didit.me/v3/phone/check/ \
              -H 'x-api-key: YOUR_API_KEY' \
              -H 'Content-Type: application/json' \
              -d '{
                "phone_number": "+14155552671",
                "code": "123456",
                "voip_number_action": "DECLINE"
              }'
        - lang: python
          label: Python
          source: |-
            from didit import Didit

            # Reads DIDIT_API_KEY.
            client = Didit()

            result = client.phone.check_code(
                phone_number="+14155552671",
                code="123456",
            )
            print(result)
        - lang: javascript
          label: Node.js
          source: |-
            import Didit from "@didit-protocol/sdk-node";

            // Reads DIDIT_API_KEY.
            const didit = new Didit();

            const result = await didit.phone.checkCode({
              phone_number: "+14155552671",
              code: "123456",
            });
            console.log(result);
        - lang: go
          label: Go
          source: "ctx := context.Background()\n// Reads DIDIT_API_KEY.\nclient := didit.NewClient()\n\nresult, err := client.Phone.CheckCode(ctx, didit.PhoneCheckCodeParams{\n\tPhoneNumber: \"+14155552671\",\n\tCode:        \"123456\",\n})\nif err != nil {\n\tlog.Fatal(err)\n}\nfmt.Printf(\"%+v\\n\", result)"
        - lang: java
          label: Java
          source: |-
            import me.didit.Didit;
            import me.didit.types.PhoneCheckCodeParams;

            // Reads DIDIT_API_KEY.
            Didit client = new Didit();

            var result = client.phone().checkCode(PhoneCheckCodeParams.builder()
                    .phoneNumber("+14155552671")
                    .code("123456")
                    .build());
            System.out.println(result);
        - lang: php
          label: PHP
          source: |-
            <?php

            require 'vendor/autoload.php';

            use Didit\DiditClient;

            // Reads DIDIT_API_KEY.
            $didit = new DiditClient();

            $result = $didit->phone->checkCode([
                'phone_number' => '+14155552671',
                'code' => '123456',
            ]);
            print_r($result->toArray());
        - lang: ruby
          label: Ruby
          source: |-
            require "didit"

            # Reads DIDIT_API_KEY.
            didit = Didit::Client.new

            result = didit.phone.check_code(
              phone_number: "+14155552671",
              code: "123456"
            )
            puts result.to_h
        - lang: csharp
          label: .NET
          source: >-
            using System;

            using System.Text.Json;

            using Didit;


            // Reads DIDIT_API_KEY.

            using var client = new DiditClient();


            var result = await client.Phone.CheckCodeAsync(new
            PhoneCheckCodeParams

            {
                PhoneNumber = "+14155552671",
                Code = "123456",
            });

            Console.WriteLine(JsonSerializer.Serialize(result));
components:
  schemas:
    PhoneVerificationCheckResponse:
      type: object
      properties:
        request_id:
          type: string
          format: uuid
          description: >-
            При `Approved`/`Declined`: id сессии сопоставленной верификации —
            совпадает с `request_id`, возвращаемым `POST /v3/phone/send/`. При
            `Failed` и `Expired or Not Found`: случайный разовый UUID, который
            впоследствии нельзя найти по запросу.
        status:
          type: string
          enum:
            - Approved
            - Declined
            - Failed
            - Expired or Not Found
          description: >-
            `Approved` — правильный код, отсутствуют отклоняющие риски.
            `Declined` — терминальный статус: сработал отклоняющий риск или
            исчерпан лимит попыток (3). `Failed` — неверный код, попытки ещё
            остались. `Expired or Not Found` — нет ожидающей верификации для
            этого номера за последние 5 минут.
        message:
          type: string
          description: >-
            Понятное объяснение результата, включая количество оставшихся
            попыток после неверного ввода кода.
        phone:
          type: object
          nullable: true
          description: >-
            Полный отчёт по номеру телефона. Присутствует (не null) только при
            финальных результатах (`Approved`/`Declined`); `null` при `Failed` и
            отсутствует при `Expired or Not Found`.
          properties:
            status:
              type: string
              enum:
                - Approved
                - Declined
                - In Review
                - Not Finished
                - Expired
              description: >-
                Финальный статус проверки телефона. Совпадает со значением
                `status` верхнего уровня для завершённых проверок.
            phone_number_prefix:
              type: string
              description: Телефонный код страны со знаком `+` в начале (например, `+1`).
              example: '+1'
            phone_number:
              type: string
              description: Национальный номер без телефонного кода страны.
              example: '4155552671'
            full_number:
              type: string
              description: Полный номер в формате E.164.
              example: '+14155552671'
            country_code:
              type: string
              nullable: true
              description: Код страны номера по стандарту ISO 3166-1 alpha-2.
              example: US
            country_name:
              type: string
              description: Полное название страны, полученное из `country_code`.
              example: United States
            carrier:
              type: object
              description: >-
                Текущая сеть, обслуживающая номер, полученная в результате
                проверки оператора при завершении.
              properties:
                name:
                  type: string
                  description: >-
                    Название оператора связи. Пустая строка, если при поиске не
                    удалось его определить.
                type:
                  type: string
                  description: >-
                    Тип линии, возвращённый поиском: `mobile`, `fixed_line`,
                    `voip`, `isp`, `vpn`, `toll_free`, `premium_rate`, `pager`,
                    `payphone`, `satellite`, `service`, `shared_cost`,
                    `short_codes_commercial`, `calling_cards`, `local_rate`,
                    `universal_access`, `voice_mail`, `other` или `unknown`.
            is_disposable:
              type: boolean
              description: >-
                `true`, если номер принадлежит сервису временных/одноразовых
                номеров.
            is_virtual:
              type: boolean
              description: >-
                `true`, если тип линии является виртуальным (`voip`, `isp` или
                `vpn`).
            verification_method:
              type: string
              description: >-
                Канал, через который был фактически доставлен OTP после
                подтверждения доставки (например, `whatsapp`, `sms`); до этого
                момента указывается запрошенный канал.
            verification_attempts:
              type: integer
              description: >-
                Количество отправок OTP для этой верификации (1 или 2 после
                повторной попытки).
            verified_at:
              type: string
              format: date-time
              nullable: true
              description: >-
                Когда был введён правильный код. `null`, если верификация так и
                не была одобрена.
            warnings:
              type: array
              description: >-
                Предупреждения о рисках, зафиксированные в ходе верификации
                (дубликат, одноразовый, VoIP, превышение попыток, список
                блокировки и т. д.). Пустой массив, если предупреждений нет.
              items:
                type: object
                properties:
                  feature:
                    type: string
                    description: Функция, вызвавшая предупреждение. Здесь всегда `PHONE`.
                  risk:
                    type: string
                    description: Машиночитаемый код риска.
                  additional_data:
                    type: object
                    nullable: true
                    description: >-
                      Контекст конкретного риска (например, ID дублированной
                      сессии для рисков дублирования). `null`, если риск не
                      содержит дополнительных данных.
                  log_type:
                    type: string
                    enum:
                      - error
                      - warning
                      - information
                    description: >-
                      Уровень серьёзности. Риски со значением `error` отклоняют
                      верификацию, `warning` отправляет её на проверку,
                      `information` фиксируется без влияния на статус.
                  short_description:
                    type: string
                    description: >-
                      Краткая сводка риска в одну строку в понятном человеку
                      формате.
                  long_description:
                    type: string
                    description: Понятное объяснение риска.
            lifecycle:
              type: array
              description: >-
                Хронологический журнал аудита верификации. Значение `type`
                события является одним из `PHONE_VERIFICATION_MESSAGE_SENT`,
                `PHONE_VERIFICATION_RETRY_MESSAGE_SENT`,
                `PHONE_VERIFICATION_BLOCKED`, `PHONE_DELIVERY_DELIVERED`,
                `PHONE_DELIVERY_UNDELIVERABLE`, `VALID_CODE_ENTERED`,
                `INVALID_CODE_ENTERED`, `PHONE_VERIFICATION_APPROVED`,
                `PHONE_VERIFICATION_DECLINED`, `PHONE_VERIFICATION_IN_REVIEW`,
                `PHONE_VERIFICATION_EXPIRED`.
              items:
                type: object
                properties:
                  type:
                    type: string
                    description: Тип события.
                  timestamp:
                    type: string
                    format: date-time
                    description: Когда событие произошло.
                  details:
                    type: object
                    nullable: true
                    description: >-
                      payload, специфичный для события. События отправки:
                      `{status, reason, channel, actual_channel}`
                      (`actual_channel` заполняется после подтверждения
                      доставки). События доставки: `{channel, status}`. События
                      ввода кода: `{code_tried, status}`. События финального
                      статуса: `null`, или `{reason}`, если отклонена или на
                      проверке.
                  fee:
                    type: number
                    description: >-
                      Сумма в USD, списанная за это событие. Отлична от нуля
                      только для событий отправки (цена доставки); 0 для ввода
                      кода, подтверждений доставки и событий статуса.
            matches:
              type: array
              description: >-
                Другие сессии вашего приложения (KYC, KYB или API), где тот же
                номер телефона использовался другим пользователем (другой
                `vendor_data`). До 5 записей, сначала совпадение со
                сгенерированной записью из списка блокировки, если оно есть
                (совпадения на основе сессий сохраняют порядок запроса). Пустой
                массив при отсутствии совпадений.
              items:
                type: object
                properties:
                  session_id:
                    type: string
                    format: uuid
                    description: >-
                      ID сессии другой верификации, в которой использовался этот
                      номер телефона.
                  session_number:
                    type: integer
                    description: Понятный порядковый номер этой сессии.
                  vendor_data:
                    type: string
                    nullable: true
                    description: '`vendor_data` этой сессии.'
                  verification_date:
                    type: string
                    description: Когда была создана эта сессия (`YYYY-MM-DDTHH:MM:SSZ`).
                  phone_number:
                    type: string
                    description: Совпавший номер телефона.
                  status:
                    type: string
                    description: >-
                      Статус этой сессии (например, `Approved`, `Declined`, `In
                      Progress`).
                  is_blocklisted:
                    type: boolean
                    description: >-
                      Находится ли номер телефона в списке блокировки вашего
                      приложения.
                  api_service:
                    type: string
                    nullable: true
                    description: >-
                      Для сессий типа API: отдельный API, создавший её
                      (например, `PHONE_VERIFICATION`); `null` для обычных
                      сессий верификации.
                  source:
                    type: string
                    description: >-
                      Где было найдено совпадение. Обычно `session`; попадание в
                      список блокировки через запись в списке организации
                      добавляет в начало синтетическое совпадение с `source:
                      "list_entry"` и со значениями null для
                      `session_id`/`session_number`.
            phone_social:
              $ref: '#/components/schemas/PhoneSocialFootprint'
            phone_intelligence:
              allOf:
                - $ref: '#/components/schemas/PhoneIntelligence'
              description: >-
                Аналитические сигналы по номеру телефона. Присутствуют только в
                том случае, если в проверке параметр `enable_enrichment` был
                равен `true`.
        vendor_data:
          type: string
          nullable: true
          description: >-
            `vendor_data` сессии совпавшей верификации. `null` при `Expired or
            Not Found`.
        metadata:
          type: object
          nullable: true
          description: >-
            `metadata` сессии совпавшей верификации. `null` при `Expired or Not
            Found`.
        created_at:
          type: string
          format: date-time
          description: Временная метка ответа на эту проверку.
    PhoneSocialFootprint:
      type: object
      nullable: true
      description: >-
        Цифровой след номера телефона: онлайн-платформы, на которых он
        зарегистрирован. Присутствует, только если был задан параметр
        `enable_social` и проверка завершилась. Любое количество может быть
        null, если данные по нему не были возвращены. `profiles_registered: 0`
        означает, что платформы были проверены и номер телефона не найден ни на
        одной из них: это валидный, тарифицируемый ответ и частый признак
        синтетической личности.
      properties:
        profiles_registered:
          type: integer
          nullable: true
          description: Платформы, где подтверждена регистрация номера телефона.
          example: 5
        profiles_checked:
          type: integer
          nullable: true
          description: Платформы, проверенные на наличие регистрации.
          example: 14
        names_found:
          type: integer
          nullable: true
          description: Платформы, вернувшие связанное имя.
          example: 0
        photos_found:
          type: integer
          nullable: true
          description: Платформы, вернувшие фото профиля.
          example: 0
        communication_breadth:
          type: integer
          nullable: true
          description: Коммуникационные платформы с обнаруженным присутствием.
          example: 2
        digital_footprint_diversity:
          type: integer
          nullable: true
          description: Уникальные категории платформ с обнаруженным присутствием.
          example: 5
        digital_sophistication_index:
          type: integer
          nullable: true
          description: Составной индикатор цифровой зрелости, 0-10.
          example: 5
        engagement_depth_index:
          type: integer
          nullable: true
          description: Индикатор заполненности профиля, 0-10.
          example: 3
        subscription_affordability_index:
          type: integer
          nullable: true
          description: Соотношение бесплатных и платных платформ, 0-10.
          example: 2
        free_platforms:
          type: integer
          nullable: true
          description: Регистрации на бесплатных платформах.
          example: 4
        full_paid_platforms:
          type: integer
          nullable: true
          description: Регистрации на полностью платных платформах.
          example: 0
        partial_paid_platforms:
          type: integer
          nullable: true
          description: Регистрации на freemium-платформах.
          example: 1
        whatsapp_profile_completeness:
          type: string
          nullable: true
          enum:
            - Basic
            - Partial
            - Complete
            - Not Present
            - null
          description: >-
            Полнота профиля WhatsApp. Только для телефона; null для электронной
            почты.
          example: Partial
        registered_platforms:
          type: array
          description: Платформы, где подтверждена регистрация.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        not_registered_platforms:
          type: array
          description: Платформы, проверенные с отрицательным результатом.
          items:
            $ref: '#/components/schemas/SocialFootprintPlatform'
        categories:
          type: object
          description: Количество регистраций и их соотношение по категориям платформ.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintCategorySummary'
        profiles:
          type: object
          description: >-
            Сведения о профиле на платформе, сгруппированные по платформам, если
            платформа их предоставляет.
          additionalProperties:
            $ref: '#/components/schemas/SocialFootprintProfile'
    PhoneIntelligence:
      type: object
      description: >-
        Нормализованный блок аналитики телефона. Присутствует только в том
        случае, если для этого поиска запускалось дополнение для аналитики; если
        он присутствует, то также доступен под псевдонимом `enrichment` с
        идентичными значениями.
      properties:
        score:
          type: number
          nullable: true
          description: Нормализованная оценка риска от 0 до 100. Чем выше, тем выше риск.
        phone_type_risk:
          type: string
          nullable: true
          description: '`Low`, `Medium` или `High`, вычисляется на основе оценки.'
        phone_trust_index:
          type: number
          nullable: true
          description: >-
            Обратная оценка, для панелей управления, где предпочтительнее
            принцип «чем выше, тем лучше».
        network_stability_index:
          type: number
          nullable: true
          description: Стабильность сети телефонной линии.
        is_disposable:
          type: boolean
          nullable: true
          description: '`true`, если номер выглядит одноразовым или виртуальным.'
        is_ported:
          type: boolean
          nullable: true
          description: '`true`, если номер был перенесён к другому оператору связи.'
        is_recently_ported:
          type: boolean
          nullable: true
          description: '`true`, если перенос номера произошёл недавно.'
        carrier_type:
          type: string
          nullable: true
          description: Классификация линии, возвращённая поиском (например, `mobile`).
        reason_codes:
          type: array
          items:
            type: object
            properties:
              code:
                type: string
                description: >-
                  Постоянный идентификатор сигнала Didit, например
                  `IR-5AC67A32`. Непрозрачный: группируйте и фильтруйте по нему,
                  не парсите его.
              value:
                nullable: true
                description: >-
                  Для флага риска (например, `voip`, `leaked`, `disposable`,
                  `spam_trap`), его значение: логическое значение, уровень или
                  дата. Null для скорингового кода причины.
              direction:
                type: string
                enum:
                  - risk
                  - trust
                description: Повысил ли сигнал риск или повысил уровень доверия.
              message:
                type: string
                description: Понятное объяснение сигнала на английском языке.
              impact_level:
                type: string
                nullable: true
                description: >-
                  Насколько сильно сигнал повлиял на скоринг, например `low`,
                  `medium` или `high`.
          description: >-
            Сигналы, объясняющие оценку, каждый с фиксированным кодом Didit,
            направлением, сообщением и уровнем влияния. Со временем могут
            появляться новые коды, поэтому не отклоняйте неизвестные коды.
    SocialFootprintPlatform:
      type: object
      properties:
        platform:
          type: string
          description: Идентификатор платформы.
          example: whatsapp
        category:
          type: string
          description: >-
            Категория платформы, например: MESSAGING, SOCIAL_MEDIA, ECOMMERCE,
            PROFESSIONAL, EMAIL_PROVIDER.
          example: MESSAGING
        scope:
          type: string
          enum:
            - global
            - local
          description: '`global` для глобальных платформ, `local` для региональных.'
          example: global
    SocialFootprintCategorySummary:
      type: object
      properties:
        registered:
          type: integer
          nullable: true
          description: Платформы этой категории, где подтверждена регистрация.
          example: 2
        ratio:
          type: number
          format: float
          nullable: true
          description: >-
            Доля проверенных платформ категории с наличием регистрации, от 0.0
            до 1.0.
          example: 0.6667
    SocialFootprintProfile:
      type: object
      properties:
        name:
          type: string
          nullable: true
          description: Имя профиля, если платформа его предоставляет.
        photo:
          type: string
          nullable: true
          description: URL фотографии профиля, если платформа её предоставляет.
        about:
          type: string
          nullable: true
          description: Текст «о себе»/биография профиля, если платформа его предоставляет.
        privacy_status:
          type: string
          nullable: true
          enum:
            - PUBLIC
            - PRIVATE
            - null
          description: Видимость профиля, если платформа её предоставляет.
        business_account:
          type: boolean
          nullable: true
          description: >-
            Является ли профиль бизнес-аккаунтом, если платформа раскрывает эту
            информацию.
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: >-
        API-ключ вашего приложения из раздела «Разработчикам» -> «API-ключи» в
        Business Console. Основной ключ имеет полный доступ. Именованный ключ
        может иметь ограниченную область действия: без доступа, чтение или
        запись для каждого ресурса, ограничение определенными сценариями или
        одобренными сессиями, списком IP-адресов и сроком действия. 401
        означает, что ключ неверен, отозван или его срок действия истек; 403
        означает, что ключ не был передан, у ключа нет доступа к этому ресурсу
        или действию, либо запрос поступил с адреса вне его списка IP-адресов;
        404 на маршруте сессии означает, что сессия не входит в сценарии или
        статусы ключа. Ключ без доступа к медиа получает URL изображений, видео
        и PDF как null, а ключ без прав на запись сессий получает ссылки на
        сессии и токены как null. См. https://docs.didit.me/console/api-keys.

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.