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

# Get an account

> Returns one account together with every funding and payout detail issued for it. This is the only read that includes `details`; the list endpoint does not.

## Error codes

| Status | `code` | Cause |
| - | - | - |
| `400` | `validation_failed` | The identifier is not a ULID. |
| `401` | `INVALID_API_KEY` | The key is missing, invalid, inactive, expired, from the other environment, or blocked by its IP allowlist. |
| `404` | `account_not_found` | No such account for this business. Internal platform balances are never visible, and a closed account still is. |
| `429` | `api_key_rate_limit_exceeded` | The per-minute limit for this key was exceeded. |


## OpenAPI

````yaml /openapi.json get /v1/accounts/{accountId}
openapi: 3.1.0
info:
  title: Sakawave Business API
  version: 1.0.0-draft
  summary: >-
    Accounts, transfers, FX quotes, and transaction reconciliation for Sakawave
    businesses.
  description: >-
    Generated from the public NestJS controllers and their Zod request schemas.
    Public URLs and policy statements remain draft until the Phase 1 contract
    checklist is approved.
  contact:
    name: Sakawave API Support
    email: api-support@sakawave.example
servers:
  - url: https://sandbox-api.sakawave.example
    description: Sandbox (default)
  - url: https://api.sakawave.example
    description: Live
security:
  - bearerAuth: []
tags:
  - name: Bill payments
    description: Browse the biller catalog, validate a customer, and pay a bill.
  - name: Cards
    description: Issue, fund, and control USD virtual and disposable cards.
  - name: eSIM
    description: >-
      Sell mobile data abroad: browse the catalog, buy an eSIM, and manage it
      once installed.
  - name: Currencies and countries
    description: >-
      Reference data: what may be held, what may be sent where, and which
      jurisdictions are served.
  - name: Customers
    description: Create and manage customers of your business.
  - name: Accounts
    description: >-
      Open business and customer accounts, and issue the destinations that fund
      them.
  - name: Transfer destinations
    description: Resolve temporary destinations and saved recipients.
  - name: FX quotes
    description: Create and retrieve time-limited cross-currency quotes.
  - name: Transfers
    description: Preview, create, and monitor transfers.
  - name: Transactions
    description: Read ledger entries for reconciliation.
paths:
  /v1/accounts/{accountId}:
    get:
      tags:
        - Accounts
      summary: Get an account
      description: >-
        Returns one account together with every funding and payout detail issued
        for it. This is the only read that includes `details`; the list endpoint
        does not.
      operationId: getAccount
      parameters:
        - name: accountId
          in: path
          required: true
          description: Account ULID.
          schema:
            $ref: '#/components/schemas/Ulid'
      responses:
        '200':
          description: Successful response.
          headers:
            X-Request-ID:
              description: >-
                The request identifier assigned by Sakawave. Include it in
                support requests.
              schema:
                type: string
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AccountWithDetails'
              example:
                id: 01K2Z3AB4D5E6F7G8H9JKMNPQR
                name: Ada NGN wallet
                type: operational
                category: fiat
                status: active
                currency: NGN
                balance: '2500000'
                balanceFormatted: '25000.00'
                tag: AA0271849366
                canDebit: true
                canCredit: true
                isWalletAccount: true
                transferReady: true
                customerId: 01K2Z3AB4C5D6E7F8G9HJKMNPQ
                metadata:
                  cohort: sandbox-tutorial
                closedAt: null
                closureReason: null
                createdAt: '2026-08-14T09:02:00.000Z'
                updatedAt: '2026-08-14T09:02:00.000Z'
                details:
                  - account:
                      id: 01K2Z3AB4D5E6F7G8H9JKMNPQR
                      currency: NGN
                      name: Collections
                    beneficiary:
                      name: Ada Okafor
                      address: null
                    details:
                      id: 01K2Z3AB4P5Q6R7S8TVWXYZABC
                      type: bank_account
                      domestic:
                        accountNumber: '0123456789'
                        routingNumber: null
                        sortCode: null
                        bankName: Example Bank
                        bankAddress: null
                      international: null
                      wallet: null
                      paymentRails: []
                      providerBacked: true
                      createdAt: '2026-08-14T09:03:00.000Z'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/AuthenticationError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '500':
          $ref: '#/components/responses/ServerError'
      security:
        - bearerAuth: []
