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

# Perform a retry (V1 API)

> This page presents how to perform a retry with our Legacy API, V1.

<Warning>
  The V1 API is **deprecated**. Starting November 1st 2025, no support will be provided for the V1 API and it will be **removed by April 2026**. No new features nor functionality will be added to the V1 API. Please use the [V2 Verify API](/verify/v2/documentation/introduction) instead. For more information refer to the [V2 Migration Guide](/verify/v2/documentation/v2-migration-guide).
</Warning>

<Info>
  **V2 equivalent:** In V2, retries are handled by replaying the same [Create or retry a verification](/verify/v2/api-reference/create-or-retry-a-verification) request within the verification window. There is no dedicated retry endpoint.
</Info>

<Warning>
  #### **This endpoint is not required anymore**.

  Retries are now handled automatically for all apps created after *2024-05-22*. You can still use this endpoint if you prefer to have more control over user retries.

  ##### **How automatic retries work**

  Automatic retries use the **Stateless Mode**. It systematically re-uses an existing authentication flow if one is found and is not expired.

  <Frame caption="Stateless mode">
    <img style={{height: 300, borderRadius: 8}} src="https://mintcdn.com/ding/Oh9xTmLZLfeVDwbL/images/stateless-mode.svg?fit=max&auto=format&n=Oh9xTmLZLfeVDwbL&q=85&s=a504266ba88dfbe7369f530510e4aef7" alt="Dashboard screenshot" width="1043" height="544" data-path="images/stateless-mode.svg" />
  </Frame>
</Warning>


## OpenAPI

````yaml post /retry
openapi: 3.1.0
info:
  title: Ding
  version: 1.0.0
  description: >-
    The OTP API allows you to send authentication codes to your users using
    their phone numbers. The V1 API is **deprecated**. Technical support will
    end by **October 2025** and will be **removed by April 2026**. No new
    features and functionality will be added to the V1 API.
  contact:
    email: support@prelude.so
servers:
  - url: https://api.ding.live/v1
    description: The production Ding API server
security:
  - APIKey: []
tags:
  - name: OTP
    description: Send OTP codes to your users using their phone numbers.
  - name: Lookup
    description: Retrieve up-to-date metadata about a specific phone number
paths:
  /retry:
    post:
      tags:
        - OTP
      summary: Perform a retry
      description: Perform a retry if a user has not received the code.
      operationId: retry
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/RetryAuthenticationRequest'
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RetryAuthenticationResponse'
        '400':
          description: Bad Request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorResponse'
      deprecated: true
components:
  schemas:
    RetryAuthenticationRequest:
      type: object
      required:
        - customer_uuid
        - authentication_uuid
      properties:
        customer_uuid:
          type: string
          format: uuid
          description: >-
            Your customer UUID, which can be found in the API settings in the
            dashboard.
        authentication_uuid:
          type: string
          format: uuid
          description: >-
            The authentication UUID that was returned when you created the
            authentication.
    RetryAuthenticationResponse:
      type: object
      properties:
        authentication_uuid:
          type: string
          format: uuid
          description: The UUID of the corresponding authentication.
        status:
          type: string
          description: |
            The status of the retry. Possible values are:
              * `approved` - The retry was approved and a new code was sent.
              * `denied` - The retry was denied.
              * `no_attempt` - No attempt was sent yet, so a retry cannot be completed.
              * `rate_limited` - The authentication was rate limited and cannot be retried.
              * `expired_auth` - The authentication has expired and cannot be retried.
              * `already_validated` - The authentication has already been validated.
          examples:
            - approved
          enum:
            - approved
            - denied
            - no_attempt
            - rate_limited
            - expired_auth
            - already_validated
        created_at:
          type: string
          format: date-time
        next_retry_at:
          type: string
          format: date-time
          description: The time at which the next retry will be available.
        remaining_retry:
          type: integer
          minimum: 0
          examples:
            - 3
          description: The number of remaining retries.
    ErrorResponse:
      type: object
      properties:
        code:
          type: string
          examples:
            - invalid_phone_number
          description: A machine-readable code that describes the error.
          enum:
            - account_invalid
            - app_realm_require_device_type
            - bad_request
            - blocked_number
            - internal_server_error
            - invalid_app_realm
            - invalid_app_version
            - invalid_auth_uuid
            - invalid_device_id
            - invalid_device_model
            - invalid_line
            - invalid_os_version
            - invalid_phone_number
            - invalid_sender_id
            - invalid_template_id
            - negative_balance
            - no_associated_auth_found
            - suspended_account
            - unauthorized_sender_id
            - unsupported_app_realm_device_type
            - unsupported_region
        message:
          type: string
          examples:
            - +0 is not a valid phone number
          description: A human-readable message that describes the error.
        doc_url:
          type: string
          description: A link to the documentation that describes the error.
          examples:
            - >-
              https://docs.prelude.so/verify/v1/documentation/errors#invalid_phone_number
  securitySchemes:
    APIKey:
      name: x-api-key
      type: apiKey
      in: header
      x-speakeasy-example: YOUR_API_KEY

````