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

> ## Agent Instructions
> Money amounts are always major-unit decimal strings (e.g. "1000.00"), never floats and never minor units, in every request, response, and webhook payload.
> Authentication is OAuth 2.0 client credentials: exchange the Client ID and Client Secret at the Token URL for a 24-hour JWT and cache it; do not request a token per call.
> Set a unique clientRef on every money-moving request; it is the idempotency key, and retries return the original resource.
> Quotes are single-use, intent-locked, and expire fast: always read expiresAt, consume the quote with the executor matching its intent, and re-quote on expiry instead of retrying.
> Prefer webhooks over polling for payout, order, application, and virtual-account status tracking.
> Use the sandbox (api.sandbox.zuba.com) with its deterministic magic values before touching production.

# What this owner still needs before an account can be issued

> Answers, without issuing anything, whether a virtual account could be created right now for the request owner in the given currency — and when it could not, exactly what is outstanding and which call supplies it. Collect the answers from your customer before requesting the account, rather than discovering them from a failed request.

Branch on `ready`; read `code` on each requirement, not its prose. A null `resolution` means no API call sets that requirement: it is either a fact assessed at review or a state of the owner or the workspace. Its `description` says what clears it.



## OpenAPI

````yaml /openapi.json get /v1/virtual-accounts/requirements
openapi: 3.0.0
info:
  contact: {}
  description: >-
    Comprehensive payment platform API supporting fiat and crypto payments,
    currency conversion, and compliance management
  title: Zuba Payment Platform API
  version: '1.0'
servers: []
security: []
tags:
  - description: Manage M2M API keys and credentials
    name: API Keys
  - description: Internal ledger accounts and transactions
    name: Ledger
  - description: Handle incoming payments and deposits
    name: Pay-ins
  - description: Manage payouts, beneficiaries, and SEPA transfers
    name: Payouts
  - description: Manage outbound webhook endpoints and deliveries
    name: Webhooks
paths:
  /v1/virtual-accounts/requirements:
    get:
      tags:
        - Virtual Accounts
      summary: What this owner still needs before an account can be issued
      description: >-
        Answers, without issuing anything, whether a virtual account could be
        created right now for the request owner in the given currency — and when
        it could not, exactly what is outstanding and which call supplies it.
        Collect the answers from your customer before requesting the account,
        rather than discovering them from a failed request.


        Branch on `ready`; read `code` on each requirement, not its prose. A
        null `resolution` means no API call sets that requirement: it is either
        a fact assessed at review or a state of the owner or the workspace. Its
        `description` says what clears it.
      operationId: VirtualAccountMerchantController_getMyVirtualAccountRequirements
      parameters:
        - description: >-
            ISO-4217 currency the account would be issued in. Requirements
            differ per currency, so this is required.
          in: query
          name: currency
          required: true
          schema:
            example: USD
            type: string
        - description: >-
            ISO 3166-1 alpha-2 country the money would be collected in. Supply
            it for currencies collected in more than one country, exactly as the
            create call would; omitting it where it is needed is itself reported
            as a requirement.
          in: query
          name: country
          required: false
          schema:
            example: SN
            type: string
        - description: >-
            Optional. Names an owned sub-account (UUID) to act on. Omit to act
            at the master (tenant) level. Naming an account this key does not
            own returns 403 not_account_owner.
          in: header
          name: Zuba-Account-Id
          required: false
          schema:
            format: uuid
            type: string
      responses:
        '200':
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/VirtualAccountRequirementsResponseDto'
          description: Outstanding requirements for the request owner
        '400':
          description: Missing or malformed currency
        '401':
          description: Unauthorized
        '403':
          description: >-
            Insufficient role, or not_account_owner (Zuba-Account-Id does not
            name an account you own).
        '404':
          description: The account this request resolves to does not exist
      security:
        - bearer: []
components:
  schemas:
    VirtualAccountRequirementsResponseDto:
      properties:
        country:
          description: >-
            The country this answer was computed for, or null when none was
            given.
          example: SN
          nullable: true
          type: string
        currency:
          example: USD
          type: string
        ready:
          description: >-
            True when a create call would succeed now. The single field to
            branch on; `status` and `requirements` say why not.
          example: false
          type: boolean
        requirements:
          description: Empty when nothing is outstanding.
          items:
            $ref: '#/components/schemas/VirtualAccountRequirementDto'
          type: array
        status:
          description: >-
            `already_exists` — an account is already issued for this owner and
            currency. `action_required` — the requirements below are
            outstanding. `unavailable` — this currency is not offered to this
            owner, and no field they supply will change that.
          enum:
            - ready
            - already_exists
            - action_required
            - unavailable
          example: action_required
          type: string
      required:
        - currency
        - country
        - ready
        - status
        - requirements
      type: object
    VirtualAccountRequirementDto:
      properties:
        code:
          description: >-
            Stable identifier for what is outstanding. Branch on this; the
            description is prose and may change.
          enum:
            - business.legal_name
            - business.registration_number
            - business.country_of_incorporation
            - business.address_line1
            - business.address_city
            - business.address_country
            - business.incorporation_date
            - business.tax_id
            - business.industry_code
            - ubo.missing
            - ubo.first_name
            - ubo.last_name
            - ubo.date_of_birth
            - ubo.nationality
            - ubo.address_line1
            - ubo.address_city
            - ubo.address_country
            - ubo.national_id
            - ubo.occupation_code
            - kyb_approval_required
            - currency_not_supported
            - currency_not_entitled
            - self_serve_unsupported
            - account_not_active
            - payments_not_enabled
            - account_deactivated
            - verification_required
            - request.country
          example: business.industry_code
          type: string
        description:
          description: Human-readable explanation. Not a stable contract.
          example: The 6-digit NAICS code describing what the business does.
          type: string
        resolution:
          allOf:
            - $ref: '#/components/schemas/RequirementResolutionDto'
          description: >-
            The call that satisfies this requirement, or null when no call does.
            Null covers two cases: a fact assessed at review, which is not
            rewritable from outside and is corrected by support, and a state of
            the owner or workspace, which has no field to set. Either way,
            `description` names what clears it.
          nullable: true
          type: object
        scope:
          description: What the requirement is about, for grouping.
          enum:
            - business
            - person
            - account
            - request
          example: business
          type: string
      required:
        - code
        - scope
        - description
        - resolution
      type: object
    RequirementResolutionDto:
      properties:
        field:
          description: Request body field carrying the value.
          example: industryCode
          type: string
        method:
          enum:
            - POST
          example: POST
          type: string
        path:
          description: Path to call, with identifiers already resolved — send it as given.
          example: /v2/applications/6f1c0f5e-6f0e-4a2f-9c1e-9d0f5a2b3c4d/enrich
          type: string
      required:
        - method
        - path
        - field
      type: object
  securitySchemes:
    bearer:
      bearerFormat: JWT
      description: Enter Auth0 JWT token
      scheme: bearer
      type: http

````