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

# Retrieve an Invoice

> Fetch a single invoice by id.

## Overview

Use this endpoint to fetch an invoice by id. Prefer using `expand` to request any related fields you need in one call.

## Authentication

* Merchant server auth: `x-api-key` or `Authorization: Bearer <jwt>`

## Request

### SDK

```ts theme={null}
const invoice = await pepay.invoices.retrieve('550e8400-e29b-41d4-a716-446655440000', {
  expand: ['latest_payment', 'payments'],
  payments_limit: 10
});
```

### cURL

```bash theme={null}
INVOICE_ID="550e8400-e29b-41d4-a716-446655440000"

curl "https://api-beta.pepay.io/api/v1/invoices/$INVOICE_ID?expand=latest_payment,payments&payments_limit=10" \
  -H "x-api-key: sk_live_..."
```

## Response

```json theme={null}
{
  "object": "invoice",
  "id": "550e8400-e29b-41d4-a716-446655440000",
  "merchant_id": 123,
  "status": "unpaid",
  "invoice_type": "standard",
  "currency": "usd",
  "amount": 49990,
  "amount_decimal": "49.990",
  "amount_unit": "usd_millis",
  "environment": "devnet",
  "expires_at": 1766322000,
  "created_at": 1766318400,
  "metadata": {
    "order_id": "ORD-123"
  }
}
```

## Errors

* `400` invalid parameters (including unsupported `expand` values)
* `401` missing/invalid merchant auth
* `404` invoice not found

## Examples

Retrieve an invoice with the latest payment attached:

```ts theme={null}
const invoice = await pepay.invoices.retrieve(invoiceId, { expand: ['latest_payment'] });
const latestPayment = invoice.latest_payment;
```

Next: [Get invoice status](/api-spec/endpoints/invoices-status)


## OpenAPI

````yaml GET /api/v1/invoices/{invoiceId}
openapi: 3.0.0
info:
  title: Pepay API (SDK-scoped)
  version: 1.0.0
  description: API documentation for Pepay API
servers:
  - url: https://api-beta.pepay.io
    description: Beta server
  - url: http://localhost:3000
    description: Local development
security:
  - bearerAuth: []
tags:
  - name: Events
    description: Events API (history + debugging) for canonical notification envelopes.
  - name: Metrics
    description: Internal Prometheus metrics (restricted).
  - name: WebSockets
    description: WebSocket streams (upgrade endpoints) and message schemas.
  - name: Commerce - Devnet Simulator
    description: >
      Deterministic devnet-only endpoints for simulating Commerce V2 order state
      transitions.


      Use this when integrating as a merchant on devnet to test your backend/UI
      against realistic order lifecycle changes

      (payment confirmation, settlement gating, placement, tracking,
      cancellation, refunds) without placing real retailer

      orders or sending real on-chain refunds.


      How it works:

      - Requires a devnet `X-Commerce-Api-Key` (merchant-scoped).

      - Only operates on orders created in `networkEnvironment=devnet`.

      - Updates the order using the same reducer/persistence paths used in
      mainnet (provider snapshots are simulated).

      - After each simulation, Pepay emits the normal `commerce.order.updated`
      merchant webhook event.
  - name: Merchant Checkout
    description: >
      Merchant-scoped **three-step** checkout flow:

      1) `POST /api/commerce/merchant/checkout/estimate` — validate items
      against current eligible offers and return `validItems[]` +
      `invalidItems[]`.

      2) `POST /api/commerce/merchant/checkout/address` — attach and validate a
      shipping address for the estimate.

      3) `POST /api/commerce/merchant/checkout/invoice` — create the final
      invoice + commerce order.


      Cart behavior (when `useCart: true`):

      - The estimate call **reads** the saved cart but does **not** remove or
      modify cart items.

      - Items with no eligible offers are returned in `invalidItems[]`.

      - To remove items from the saved cart, call the Merchant Cart APIs (`PUT
      /api/commerce/merchant/carts/items/:itemId` with `quantity: 0`, or `DELETE
      /api/commerce/merchant/carts/items/:itemId`).

      - To exclude items for *this checkout attempt* without mutating the cart,
      use `itemOverrides[]` with `quantity: 0`.
  - name: Payment Sessions
    description: >
      Payor-facing APIs used by the hosted payment page and other embedded
      checkout clients.


      Canonical base path:

      - All documented endpoints are under `/api/v1/payments/*`.


      Authentication:

      - These endpoints do **not** accept merchant API keys or bearer JWTs.

      - Send `x-session-token` and `x-signature` headers on every request (both
      are returned when creating an invoice).


      Typical flow:

      1) Create an invoice (`POST /api/v1/invoices`) → receive `payment_url`,
      `session_token`, `signature`.

      2) Render/open the `payment_url` for the payor.

      3) Fetch invoice context (`GET /api/v1/payments/session-details`).

      4) List supported tokens (`GET /api/v1/payments/available-tokens`).

      5) Allocate a payment address (`POST /api/v1/payments/payment-addresses`)
      → use `ws_connection` for `/ws/payment`.

      6) Track progress via polling (`GET /api/v1/payments/payment-status`)
      and/or websocket (`/ws/payment`).


      Security notes:

      - Treat `session_token` and `signature` as sensitive values (anyone with
      them can read the invoice/payment status).

      - Do not store them in long-lived browser storage; prefer in-memory usage
      on the payment page.
  - name: Quotes
    description: Token settlement quotes and rate calculations
  - name: Subscriptions
    description: Recurring subscription plans and charges (X402 Flex).
  - name: Subscriptions - Admin
    description: Admin operations for subscription infrastructure.
  - name: Webhooks
    description: >
      Webhook endpoint management and delivery history for canonical
      notifications.


      Delivery model:

      - At-least-once delivery; receivers must dedupe by `event.id` (also sent
      as `X-Pepay-Event-ID`).

      - Payloads are canonical `PepayEvent` objects and match websocket
      `event_v1` frames for the same event type.


      Security:

      - Endpoints must be HTTPS.

      - Deliveries are signed using `HMAC_SHA256("${timestamp_ms}.${raw_body}")`
      and sent in `X-Pepay-Signature`.
