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

# Create verification

> Creates a Travel Rule verification case for a known wallet address.

Use this endpoint when the wallet address is known before a specific product flow needs to continue.




## OpenAPI

````yaml /api-reference/openapi_v3_pws.json post /v1/users/{user_id}/travel-rule/verifications
openapi: 3.1.0
info:
  title: Payward Services API
  description: >-
    The Payward Services (PWS) public API.


    PWS exposes Swaps (institutional FX-style trading), Conversion rules
    (rule-driven fiat ↔ crypto value movement), retail-style Quotes and Price
    Trigger Swaps, end-user Users / Verifications, Travel Rule address ownership
    verification, Funds (deposits, withdrawals, addresses, transactions),
    Portfolio, Earn, Reports, Webhooks, and Ramp (hosted fiat-to-crypto on-ramp
    checkout).


    All requests must be authenticated. All monetary values are decimal strings;
    all timestamps are ISO 8601 UTC. List endpoints are cursor-paginated. Errors
    follow a uniform shape (see `*ErrorResponse` schemas).
  version: v1
  contact:
    name: Payward Services API Support
    url: https://docs.payward.com
    email: api-support@payward.com
servers:
  - url: https://api.services.payward.com
    description: Production
security:
  - ApiKey: []
    ApiSign: []
    ApiNonce: []
tags:
  - name: Users
    description: >-
      Users and headless-user onboarding flows that the partner manages.


      - **Create User** provisions a user with full identity verification fields
      collected up front.

      - **Create Headless User** provisions a lightweight user when your
      licensing agreement allows you to manage KYC data outside Payward.

      - **Get User** retrieves the user's profile, verification status, and
      required actions.

      - **Update User** updates user profile fields and may re-trigger
      verification.


      Use the returned user `id` for calls that require the user's identifier.
  - name: Assets
    description: >-
      Catalog of assets available on the platform with retail-display metadata
      (logos, market data, descriptions).
  - name: Conversion rules
    description: >-
      Rule-driven fiat ↔ crypto value movement, including conversion rules and
      deposits.
  - name: Earn
    description: >-
      Manage auto-earn preferences and retrieve allocation and reward
      information.
  - name: Funds
    description: >-
      Deposits, withdrawals, addresses, methods, and the consolidated
      funding-transactions ledger.
  - name: Portfolio
    description: End-user portfolio summary, history, and transaction views.
  - name: Price Trigger Swaps
    description: Limit-style orders that execute when a configured price trigger is met.
  - name: On-chain Swaps
    description: >-
      Wallet-funded onchain quote trading for xStock and USDC pairs. On-chain
      quotes settle on-chain through the Payward on-chain proxy contract.
  - name: Ramp
    description: >-
      Hosted fiat-to-crypto on-ramp checkout: country / fiat / payment-method /
      cryptocurrency-asset discovery, transaction limits and prospective quotes,
      and the hosted checkout URL.
  - name: Reports
    description: Settlement and reconciliation reports for the partner.
  - name: Swaps
    description: >-
      Direct partner-to-Payward swap quotes and executions (institutional
      FX-style trading).
  - name: Travel Rule Verifications
    description: Travel Rule address ownership verification flows.
  - name: Verifications
    description: Identity verification (KYC) submission and status for end users.
  - name: Webhooks
    description: Manage webhook subscriptions for asynchronous event delivery.
