---
title: "List USDC payments"
method: GET
path: "/credits/payments"
tags: ["Credits"]
---

# List USDC payments

`GET /credits/payments`

## Request

- Base URL: `https://inkseal.net/api/v1`
- URL: `https://inkseal.net/api/v1/credits/payments`
- Auth: HTTP bearer

The workspace's USDC payments, newest first: one receipt per x402 top-up, settled or not.

`listCreditTransactions` records that the balance moved; this records what paid for it, on which chain and in which transaction. It is also the answer to an uncertain outcome: a `payment_replayed` or `payment_pending` refusal from `topUpCreditsWithX402` leaves an agent unsure whether it was charged, and the receipt here says.

This operation exists only where the deployment enables USDC top-ups. Where it does not, every call answers `404` `not_found`.

## Query parameters

- `page` integer
- `limit` integer

## Response `200`

A page of payments, newest first.

- object
  - `data` X402Payment[], required
    - `status` 'verified' | 'confirmed' | 'settled' | 'failed', required: `settled` is the only status that granted credits. `failed` left the balance unchanged. `verified` (outcome being checked on chain) and `confirmed` (settled, credits pending) resolve on their own.
    - `network` string, required: CAIP-2 chain id.
    - `transaction` string, nullable, required: The settlement transaction hash, once there is one.
    - `payer` string, nullable, required: The address that paid.
    - `asset` string, required: The token contract the payment was denominated in.
    - `amountAtomic` string, required: The amount in the token's atomic units, as a string, which is how the protocol carries it. USDC has six decimals.
    - `amountUsd` string, required: The pack's USD face value, to the cent.
    - `credits` integer, required: Credits this payment bought, granted only when `status` is `settled`.
    - `packId` 'pack_5' | 'pack_25' | 'pack_50' | 'pack_100' | 'pack_500', required: The pack that was sold.
    - `errorReason` string, nullable, required: Why settlement failed, as the facilitator reported it.
    - `createdAt` string, date-time, required: When the payment was verified and claimed.
    - `settledAt` string, date-time, nullable, required: When it settled, or null.
  - `pagination` Pagination, required: Where the returned page sits in the full result set.
    - `page` integer, required: The 1-based page returned.
    - `limit` integer, required: Items per page, as requested.
    - `total` integer, required: Total items matching the query.
    - `totalPages` integer, required: `ceil(total / limit)`.

## Other responses

- `400`: The request is malformed or the resource is in the wrong state for a synchronous check. Codes: `validation_error`, `invalid_body`, `invalid_parameter`, `invalid_idempotency_key`, `invalid_event_id`, `invalid_file`, `invalid_url`, `invalid_status`, `key_mismatch`, `no_signers`, `not_completed`, `envelope_exists`, `document_not_ready`, `upload_failed`.
- `401`: The credential is missing, malformed, unknown, expired, revoked, or past its rotation grace window. Code: `unauthorized`. Every authentication failure is deliberately indistinguishable.
- `403`: The credential is valid but may not do this. Codes: `insufficient_scope` (the route's scopes are not all held; `details` names `requiredScopes` and `missingScopes`), `forbidden` (the capability check on the resolved resource failed), `scope_escalation` (a grant wider than the caller's own was requested).
- `404`: The resource does not exist, was deleted, or belongs to another workspace. Code: `not_found`. The three cases are answered identically on purpose, so a 404 never confirms that an identifier exists elsewhere.
- `429`: A limit was reached. Codes: `rate_limited` (the credential's per-bucket HTTP limit, or the per-workspace detection throttle), `workspace_limit_exceeded` (a workspace content or send limit; `details.limit` names it), `daily_budget_exceeded` (the workspace's daily detection budget). The four rate-limit headers are sent on this response and on no successful one, so a client cannot read its remaining budget without being refused. Retrying after `Retry-After` is always safe: a rate-limit refusal happens before the handler runs.
- `503`: A dependency the request needs is unreachable and nothing was changed. Codes: `queue_unavailable` (a background job could not be enqueued; retry the call), `billing_unavailable` (Stripe would not open a checkout session; nothing was charged, retry the call), `service_unavailable` (the rate-limit store is down, so the request was refused before running).

---

[API](https://skmtc.dev/inkseal/apis/inkseal-api.md) · [All operations](https://skmtc.dev/inkseal/apis/inkseal-api/llms.txt) · [OpenAPI document](https://skmtc.dev/inkseal/apis/inkseal-api/revisions/c440c981d578?raw)