components:
  schemas:
    Ulid:
      type: string
      minLength: 26
      maxLength: 26
      pattern: ^[0-7][0-9A-HJKMNP-TV-Z]{25}$
      example: 01K2Z3AB4C5D6E7F8G9HJKMNPQ
      description: A 26-character ULID.
    AccountWithDetails:
      type: object
      additionalProperties: false
      properties:
        id:
          $ref: '#/components/schemas/Ulid'
        name:
          type: string
          description: Your own label for the account. Not shown to anyone paying into it.
        type:
          type: string
          enum:
            - operational
            - savings
            - settlement
            - collection
            - fee
            - revenue
            - suspense
          description: >-
            What the account is for. `operational` and `savings` behave
            identically; the rest are platform-managed.
        category:
          type: string
          enum:
            - fiat
            - crypto
          description: Follows from the currency; it is never chosen.
        status:
          type: string
          enum:
            - active
            - inactive
            - frozen
            - closed
          description: >-
            Only `active` can move money. `frozen` is a compliance or provider
            hold. `closed` is terminal.
        currency:
          $ref: '#/components/schemas/AssetCode'
        balance:
          $ref: '#/components/schemas/MinorUnits'
        balanceFormatted:
          type: string
          description: The same figure rendered for display. Never use it in a calculation.
        tag:
          type: string
          pattern: ^[A-Z]{2}\d{10}$
          description: >-
            The account’s public transfer handle: two letters and ten digits,
            the last a check digit. Platform-minted and unique across Sakawave,
            so another business can pay this account by tag.
        canDebit:
          type: boolean
          description: >-
            Whether money may leave. Held separately from status: an account can
            be stopped in one direction only.
        canCredit:
          type: boolean
          description: Whether money may arrive.
        isWalletAccount:
          type: boolean
          description: >-
            True when the account belongs to one of your customers rather than
            to your business.
        transferReady:
          type: boolean
          description: >-
            True once the account is bound to a payment provider. A freshly
            opened account is false until its first detail is issued, and cannot
            yet send or receive externally.
        customerId:
          anyOf:
            - $ref: '#/components/schemas/Ulid'
              description: The owning customer, when this is a wallet account.
            - type: 'null'
        metadata:
          anyOf:
            - type: object
              additionalProperties: true
              description: >-
                Whatever you stored at creation, returned unchanged. Sakawave
                never reads it.
            - type: 'null'
        closedAt:
          anyOf:
            - $ref: '#/components/schemas/IsoTimestamp'
            - type: 'null'
        closureReason:
          anyOf:
            - type: string
              enum:
                - client_request
                - no_longer_needed
                - duplicate
                - compliance
            - type: 'null'
        createdAt:
          $ref: '#/components/schemas/IsoTimestamp'
        updatedAt:
          $ref: '#/components/schemas/IsoTimestamp'
        details:
          type: array
          items:
            $ref: '#/components/schemas/AccountDetail'
      required:
        - id
        - name
        - type
        - category
        - status
        - currency
        - balance
        - balanceFormatted
        - tag
        - canDebit
        - canCredit
        - isWalletAccount
        - transferReady
        - customerId
        - metadata
        - closedAt
        - closureReason
        - createdAt
        - updatedAt
        - details
    AssetCode:
      type: string
      enum:
        - NGN
        - USD
        - GBP
        - EUR
        - GHS
        - ZAR
        - UGX
        - CAD
        - MXN
        - AED
        - BTC
        - ETH
        - USDT
        - USDC
    MinorUnits:
      type: string
      pattern: ^-?\d+$
      example: '2500000'
      description: >-
        An integer number of the asset’s smallest unit. Use this value for
        arithmetic.
    IsoTimestamp:
      type: string
      format: date-time
      example: '2026-08-14T09:00:00.000Z'
    AccountDetail:
      type: object
      additionalProperties: false
      properties:
        account:
          type: object
          additionalProperties: false
          properties:
            id:
              $ref: '#/components/schemas/Ulid'
              description: >-
                The account this detail funds. After a `202`, this is how you
                match the `account.detail.created` webhook to your account.
            currency:
              type: string
              description: The account’s currency.
            name:
              type: string
              description: Your label for the account.
          required:
            - id
            - currency
            - name
        beneficiary:
          type: object
          additionalProperties: false
          properties:
            name:
              anyOf:
                - type: string
                  description: >-
                    The name a payer sends to: the account holder as the bank
                    knows them.
                - type: 'null'
            address:
              anyOf:
                - type: string
                  description: >-
                    The account holder’s address, for corridors that ask for
                    one, such as a USD wire.
                - type: 'null'
          required:
            - name
            - address
        details:
          type: object
          additionalProperties: false
          properties:
            id:
              $ref: '#/components/schemas/Ulid'
            type:
              type: string
              enum:
                - bank_account
                - mobile_money
                - wallet_address
              description: >-
                Follows from the account’s category. A fiat account gets a bank
                destination; a crypto account gets an on-chain address.
            domestic:
              anyOf:
                - type: object
                  additionalProperties: false
                  properties:
                    accountNumber:
                      type: string
                      description: >-
                        The destination itself: a NUBAN, a handle, or a local
                        account number. Publish this to whoever is funding the
                        account.
                    routingNumber:
                      anyOf:
                        - type: string
                          description: >-
                            ABA routing number, for a USD account. Null
                            elsewhere.
                        - type: 'null'
                    sortCode:
                      anyOf:
                        - type: string
                          description: UK sort code, for a GBP account. Null elsewhere.
                        - type: 'null'
                    bankName:
                      anyOf:
                        - type: string
                          description: >-
                            The issuing institution, when the provider names
                            one.
                        - type: 'null'
                    bankAddress:
                      anyOf:
                        - type: string
                          description: The issuing institution’s address.
                        - type: 'null'
                  required:
                    - accountNumber
                    - routingNumber
                    - sortCode
                    - bankName
                    - bankAddress
                  description: >-
                    What a payer in the account’s own currency zone sends to.
                    Present for every bank and mobile-money destination; null
                    for an on-chain address.
                - type: 'null'
            international:
              anyOf:
                - type: object
                  additionalProperties: false
                  properties:
                    iban:
                      anyOf:
                        - type: string
                          description: The IBAN, where the account has one.
                        - type: 'null'
                    swiftCode:
                      anyOf:
                        - type: string
                          description: The SWIFT/BIC an international wire is sent to.
                        - type: 'null'
                    accountNumber:
                      type: string
                    sortCode:
                      anyOf:
                        - type: string
                        - type: 'null'
                    bankName:
                      anyOf:
                        - type: string
                        - type: 'null'
                    bankAddress:
                      anyOf:
                        - type: string
                          description: >-
                            The issuing institution’s address, which an
                            international wire asks for.
                        - type: 'null'
                  required:
                    - iban
                    - swiftCode
                    - accountNumber
                    - sortCode
                    - bankName
                    - bankAddress
                  description: >-
                    What a payer abroad sends to. Present only when the account
                    was issued an IBAN or SWIFT code; null for NGN and USD.
                - type: 'null'
            wallet:
              anyOf:
                - type: object
                  additionalProperties: false
                  properties:
                    chain:
                      anyOf:
                        - type: string
                          description: >-
                            The network the address is on, such as
                            `BASE_MAINNET`.
                        - type: 'null'
                    address:
                      type: string
                      description: The on-chain address.
                  required:
                    - chain
                    - address
                  description: Present only for a stablecoin account.
                - type: 'null'
            paymentRails:
              type: array
              items:
                type: string
              description: >-
                How the destination can be paid into, such as `ach_push` or
                `wire`. Empty when the provider does not say.
            providerBacked:
              type: boolean
              description: >-
                Whether an integration issued this destination. Which one stays
                private; only an issued destination can be reconciled against
                inbound funds.
            createdAt:
              $ref: '#/components/schemas/IsoTimestamp'
          required:
            - id
            - type
            - domestic
            - international
            - wallet
            - paymentRails
            - providerBacked
            - createdAt
      required:
        - account
        - beneficiary
        - details
    RequestError:
      anyOf:
        - $ref: '#/components/schemas/ValidationError'
        - $ref: '#/components/schemas/Error'
      description: >-
        Either a field-level validation failure carrying an errors array, or a
        rule the request broke, identified by code.
    Error:
      type: object
      additionalProperties: true
      properties:
        statusCode:
          type: integer
        message:
          type: string
          description: >-
            A sentence suitable for a log or a support conversation, not for a
            user interface.
        code:
          type: string
          description: >-
            The stable machine-readable reason. Branch on this, never on the
            message.
      required:
        - message
        - code
      description: >-
        An error body. Individual errors may add context fields alongside these
        three.
    RateLimitError:
      type: object
      additionalProperties: false
      properties:
        statusCode:
          const: 429
        message:
          type: string
        code:
          const: api_key_rate_limit_exceeded
        retryAfterSeconds:
          type: integer
          minimum: 1
      required:
        - statusCode
        - message
        - code
        - retryAfterSeconds
    ValidationError:
      type: object
      additionalProperties: false
      properties:
        statusCode:
          const: 400
        message:
          type: string
          description: The single failure, or a count when more than one field failed.
        code:
          const: validation_failed
        errors:
          type: array
          items:
            $ref: '#/components/schemas/ValidationFailure'
      required:
        - statusCode
        - message
        - code
        - errors
    ValidationFailure:
      type: object
      additionalProperties: false
      properties:
        message:
          type: string
        field:
          type: string
        code:
          type: string
        path:
          type: array
          items:
            anyOf:
              - type: string
              - type: integer
      required:
        - message
        - field
        - code
        - path
  responses:
    ValidationError:
      description: >-
        The request was rejected before it was acted on. Field failures list
        every failing field.
      headers:
        X-Request-ID:
          description: >-
            The request identifier assigned by Sakawave. Include it in support
            requests.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RequestError'
          example:
            statusCode: 400
            message: Must be a valid identifier.
            code: validation_failed
            errors:
              - message: Must be a valid identifier.
                field: accountId
                code: custom
                path:
                  - accountId
    AuthenticationError:
      description: >-
        The API key is missing, invalid, inactive, expired, for another
        environment, or blocked by its IP allowlist.
      headers:
        X-Request-ID:
          description: >-
            The request identifier assigned by Sakawave. Include it in support
            requests.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            statusCode: 401
            code: INVALID_API_KEY
            message: Invalid or inactive API credentials.
    NotFoundError:
      description: The requested resource was not found for this business.
      headers:
        X-Request-ID:
          description: >-
            The request identifier assigned by Sakawave. Include it in support
            requests.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            statusCode: 404
            code: resource_not_found
            message: Resource not found.
    RateLimitError:
      description: The API key rate limit was exceeded.
      headers:
        X-Request-ID:
          description: >-
            The request identifier assigned by Sakawave. Include it in support
            requests.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/RateLimitError'
          example:
            statusCode: 429
            message: Too many API requests. Try again later.
            code: api_key_rate_limit_exceeded
            retryAfterSeconds: 17
    ServerError:
      description: An unexpected server error occurred.
      headers:
        X-Request-ID:
          description: >-
            The request identifier assigned by Sakawave. Include it in support
            requests.
          schema:
            type: string
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            statusCode: 500
            code: internal_server_error
            message: An unexpected error occurred.
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: Sakawave API key
      description: >-
        A secret API key, sent as `Authorization: Bearer sk_test_…` in sandbox
        or `Bearer sk_live_…` in live.

````

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