paths:
  /v1/users/{user_id}/travel-rule/verifications:
    parameters:
      - $ref: '#/components/parameters/UserIdPath'
    post:
      tags:
        - Travel Rule Verifications
      summary: Create verification
      description: >
        Creates a Travel Rule verification case for a known wallet address.


        Use this endpoint when the wallet address is known before a specific
        product flow needs to continue.
      operationId: createTravelRuleVerification
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateTravelRuleVerificationBody'
            examples:
              hosted-wallet:
                summary: Hosted wallet verification
                value:
                  address: '0x8ba1f109551bD432803012645Ac136ddd64DBA72'
                  method: hosted_declaration
              self-hosted-wallet:
                summary: Self-hosted wallet verification
                value:
                  address: '0x8ba1f109551bD432803012645Ac136ddd64DBA72'
                  method: self_attestation
                  evidence:
                    ownership_confirmed: true
                    two_factor_completed: true
                    two_factor_method: otp
                    attestation_text: >-
                      In accordance with Payward's Terms of Service, I, customer
                      {userID}, confirm that the wallet address {wallet-address}
                      is a self-hosted wallet owned and controlled solely by me.
                      I make this declaration on {date}, and it applies to all
                      deposits and withdrawals between this wallet and my
                      account.
                    user_confirmed_at: '2026-06-23T10:00:00Z'
      responses:
        '201':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/CreateTravelRuleVerificationEnvelope'
              examples:
                hosted-wallet-verified:
                  summary: Hosted wallet verified
                  value:
                    data:
                      verification_id: ver_0195e4d2-a4d0-7b12-8f4a-123456789abc
                      wallet_type: hosted
                      method: hosted_declaration
                      status: verified
                self-hosted-wallet-verified:
                  summary: Self-hosted wallet verified
                  value:
                    data:
                      verification_id: ver_0195e4d2-a4d0-7b12-8f4a-123456789abc
                      wallet_type: self_hosted
                      method: self_attestation
                      status: verified
        '400':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BadRequestError'
              examples:
                invalid-request:
                  summary: Invalid request
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      causes:
                        - field: address
                          message: must be a valid address for the selected network
                      status: 400
                      code: bad_request
        '401':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnauthenticatedError'
              examples:
                authentication-failed:
                  summary: Authentication failed
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: unauthenticated
                      status: 401
        '403':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ForbiddenError'
              examples:
                caller-is-not-allowed:
                  summary: Caller is not allowed
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: forbidden
                      status: 403
        '409':
          description: The verification conflicts with the current Travel Rule state.
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/WalletTypeMismatchError'
                  - $ref: '#/components/schemas/VerificationNotEnabledError'
                  - $ref: '#/components/schemas/SatoshiTestRequiredError'
                  - $ref: '#/components/schemas/VerificationRejectedError'
              examples:
                wallet-type-mismatch:
                  summary: Wallet type conflicts with the existing verification
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: wallet_type_mismatch
                      status: 409
                verification-not-enabled:
                  summary: Verification is not enabled
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: verification_not_enabled
                      status: 409
                satoshi-test-required:
                  summary: A Satoshi test is required
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: satoshi_test_required
                      status: 409
                verification-rejected:
                  summary: Verification was rejected
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: verification_rejected
                      status: 409
        '429':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
            Retry-After:
              $ref: '#/components/headers/RetryAfter'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ResourceExhaustedError'
              examples:
                rate-limit-exceeded:
                  summary: Rate limit exceeded
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: resource_exhausted
                      status: 429
        '500':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/InternalError'
              examples:
                internal-error:
                  summary: Internal error
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: internal
                      status: 500
        '503':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/UnavailableError'
              examples:
                service-unavailable:
                  summary: Service unavailable
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: unavailable
                      status: 503
        '504':
          description: ''
          headers:
            Request-Id:
              $ref: '#/components/headers/RequestId'
            X-RateLimit-Limit:
              $ref: '#/components/headers/RateLimitLimit'
            X-RateLimit-Remaining:
              $ref: '#/components/headers/RateLimitRemaining'
            X-RateLimit-Reset:
              $ref: '#/components/headers/RateLimitReset'
            Strict-Transport-Security:
              $ref: '#/components/headers/StrictTransportSecurity'
            X-Content-Type-Options:
              $ref: '#/components/headers/XContentTypeOptions'
            Content-Security-Policy:
              $ref: '#/components/headers/ContentSecurityPolicy'
            Cache-Control:
              $ref: '#/components/headers/CacheControl'
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/DeadlineExceededError'
              examples:
                request-deadline-exceeded:
                  summary: Request deadline exceeded
                  value:
                    error:
                      type: travel_rule_error
                      instance: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
                      code: deadline_exceeded
                      status: 504
      security:
        - ApiKey: []
          ApiSign: []
          ApiNonce: []