paths:
  /api/v1/invoices/{invoiceId}:
    get:
      tags:
        - Invoices
      summary: Retrieve invoice details
      description: >
        Return a single invoice with full metadata fields.

        Product API keys can only access invoices with `invoice_type=products`.

        Staff membership tokens can only access invoices with
        `invoice_type=products`.
      parameters:
        - in: path
          name: invoiceId
          required: true
          schema:
            type: string
            format: uuid
          description: Invoice ID
        - in: query
          name: expand
          schema:
            type: string
          description: Comma-separated expansions (latest_payment, payments).
        - in: query
          name: payments_limit
          schema:
            type: integer
            minimum: 1
            maximum: 100
            default: 10
          description: Max payments per invoice when expand includes payments.
      responses:
        '200':
          description: Invoice retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Getapiv1invoicesinvoiceIdResponse200'
              examples:
                base:
                  summary: Invoice
                  value:
                    object: invoice
                    id: 550e8400-e29b-41d4-a716-446655440000
                    merchant_id: 123
                    status: unpaid
                    invoice_type: standard
                    currency: usd
                    amount: 49990
                    amount_decimal: '49.990'
                    amount_paid: 0
                    amount_paid_decimal: '0.000'
                    amount_remaining: 49990
                    amount_remaining_decimal: '49.990'
                    amount_unit: usd_millis
                    customer_id: cust_123
                    environment: devnet
                    created_at: 1766318400
                    expires_at: 1766322000
                    metadata:
                      order_id: ORD-123
                expanded:
                  summary: Invoice with expand=latest_payment,payments
                  value:
                    object: invoice
                    id: 550e8400-e29b-41d4-a716-446655440000
                    merchant_id: 123
                    status: paid
                    invoice_type: standard
                    currency: usd
                    amount: 49990
                    amount_decimal: '49.990'
                    amount_paid: 49990
                    amount_paid_decimal: '49.990'
                    amount_remaining: 0
                    amount_remaining_decimal: '0.000'
                    amount_unit: usd_millis
                    environment: devnet
                    created_at: 1766318400
                    paid_at: 1766318460
                    latest_payment:
                      object: invoice_payment
                      id: 550e8400-e29b-41d4-a716-446655440111
                      invoice_id: 550e8400-e29b-41d4-a716-446655440000
                      merchant_id: 123
                      status: confirmed
                      settlement_status: settled
                      currency: usd
                      amount: 49990
                      amount_decimal: '49.990'
                      amount_unit: usd_millis
                      confirmed_at: 1766318460
                      metadata: {}
                    payments:
                      - object: invoice_payment
                        id: 550e8400-e29b-41d4-a716-446655440111
                        invoice_id: 550e8400-e29b-41d4-a716-446655440000
                        merchant_id: 123
                        status: confirmed
        '400':
          description: Invalid parameters
        '401':
          description: Authentication failed
        '403':
          description: API key is not permitted to access invoices
        '404':
          description: Invoice not found
        '500':
          description: Server error
      security:
        - merchantApiKey: []
        - bearerAuth: []
