> ## 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.

# Token Endpoint: обмен кода и обновление | Didit

> POST /token/ обменивает PKCE-код авторизации или обновляет refresh token в Didit. Повторное использование refresh token отзывает сессию.

> [!WARNING]
>
> Аутентификация – новая функция. Эти эндпоинты обслуживаются издателем вашего приложения, например `https://<name>.auth.didit.me`, и они никогда не принимают ваш API-ключ Didit.

Токен обновления можно использовать один раз. Если отправить уже использованный токен обновления повторно, это приводит к отзыву всей сессии, поэтому для одной сессии выполняйте только одно обновление за раз и заменяйте все три токена одновременно. См. [Токены обновления](https://docs.didit.me/ru/authentication/tokens-and-jwks.md#обновление-токенов).


## OpenAPI

````yaml ru/openapi-authentication.json POST /token/
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    Серверные endpoints Didit Authentication, продукта для входа конечных
    пользователей вашего приложения. Authentication является **новым**
    продуктом, который выходит в продакшн в релизе 2026-11-01.


    ## Базовый URL


    Каждое приложение является собственным издателем (issuer) OpenID Connect, и
    каждый приведенный ниже endpoint обслуживается в корне этого издателя:


    - `https://<name>.auth.didit.me` для продакшн-приложения или
    `https://<name>.sandbox.auth.didit.me` для приложения в песочнице.

    - Ваш собственный кастомный домен после его активации. В этом случае он
    заменяет хост по умолчанию в качестве издателя: новые токены указывают его в
    `iss`, discovery указывает на него, а публичный ключ (publishable key)
    меняется. Access token, выпущенные под хостом по умолчанию, возвращают
    ошибку при вызове `/session/`, `/step-up/` и `/monitoring-token/` до тех
    пор, пока не будут обновлены.


    Продакшн и песочница являются раздельными приложениями, поэтому они
    представляют собой отдельных издателей с раздельными ключами. Публичный ключ
    состоит из префикса `pk_live_` (продакшн) или `pk_test_` (песочница), за
    которым следует base64url-кодировка издателя без паддинга и без завершающего
    слеша: декодируйте его, чтобы узнать издателя. Это публичный идентификатор,
    а не учетные данные.


    Те же JSON endpoints также обслуживаются по адресу
    `https://apx.didit.me/auth/v2/authentication/{application_id}/`. Токены
    всегда указывают издателя, описанного выше, независимо от адреса, через
    который они были выпущены.


    ## Учетные данные


    Эти endpoints никогда не принимают ваш API-ключ Didit или token консоли.


    - Discovery, JWKS и `POST /token/` не требуют учетных данных. Клиенты
    являются публичными: секрет клиента (client secret) отсутствует, а код
    авторизации привязан к верификатору PKCE (`S256`). `client_id` является
    идентификатором вашего приложения (application ID).

    - `/session/`, `/step-up/` и `/monitoring-token/` принимают access token
    пользователя: `Authorization: Bearer <access_token>`. Каждый успешный вызов
    считается активностью в сессии и сбрасывает таймаут неактивности сессии.


    ## Тела запросов


    Каждый endpoint, принимающий тело запроса, поддерживает JSON, form-encoded и
    multipart. В этом документе приведены JSON, а также form-encoded для `POST
    /token/`, как его отправляют OAuth-клиенты. Если endpoint не принимает поле,
    возвращается `400 {"<field>": "unknown_field"}`.


    ## Токены


    - **Access token**: JWT с алгоритмом ES256 и заголовком `typ: at+jwt`,
    действительный не более 5 минут и не дольше самой сессии. Утверждения:
    `AccessTokenClaims`.

    - **ID token**: JWT с алгоритмом ES256 и заголовком `typ: JWT`. Утверждения:
    `IDTokenClaims`. Он никогда не принимается в качестве access token.

    - **Refresh token**: случайная строка, которая ротируется при каждом
    использовании. Повторная отправка уже использованного refresh token приводит
    к отзыву сессии.


    Проверяйте token с помощью ключей из `GET /.well-known/jwks.json`: алгоритм
    должен быть `ES256`, `typ` должен соответствовать типу токена, `iss` должен
    совпадать с настроенным вами издателем, а `aud` с идентификатором вашего
    приложения. Офлайн-проверка распознает отозванную сессию только после
    истечения срока действия ее access token; `GET /session/` выполняет
    мгновенную проверку.


    ## Ошибки


    | Тело | Когда возвращается |

    | --- | --- |

    | `{"error": "<code>"}` | Ошибки от `POST /token/`, все со статусом `400`, в
    формате тела [RFC 6749 раздел
    5.2](https://www.rfc-editor.org/rfc/rfc6749#section-5.2): `invalid_grant`,
    `invalid_client` и Didit `mfa_required`. Ошибки сервиса:
    `temporarily_unavailable`, `monitoring_unavailable`, `monitoring_disabled`.
    |

    | `{"<field>": ["<message>"]}` или `{"<field>": "<code>"}` | Поле запроса не
    прошло валидацию. `non_field_errors` указывает на правило для нескольких
    полей, а `unknown_field` указывает на поле, которое endpoint не принимает. |

    | `{"detail": "<message>"}` | `401` (`invalid_token`), `403`
    (`origin_not_allowed`), `404` (неизвестное приложение или step-up) и `429`
    (лимит запросов). Также `400` для тела, которое невозможно распарсить (`JSON
    parse error - ...`), `405` для метода, который endpoint не поддерживает, и
    `415` для неподдерживаемого `Content-Type`. |


    Ответ `401` также содержит заголовок `WWW-Authenticate: Bearer`, а `429`
    содержит `Retry-After` в секундах.


    Два отказа не возвращают JSON. Запрос к адресу, не являющемуся издателем,
    отклоняется до попадания на эти endpoints, например, пустым ответом `404`
    для неиспользуемого имени `*.auth.didit.me`. Если `step_up_id` не является
    UUID, возвращается страница `404`.


    ## Лимиты запросов


    Запрос должен пройти два уровня проверок.


    **Лимиты endpoints**, рассчитываемые на IP-адрес клиента, на приложение и на
    endpoint:


    - Discovery и JWKS: 1 200 запросов в минуту и 12 000 в час.

    - Все остальные endpoints: 30 запросов в минуту и 300 в час. `GET` и `DELETE
    /session/` используют общий счетчик.


    Превышение лимита: `429 {"detail": "Too many requests from this IP address.
    Please wait before trying again. Expected available in 60 seconds."}`, или
    `3600 seconds` для часового лимита.


    **Защита от ботов**, применяется к каждому запросу `POST` и `DELETE`. Её
    лимитные корзины являются общими для всех запросов `POST` и `DELETE`
    приложения, включая размещённые шаги входа, и пополняются непрерывно:


    - 60 запросов в минуту на IP-адрес клиента.

    - 30 запросов в минуту на устройство для запросов, которые идентифицируют
    устройство, как это делают браузерные и нативные SDK.

    - 3 000 запросов в минуту для всего приложения со всех IP-адресов.
    Обновления токенов (`POST /token/` с `grant_type=refresh_token`) вместо
    этого используют отдельную корзину: 6 000 в минуту для всего приложения.


    Превышение корзины: `429 {"detail": "rate_limited Expected available in N
    seconds."}` (`1 second.`, когда N равно 1). Корзина на IP-адрес действует
    для всех endpoints, поэтому один адрес, отправляющий вперемешку запросы на
    получение токена, step-up и выход из системы, может исчерпать ее до
    достижения любого лимита endpoint. Корзина приложения учитывает каждого
    клиента приложения, включая браузеры.


    Оба уровня возвращают ответ до выполнения endpoint, поэтому запрос,
    получивший статус `429`, не был выполнен: повторите его по прошествии
    времени из `Retry-After`, включая запросы на обновление токена.


    ## Браузерные запросы


    Запрос, содержащий заголовок `Origin`, должен исходить из одного из
    собственных источников приложения или из списка его разрешённых источников,
    иначе он возвращает ошибку `403 origin_not_allowed`. Межсерверные запросы
    (server-to-server) не отправляют `Origin`.


    ## Не рассматривается в этом документе


    Эти маршруты обслуживают размещенные страницы, браузерные и нативные SDK, а
    также AI-агентов. Они не входят в серверный контракт, и серверные SDK их не
    вызывают:


    - Шаги входа: `POST /authorize/`, `POST /password/`, `/email/*`, `/phone/*`,
    `/password-reset/*`, `/passkeys/*`, `/mfa/*`, `/social/*` и
    `/protection/complete/`.

    - Размещенные страницы и обратные вызовы: `/sign-in`, `/magic`, `/invite`,
    `/reset`, `/verify/`, `/sso/*`, `/wallet/callback/`, `/logo/` и файлы
    ассоциации нативных приложений в `/.well-known/`.

    - Доступ для агентов: `/agents/*` и `/grants/`, включая `GET
    /agents/session/`, оперативную проверку access token AI-агента. Доступ для
    агентов не входит в эту версию контракта.

    - API управления в консоли для Authentication, принимающий сессии консоли.


    События Authentication пока не доставляются через webhook, поэтому в этом
    документе webhook не описан.
servers:
  - url: https://{issuer}
    description: 'Эмитент вашего приложения: его источник авторизации.'
    variables:
      issuer:
        default: your-app.auth.didit.me
        description: >-
          Хост эмитента: `<name>.auth.didit.me` (продакшн),
          `<name>.sandbox.auth.didit.me` (песочница) или ваш активный кастомный
          домен.
security: []
tags:
  - name: Issuer
    description: Ключи обнаружения и подписи для проверки токенов.
  - name: Tokens
    description: Гранты authorization code и refresh.
  - name: Sessions
    description: Проверить и завершить сессию, связанную с токеном доступа.
  - name: Step-ups
    description: Верификация перед выполнением конфиденциального действия.
  - name: Monitoring
    description: Учётные данные устройства для событий мониторинга транзакций.
paths:
  /token/:
    post:
      tags:
        - Tokens
      summary: Обменять код или обновить токены
      description: >-
        Endpoint для токенов для обоих типов авторизации.


        - `authorization_code` обменивает код, полученный вашим `redirect_uri`,
        на access token, ID token и refresh token. Код работает один раз в
        течение 60 секунд с верификатором PKCE и точным `redirect_uri`
        соответствующего входа. Если приложение разрешает одну сессию на
        человека, обмен завершает другие сессии пользователя.

        - `refresh_token` возвращает новый access token, ID token и refresh
        token, а отправленный вами refresh token прекращает действовать.
        **Повторная отправка использованного refresh token аннулирует сессию** и
        возвращает `invalid_grant`, поэтому выполняйте не более одного
        обновления за раз для сессии и заменяйте все три токена вместе. Если
        обновление завершилось ошибкой `400` или не получен ответ, запустите
        вход заново вместо повторной попытки: повторная попытка после успешного
        обновления считается повторным использованием токена. Ошибка `429`
        возвращается до выполнения обновления, поэтому повторить запрос после
        времени из `Retry-After` безопасно. Ошибка `503` означает, что
        обновление не произошло и refresh token все еще действителен: повторите
        попытку с увеличением интервала между попытками.


        Тело запроса может быть в формате JSON или в формате формы.
      operationId: authentication_token
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            examples:
              AuthorizationCode:
                summary: Обменять код авторизации
                value:
                  grant_type: authorization_code
                  code: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
                  code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
                  redirect_uri: https://app.example.com/auth/callback
              RefreshToken:
                summary: Обновить токены
                value:
                  grant_type: refresh_token
                  refresh_token: >-
                    N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          description: Новые token для сессии.
          headers:
            Cache-Control:
              description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
              schema:
                type: string
                example: no-store
            Pragma:
              description: Всегда `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
              examples:
                Tokens:
                  summary: token для новой сессии
                  value:
                    access_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
                    id_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
                    refresh_token: >-
                      N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
                    token_type: Bearer
                    expires_in: 299
                    session_id: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
        '400':
          description: >-
            Ошибка предоставления доступа (grant). `invalid_grant`: код или
            refresh token неизвестен, использован или истек; верификатор PKCE
            или `redirect_uri` не совпадает, либо `redirect_uri` больше не
            зарегистрирован; пользователь был заблокирован или его email больше
            не подтвержден; сессия завершилась или больше не соответствует вашей
            политике MFA; либо, для кода, вы отключили метод входа, из которого
            он был получен. Отключение метода не останавливает обновление
            сессий, которые он уже запустил. `invalid_client`: `client_id` не
            является идентификатором вашего приложения. `mfa_required`: вход не
            соответствует вашей политике MFA. Ошибки полей указывают на
            отсутствующее или недействительное поле. Тело запроса, которое
            невозможно распарсить, получает сообщение `detail`.
          headers:
            Cache-Control:
              description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
              schema:
                type: string
                example: no-store
            Pragma:
              description: Всегда `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/OAuthError'
                  - $ref: '#/components/schemas/FieldErrors'
                  - $ref: '#/components/schemas/Detail'
              examples:
                InvalidGrant:
                  summary: Код или токен обновления отклонён
                  value:
                    error: invalid_grant
                InvalidClient:
                  summary: Неверный client_id
                  value:
                    error: invalid_client
                MfaRequired:
                  summary: Политика MFA не соблюдена
                  value:
                    error: mfa_required
                MissingFields:
                  summary: Предоставление прав без обязательных полей
                  value:
                    non_field_errors:
                      - invalid_request
                UnknownGrant:
                  summary: Неподдерживаемый grant_type
                  value:
                    grant_type:
                      - '"password" is not a valid choice.'
                UnknownField:
                  summary: Поле, которое endpoint не принимает
                  value:
                    foo: unknown_field
                MalformedBody:
                  summary: Тело JSON, которое не удалось разобрать
                  value:
                    detail: >-
                      JSON parse error - Expecting property name enclosed in
                      double quotes: line 1 column 2 (char 1)
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - {}
components:
  schemas:
    TokenRequest:
      description: >-
        Один из двух грантов, определяемый параметром `grant_type`. Endpoint
        принимает поля обоих грантов и проверяет каждое полученное поле, поэтому
        запрос на обновление, также содержащий некорректный `code_verifier`,
        вернёт ошибку поля. Отправляйте только поля вашего гранта; для любого
        другого поля будет возвращено `unknown_field`.
      oneOf:
        - $ref: '#/components/schemas/AuthorizationCodeGrantRequest'
        - $ref: '#/components/schemas/RefreshTokenGrantRequest'
      discriminator:
        propertyName: grant_type
        mapping:
          authorization_code: '#/components/schemas/AuthorizationCodeGrantRequest'
          refresh_token: '#/components/schemas/RefreshTokenGrantRequest'
    TokenResponse:
      type: object
      description: token для одной сессии. Заменяйте все три вместе после обновления.
      required:
        - access_token
        - id_token
        - refresh_token
        - token_type
        - expires_in
        - session_id
      properties:
        access_token:
          type: string
          description: >-
            ES256 JWT, заголовок `typ: at+jwt`. Отправляйте его как
            `Authorization: Bearer <access_token>`. Утверждения:
            `AccessTokenClaims`.
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
          x-didit-jwt:
            header: '#/components/schemas/AccessTokenHeader'
            claims: '#/components/schemas/AccessTokenClaims'
        id_token:
          type: string
          description: >-
            ES256 JWT, заголовок `typ: JWT`, для чтения вашим приложением данных
            о том, кто выполнил вход. Никогда не отправляйте его в качестве
            токена доступа. Утверждения: `IDTokenClaims`.
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
          x-didit-jwt:
            header: '#/components/schemas/IDTokenHeader'
            claims: '#/components/schemas/IDTokenClaims'
        refresh_token:
          type: string
          description: >-
            Одноразовый. Действителен до окончания сессии, при каждом обновлении
            возвращается новый.
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        token_type:
          type: string
          enum:
            - Bearer
        expires_in:
          type: integer
          minimum: 0
          maximum: 300
          description: >-
            Количество секунд до истечения срока действия токена доступа: не
            более 300, меньше, если сессия завершится раньше.
          example: 299
        session_id:
          type: string
          format: uuid
          description: >-
            Сессия, к которой относятся эти токены; то же значение, что и в
            claim `sid`.
          example: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
    OAuthError:
      title: OAuth error
      type: object
      description: Ошибка OAuth (RFC 6749, раздел 5.2) или ошибка сервиса.
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
    FieldErrors:
      title: Field errors
      type: object
      description: >-
        Ошибки валидации по полям. Значение представляет собой список сообщений
        или один код (`unknown_field`, `invalid_redirect_uri`). Поле
        `non_field_errors` содержит ошибки правил, охватывающих несколько полей.
      additionalProperties:
        oneOf:
          - type: string
          - type: array
            items:
              type: string
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    AuthorizationCodeGrantRequest:
      title: Authorization code grant
      type: object
      description: >-
        Обменяйте код авторизации, полученный после перенаправления, на токены.
        Код можно использовать один раз в течение 60 секунд.
      required:
        - grant_type
        - code
        - code_verifier
        - redirect_uri
      properties:
        grant_type:
          type: string
          enum:
            - authorization_code
        code:
          type: string
          maxLength: 128
          description: >-
            Параметр запроса `code`, полученный вашим `redirect_uri`. Проверьте
            `state` обратного вызова перед обменом.
          example: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
        code_verifier:
          type: string
          minLength: 43
          maxLength: 128
          pattern: ^[A-Za-z0-9._~-]{43,128}$
          description: >-
            Верификатор PKCE, чей хеш S256 использовался в качестве
            `code_challenge` при входе.
          example: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
        redirect_uri:
          type: string
          maxLength: 2048
          description: >-
            Точный `redirect_uri`, с которого начался вход. Он по-прежнему
            должен быть одним из URI перенаправления приложения.
          example: https://app.example.com/auth/callback
        client_id:
          type: string
          maxLength: 64
          description: >-
            Необязательно. При отправке значение должно совпадать с
            идентификатором вашего приложения (application ID), иначе запрос
            завершится с ошибкой `invalid_client`.
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            Необязателен и принимается от стандартных клиентов OpenID Connect.
            Он никогда не расширяет то, что было предоставлено при входе.
          example: openid email
    RefreshTokenGrantRequest:
      title: Refresh token grant
      type: object
      description: >-
        Обменивает refresh token на новый access token, ID token и refresh
        token. Refresh token работает один раз: повторная отправка отзывает
        сессию, поэтому выполняйте одно обновление за раз для сессии.
      required:
        - grant_type
        - refresh_token
      properties:
        grant_type:
          type: string
          enum:
            - refresh_token
        refresh_token:
          type: string
          maxLength: 128
          description: Параметр `refresh_token` из предыдущего ответа с токеном.
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        client_id:
          type: string
          maxLength: 64
          description: >-
            Необязательно. При отправке значение должно совпадать с
            идентификатором вашего приложения (application ID), иначе запрос
            завершится с ошибкой `invalid_client`.
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            Необязателен и принимается от стандартных клиентов OpenID Connect.
            Обновление никогда не расширяет то, что содержит сессия.
          example: openid email
  responses:
    OriginNotAllowed:
      description: >-
        Запрос содержал заголовок `Origin`, который не принадлежит приложению и
        не входит в его список разрешённых источников. Серверные запросы не
        отправляют `Origin`.
      headers:
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            OriginNotAllowed:
              summary: Источник (origin) не разрешен
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        Адрес принадлежит приложению, но Authentication для него не активна; для
        адреса `apx.didit.me` идентификатор приложения неизвестен. Запрос к
        адресу, не принадлежащему ни одному приложению, отклоняется до того, как
        достигнет endpoint, и этот ответ возвращается не в формате JSON.
      headers:
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            ApplicationNotFound:
              summary: Неизвестное приложение
              value:
                detail: No Configuration matches the given query.
    RateLimited:
      description: >-
        Слишком много запросов с этого IP-адреса для данного endpoint, либо при
        вызове `POST` или `DELETE` исчерпан лимит защиты от ботов. Ничего не
        было выполнено: подождите количество секунд, указанное в `Retry-After`,
        затем повторите попытку.
      headers:
        Retry-After:
          description: Количество секунд ожидания перед повторной попыткой.
          schema:
            type: integer
            example: 60
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            RateLimited:
              summary: Лимит запросов к endpoint
              value:
                detail: >-
                  Too many requests from this IP address. Please wait before
                  trying again. Expected available in 60 seconds.
            BotProtection:
              summary: Лимит защиты от ботов (POST и DELETE)
              value:
                detail: rate_limited Expected available in 2 seconds.
    TemporarilyUnavailable:
      description: >-
        Сервис, от которого зависит запрос, временно недоступен. Повторите
        попытку с задержкой.
      headers:
        Cache-Control:
          description: 'Всегда `no-store`: никогда не кэшируйте этот ответ.'
          schema:
            type: string
            example: no-store
        Pragma:
          description: Всегда `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/OAuthError'
          examples:
            TemporarilyUnavailable:
              summary: Повторить попытку позже
              value:
                error: temporarily_unavailable

````

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