# Get public invoice

Public endpoint for payers. Returns invoice details needed for payment.
No authentication required — the invoice UUID is the access token.

Endpoint: GET /public/invoices/{invoice_id}
Version: 0.27.5
Security: Auth

## Path parameters:

  - `invoice_id` (string, required)
    Unique identifier (UUID) of the invoice.

## Response 200 fields (application/json):

  - `item` (object, required)
    Public-facing invoice view for payers. Contains only information necessary
for payment — no internal IDs, no merchant notes, no metadata.
    Example: {"id":"550e8400-e29b-41d4-a716-446655440000","status":"pending","amount":{"base":"42500000","formatted":"42.5"},"received_amount":{"base":"0","formatted":"0"},"address":"0x742d35Cc6634C0532925a3b844Bc…

  - `item.id` (string, required)
    Unique identifier (UUID v4).
    Example: 550e8400-e29b-41d4-a716-446655440000

  - `item.status` (string, required)
    Current status of the invoice.
    Enum: "pending", "underpaid", "paid", "confirmed", "overpaid", "cancelled", "expired"

  - `item.amount` (object, required)
    Asset amount in base units, plus a human-readable value when we know
the token's decimals.
    Example: {"base":"1000000000","formatted":"1.0"}

  - `item.amount.base` (string, required)
    Amount in the smallest asset unit.

  - `item.amount.formatted` (string)
    Human-readable amount.

  - `item.address` (string, required)
    Blockchain address in its native format.
**Format by network**:
- **EVM**: `0x` + 40 hex chars (normalized to [EIP-55](https://eips.ethereum.org/EIPS/eip-55) checksum on import)
- **Bitcoin**: P2PKH (1...), P2SH (3...), P2WPKH (bc1...)
- **Solana**: Base58, 32-44 chars
- **Tron**: Base58, starts with `T`
    Example: 0x8521E8b15eCEF4D4269Fded3E6694225E096959E

  - `item.asset_gid` (string, required)
    Global asset identifier in [CAIP-19](https://chainagnostic.org/CAIPs/caip-19) format.
Format: `{chain_gid}/{asset_path}`
**Examples**:
- `eip155:1/slip44:60` — ETH on Ethereum
- `eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7` — USDT on Ethereum
- `eip155:56/bep20:0x55d398326f99059fF775485246999027B3197955` — USDT on BNB Smart Chain
- `tron:0x2b6653dc/trc20:TR7NHqjeKQxGTCi8q8ZY4pL8otSzgjLj6t` — USDT on Tron
- `eip155:137/erc20:0x2791Bca1f2de4661ED88A30C99A7a9449Aa84174` — USDC on Polygon
    Example: eip155:1/erc20:0xdAC17F958D2ee523a2206206994597C13D831ec7

  - `item.expires_at` (string, required)
    Payment deadline.
    Example: 2024-01-15T13:00:00Z

  - `item.created_at` (string, required)
    Timestamp when the resource was created.
    Example: 2024-01-15T10:30:00Z

  - `item.status_logs` (array, required)
    Chronological log of invoice status transitions.

  - `item.status_logs.changed_at` (string, required)
    When the status transition occurred.
    Example: 2024-01-15T12:05:00Z

  - `item.transactions` (array, required)
    Transactions detected on the invoice address since creation.

  - `item.transactions.hash` (string, required)
    Transaction hash identifier on the blockchain.
    Example: 0x1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef

  - `item.transactions.block_number` (integer, required)
    Block number/height on the blockchain.
    Example: 18500000

  - `item.transactions.is_success` (boolean, required)
    Whether the transaction executed successfully on-chain.
    Example: true

  - `item.transactions.detected_at` (string, required)
    When the transaction was first seen.
    Example: 2024-01-15T12:05:00Z

  - `item.transactions.confirmed_at` (any, required)
    When the transaction reached required confirmations. Null if not yet confirmed.
    Example: 2024-01-15T12:15:00Z

  - `item.transactions.deposits` (array, required)
    Individual token deposits received within this transaction.

  - `item.transactions.deposits.is_matched` (boolean, required)
    Whether this deposit's token matches the invoice's expected token.
    Example: true

  - `references` (object, required)
    Related objects included in the response, keyed by ID.
    Example: {"tokens":{},"blockchains":{}}

## Response 400 fields (application/problem+json):

  - `type` (string, required)
    A URI that identifies the error type.
Open it in a browser to read about this category of error.
    Example: https://docs.vilna.io/apis/problems/internal-error

  - `title` (string, required)
    A short summary of the error type.
Use `detail` for information specific to this occurrence.
    Example: Bad Request

  - `status` (integer, required)
    The HTTP status code for this error.
Matches the status code of the HTTP response.
    Example: 400

  - `detail` (string)
    A human-readable explanation of what went wrong in this specific case.
May be localized.
    Example: The address is already assigned to another invoice

  - `instance` (string)
    A URI that identifies this specific error occurrence.
Include this value when contacting support.
    Example: /errors?id=XXXXXX-xxxxx

  - `code` (string, required)
    Stable machine-readable error code (`{domain}.{reason}`) for programmatic error handling. Unlike the HTTP `status` or free-form `detail`, this code is guaranteed not to change between versions for a given error condition, so it is safe to branch on in client code. Defaults to `unspecified` when the server has not assigned a specific code.
    Example: resource.not_found

  - `fields` (array)
    List of invalid fields in the request

  - `fields.name` (string, required)
    The name of the invalid field
    Example: meta

  - `fields.reason` (string, required)
    Why this field is invalid
    Example: Exceeded maximum data size — must not exceed 1000 characters

## Response 404 fields (application/problem+json):

  - `type` (string, required)
    A URI that identifies the error type.
Open it in a browser to read about this category of error.
    Example: https://docs.vilna.io/apis/problems/internal-error

  - `title` (string, required)
    A short summary of the error type.
Use `detail` for information specific to this occurrence.
    Example: Bad Request

  - `status` (integer, required)
    The HTTP status code for this error.
Matches the status code of the HTTP response.
    Example: 400

  - `detail` (string)
    A human-readable explanation of what went wrong in this specific case.
May be localized.
    Example: The address is already assigned to another invoice

  - `instance` (string)
    A URI that identifies this specific error occurrence.
Include this value when contacting support.
    Example: /errors?id=XXXXXX-xxxxx

  - `code` (string, required)
    Stable machine-readable error code (`{domain}.{reason}`) for programmatic error handling. Unlike the HTTP `status` or free-form `detail`, this code is guaranteed not to change between versions for a given error condition, so it is safe to branch on in client code. Defaults to `unspecified` when the server has not assigned a specific code.
    Example: resource.not_found

## Response default fields (application/problem+json):

  - `type` (string, required)
    A URI that identifies the error type.
Open it in a browser to read about this category of error.
    Example: https://docs.vilna.io/apis/problems/internal-error

  - `title` (string, required)
    A short summary of the error type.
Use `detail` for information specific to this occurrence.
    Example: Bad Request

  - `status` (integer, required)
    The HTTP status code for this error.
Matches the status code of the HTTP response.
    Example: 400

  - `detail` (string)
    A human-readable explanation of what went wrong in this specific case.
May be localized.
    Example: The address is already assigned to another invoice

  - `instance` (string)
    A URI that identifies this specific error occurrence.
Include this value when contacting support.
    Example: /errors?id=XXXXXX-xxxxx

  - `code` (string, required)
    Stable machine-readable error code (`{domain}.{reason}`) for programmatic error handling. Unlike the HTTP `status` or free-form `detail`, this code is guaranteed not to change between versions for a given error condition, so it is safe to branch on in client code. Defaults to `unspecified` when the server has not assigned a specific code.
    Example: resource.not_found