components:
  schemas:
    Getapiv1invoicesinvoiceIdResponse200:
      allOf:
        - $ref: '#/components/schemas/Invoice'
        - type: object
          properties:
            latest_payment:
              nullable: true
              allOf:
                - $ref: '#/components/schemas/InvoicePayment'
            payments:
              type: array
              items:
                $ref: '#/components/schemas/InvoicePayment'
    Invoice:
      type: object
      description: Canonical invoice object (snake_case, usd_millis amounts).
      properties:
        object:
          type: string
          example: invoice
        id:
          type: string
          example: 550e8400-e29b-41d4-a716-446655440000
        merchant_id:
          type: integer
          example: 123
        status:
          type: string
          example: paid
        invoice_type:
          type: string
          example: standard
        currency:
          type: string
          example: usd
        amount:
          type: integer
          example: 10000
          description: >-
            Total invoice amount in USD mills (1 USD = 1000 mills). For UI
            display, use amount_decimal.
        amount_decimal:
          type: string
          example: '10.000'
          description: Display-friendly USD string with 3 decimals (derived from amount).
        amount_paid:
          type: integer
          example: 10000
          description: >-
            Total amount paid in USD mills (1 USD = 1000 mills). For UI display,
            use amount_paid_decimal.
        amount_paid_decimal:
          type: string
          example: '10.000'
          description: >-
            Display-friendly USD string with 3 decimals (derived from
            amount_paid).
        amount_remaining:
          type: integer
          example: 0
          description: >-
            Remaining amount in USD mills (1 USD = 1000 mills). For UI display,
            use amount_remaining_decimal.
        amount_remaining_decimal:
          type: string
          example: '0.000'
          description: >-
            Display-friendly USD string with 3 decimals (derived from
            amount_remaining).
        amount_unit:
          type: string
          example: usd_millis
          description: Always usd_millis (amount fields are USD * 1000).
        customer_id:
          type: string
          nullable: true
        payer_wallet_address:
          type: string
          nullable: true
        payer_wallet_network:
          type: string
          nullable: true
        commerce_order_id:
          type: string
          nullable: true
        environment:
          type: string
          enum:
            - devnet
            - mainnet
        expires_at:
          type: integer
          nullable: true
        created_at:
          type: integer
          nullable: true
        paid_at:
          type: integer
          nullable: true
        last_payment_at:
          type: integer
          nullable: true
        metadata:
          type: object
          additionalProperties: true
    InvoicePayment:
      type: object
      description: >-
        Canonical invoice_payment object (merchant surfaces include settlement
        fields; payor surfaces strip them).
      properties:
        object:
          type: string
          example: invoice_payment
        id:
          type: string
          example: 550e8400-e29b-41d4-a716-446655440111
        invoice_id:
          type: string
          example: 550e8400-e29b-41d4-a716-446655440000
        merchant_id:
          type: integer
          example: 123
        invoice_type:
          type: string
          example: standard
        environment:
          type: string
          enum:
            - devnet
            - mainnet
        customer_id:
          type: string
          nullable: true
        commerce_order_id:
          type: string
          nullable: true
        status:
          type: string
          example: confirmed
        settlement_status:
          type: string
          nullable: true
          example: settled
        network:
          type: string
          nullable: true
          example: base
        payer_tx_hash:
          type: string
          nullable: true
        payer_wallet_address:
          type: string
          nullable: true
        payer_wallet_network:
          type: string
          nullable: true
        payer_amount_token:
          type: string
          nullable: true
        currency:
          type: string
          example: usd
        amount:
          type: integer
          example: 10000
          description: >-
            Payment amount in USD mills (1 USD = 1000 mills). For UI display,
            use amount_decimal.
        amount_decimal:
          type: string
          example: '10.000'
          description: Display-friendly USD string with 3 decimals (derived from amount).
        amount_unit:
          type: string
          example: usd_millis
          description: Always usd_millis (amount fields are USD * 1000).
        settled_amount:
          type: integer
          nullable: true
          example: 9800
          description: >-
            Net settled amount in USD mills (1 USD = 1000 mills). For UI
            display, use settled_amount_decimal.
        settled_amount_decimal:
          type: string
          nullable: true
          example: '9.800'
          description: >-
            Display-friendly USD string with 3 decimals (derived from
            settled_amount).
        balance_transaction_id:
          type: string
          nullable: true
          example: bt_550e8400-e29b-41d4-a716-446655440111
        confirmed_at:
          type: integer
          nullable: true
        settled_at:
          type: integer
          nullable: true
        settlement:
          type: object
          nullable: true
          properties:
            summary_status:
              type: string
              nullable: true
              example: settled
            stage:
              type: string
              nullable: true
              example: final
            merchant_settlement_id:
              type: integer
              nullable: true
            settlement_tx_hash:
              type: string
              nullable: true
            network:
              type: string
              nullable: true
              example: base
            status:
              type: string
              nullable: true
        metadata:
          type: object
          additionalProperties: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: JWT token for wallet authentication
    merchantApiKey:
      type: apiKey
      in: header
      name: x-api-key
      description: API key for server-to-server operations (scope=merchant or commerce)

````