components:
  parameters:
    UserIdPath:
      in: path
      name: user_id
      required: true
      description: >-
        ID of the user the request applies to. For partners operating in the
        B2B2C model, this is the Sub-User the request is acting on behalf of.
      schema:
        $ref: '#/components/schemas/UserId'
      example: AA45N8G4MLDYWAR7
  schemas:
    CreateTravelRuleVerificationBody:
      description: Request to create a hosted declaration or self-attestation verification.
      oneOf:
        - $ref: '#/components/schemas/HostedDeclarationVerificationBody'
        - $ref: '#/components/schemas/SelfAttestationVerificationBody'
      discriminator:
        propertyName: method
        mapping:
          hosted_declaration:
            $ref: '#/components/schemas/HostedDeclarationVerificationBody'
          self_attestation:
            $ref: '#/components/schemas/SelfAttestationVerificationBody'
    CreateTravelRuleVerificationEnvelope:
      description: Response returned after creating a Travel Rule verification case.
      type: object
      required:
        - data
      properties:
        data:
          description: Travel Rule verification case.
          allOf:
            - $ref: '#/components/schemas/TravelRuleVerification'
    BadRequestError:
      description: Request validation failed or the request could not be processed.
      allOf:
        - $ref: '#/components/schemas/PwsValidationErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsValidationError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 400
                    code:
                      type: string
                      enum:
                        - bad_request
    UnauthenticatedError:
      description: Authentication credentials are missing, invalid, or not accepted.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 401
                    code:
                      type: string
                      enum:
                        - unauthenticated
    ForbiddenError:
      description: The authenticated caller is not allowed to perform this operation.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 403
                    code:
                      type: string
                      enum:
                        - forbidden
    WalletTypeMismatchError:
      description: >-
        The wallet address already has a verification with a different wallet
        type.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 409
                    code:
                      type: string
                      enum:
                        - wallet_type_mismatch
    VerificationNotEnabledError:
      description: Travel Rule address verification is not enabled for the user.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 409
                    code:
                      type: string
                      enum:
                        - verification_not_enabled
    SatoshiTestRequiredError:
      description: >-
        The address requires a Satoshi test and cannot use a weaker verification
        method.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 409
                    code:
                      type: string
                      enum:
                        - satoshi_test_required
    VerificationRejectedError:
      description: Travel Rule rejected the submitted verification.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 409
                    code:
                      type: string
                      enum:
                        - verification_rejected
    ResourceExhaustedError:
      description: The request was rate limited or a resource quota was exhausted.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 429
                    code:
                      type: string
                      enum:
                        - resource_exhausted
    InternalError:
      description: An unexpected server-side error occurred.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 500
                    code:
                      type: string
                      enum:
                        - internal
    UnavailableError:
      description: The service is temporarily unavailable.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 503
                    code:
                      type: string
                      enum:
                        - unavailable
    DeadlineExceededError:
      description: The upstream service did not complete the request before the deadline.
      allOf:
        - $ref: '#/components/schemas/PwsGeneralErrorEnvelope'
        - type: object
          required:
            - error
          properties:
            error:
              allOf:
                - $ref: '#/components/schemas/PwsGeneralError'
                - type: object
                  required:
                    - status
                    - code
                  properties:
                    status:
                      type: integer
                      format: int32
                      enum:
                        - 504
                    code:
                      type: string
                      enum:
                        - deadline_exceeded
    UserId:
      type: string
      description: Canonical identifier for a user in the Payward public API.
      minLength: 14
      maxLength: 42
    HostedDeclarationVerificationBody:
      description: Request to verify a hosted wallet through a hosted declaration.
      type: object
      additionalProperties: false
      required:
        - address
        - method
      properties:
        address:
          description: Wallet address to verify.
          type: string
          minLength: 1
          maxLength: 256
        method:
          description: Hosted declaration discriminator.
          type: string
          enum:
            - hosted_declaration
    SelfAttestationVerificationBody:
      description: Request to verify a self-hosted wallet through self-attestation.
      type: object
      additionalProperties: false
      required:
        - address
        - method
        - evidence
      properties:
        address:
          description: Wallet address to verify.
          type: string
          minLength: 1
          maxLength: 256
        method:
          description: Self-attestation discriminator.
          type: string
          enum:
            - self_attestation
        evidence:
          description: >-
            Evidence that the user confirmed ownership and completed
            partner-side two-factor authentication.
          allOf:
            - $ref: '#/components/schemas/SelfAttestationEvidence'
    TravelRuleVerification:
      description: Travel Rule verification case for a wallet address.
      type: object
      required:
        - verification_id
        - wallet_type
        - status
      properties:
        verification_id:
          description: Stable PWS identifier for the verification case.
          type: string
          minLength: 1
          maxLength: 64
        wallet_type:
          description: Type of wallet being verified.
          allOf:
            - $ref: '#/components/schemas/VerificationWalletType'
        method:
          description: >-
            Verification method submitted or started for this case, when one has
            been selected.
          allOf:
            - $ref: '#/components/schemas/TravelRuleVerificationMethod'
        status:
          description: Current verification status.
          allOf:
            - $ref: '#/components/schemas/TravelRuleVerificationStatus'
        created_at:
          description: Time at which PWS created the verification case projection.
          allOf:
            - $ref: '#/components/schemas/DateTime'
        updated_at:
          description: Time at which PWS last updated the verification case projection.
          allOf:
            - $ref: '#/components/schemas/DateTime'
    PwsValidationErrorEnvelope:
      description: Error envelope for request validation failures.
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/PwsValidationError'
    PwsValidationError:
      description: Standard PWS API error object for request validation failures.
      type: object
      required:
        - type
        - status
        - instance
        - code
      properties:
        type:
          description: Machine-readable error class.
          type: string
        status:
          description: HTTP status code returned for this error.
          type: integer
          format: int32
        instance:
          description: Request identifier for this specific error occurrence.
          type: string
        code:
          description: Stable machine-readable error code.
          type: string
        doc_url:
          description: Optional link to documentation for this error.
          type: string
          format: uri
        causes:
          description: Validation failures that contributed to the error.
          type: array
          items:
            $ref: '#/components/schemas/PwsErrorCause'
    PwsGeneralErrorEnvelope:
      description: Error envelope for operational or domain failures.
      type: object
      required:
        - error
      properties:
        error:
          $ref: '#/components/schemas/PwsGeneralError'
    PwsGeneralError:
      description: Standard PWS API error object for non-validation failures.
      allOf:
        - $ref: '#/components/schemas/PwsErrorBase'
        - type: object
          properties:
            causes:
              description: Additional error details, when present.
              type: array
              items:
                type: object
                additionalProperties: true
    SelfAttestationEvidence:
      description: Partner-collected evidence supporting a self-hosted wallet verification.
      type: object
      required:
        - ownership_confirmed
        - two_factor_completed
        - two_factor_method
        - attestation_text
        - user_confirmed_at
      properties:
        ownership_confirmed:
          description: Whether the user confirmed that they own or control the wallet.
          type: boolean
        two_factor_completed:
          description: >-
            Whether the partner confirmed that the user completed two-factor
            authentication.
          type: boolean
        two_factor_method:
          description: Two-factor authentication method completed by the user.
          allOf:
            - $ref: '#/components/schemas/TwoFactorMethod'
        attestation_text:
          description: Ownership statement confirmed by the user.
          type: string
          minLength: 1
          maxLength: 4096
        user_confirmed_at:
          description: Time at which the user confirmed the ownership statement.
          allOf:
            - $ref: '#/components/schemas/DateTime'
    VerificationWalletType:
      description: Wallet type for the verification case.
      type: string
      enum:
        - hosted
        - self_hosted
    TravelRuleVerificationMethod:
      description: Verification method for the case.
      type: string
      enum:
        - hosted_declaration
        - self_attestation
    TravelRuleVerificationStatus:
      description: >-
        Partner-facing proactive verification status. Pending is reserved for
        recovery when the Travel submission outcome is uncertain.
      type: string
      enum:
        - pending
        - verified
        - failed
    DateTime:
      type: string
      format: date-time
      description: A RFC 3339 datetime
      example: '2023-03-13T12:34:56Z'
    PwsErrorCause:
      description: A single request validation failure.
      type: object
      required:
        - field
        - message
      properties:
        field:
          description: Dot-notation path to the offending request field.
          type: string
        message:
          description: Human-readable explanation of the failed validation rule.
          type: string
    PwsErrorBase:
      description: Common fields present on every PWS API error object.
      type: object
      required:
        - type
        - status
        - instance
        - code
      properties:
        type:
          description: Machine-readable error class.
          type: string
        status:
          description: HTTP status code returned for this error.
          type: integer
          format: int32
        instance:
          description: Request identifier for this specific error occurrence.
          type: string
        code:
          description: Stable machine-readable error code.
          type: string
        doc_url:
          description: Optional link to documentation for this error.
          type: string
          format: uri
    TwoFactorMethod:
      description: Partner-side two-factor authentication method completed by the user.
      type: string
      enum:
        - otp
        - passkey
  headers:
    RequestId:
      description: >-
        Unique identifier for tracing this request across services. Include in
        support tickets.
      schema:
        type: string
        format: uuid
        example: 5f4d2a8e-91a4-4d6c-8a17-9b1e2c3f4a5b
    RateLimitLimit:
      description: Total requests allowed in the current window.
      schema:
        type: integer
        example: 1000
    RateLimitRemaining:
      description: Requests remaining in the current window.
      schema:
        type: integer
        example: 955
    RateLimitReset:
      description: Unix timestamp (seconds) when the rate-limit window resets.
      schema:
        type: integer
        format: int64
        example: 1713182400
    StrictTransportSecurity:
      description: >-
        Enforces HTTPS for the configured period. Always `max-age=63072000;
        includeSubDomains; preload`.
      schema:
        type: string
        example: max-age=63072000; includeSubDomains; preload
    XContentTypeOptions:
      description: Disables MIME sniffing. Always `nosniff`.
      schema:
        type: string
        enum:
          - nosniff
        example: nosniff
    ContentSecurityPolicy:
      description: >-
        Prevents embedding and resource loading. Always `default-src 'none';
        frame-ancestors 'none'`.
      schema:
        type: string
        example: default-src 'none'; frame-ancestors 'none'
    CacheControl:
      description: Prevents caching of sensitive financial data. Always `no-store`.
      schema:
        type: string
        enum:
          - no-store
        example: no-store
    RetryAfter:
      description: Seconds the client should wait before retrying.
      schema:
        type: integer
        example: 30
  securitySchemes:
    ApiKey:
      type: apiKey
      name: API-Key
      in: header
      description: Your public API key. Identifies the partner making the request.
    ApiSign:
      type: apiKey
      name: API-Sign
      in: header
      description: HMAC signature over the request, computed with your private key.
    ApiNonce:
      type: apiKey
      name: API-Nonce
      in: header
      description: Monotonically increasing nonce included in the request signature.

````