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

# Headless / API (Tier C)

> Build your own UI end to end against the order object — no Pulse-rendered surface at all.

Tier C is pure API: no in-app component, no iframe, no hosted page. You build
100% of the payment UI yourself against `@pulsebyshiga/node`, driven by the
order that `pulse.collectionSessions.create` returns (see
[Create a session](/backend/create-session)).

## The order carries everything the embed uses

* **`deposit_address`** — where the customer sends the asset.
* **`qr_payload`** — a scannable payment payload (Solana Pay / EIP-681).
* **`quote`** — the locked `rate`, the `asset_amount` to send, and `locked_until`.
* **`status`** — the order's current lifecycle state.
* **`amount_status`** — whether the deposit matches, under-, or over-pays the quote.
* **`deposit`** — details of a detected deposit, once one arrives.
* **`disbursement`** — settlement details, once disbursed.

## Getting the current state

Poll ground truth on demand, or drive your UI from webhooks:

```ts theme={null}
// Ground truth on demand
const order = await pulse.collectionOrders.retrieve(orderId);

// Re-lock an expired quote on the same order (does not create a new order)
const refreshed = await pulse.collectionOrders.refreshQuote(orderId);
```

Or subscribe to the same lifecycle events the hosted models react to
internally — `collection.deposit.detected`, `collection.deposit.confirmed`,
`disbursement.completed`, and the edge-state events — and update your UI as
they arrive. See [Orders](/backend/orders) for the full method list and
[Webhooks](/backend/webhooks) for the event catalog.

<Note>
  Whichever source you drive your UI from, credit a customer only from a
  verified `disbursement.completed` webhook — never from a poll result or a
  client-side signal.
</Note>
