Adjust
Credit or debit a participant’s balance:| Field | Required | Description |
|---|---|---|
program_id | Yes | Program context |
asset_id | Yes | Which asset to adjust |
type | Yes | CREDIT or DEBIT |
amount | Yes | Positive amount |
allow_negative | No | DEBIT only. When true, allows the debit to overdraw the balance below zero. Used for clawbacks. Defaults to false. |
bucket | No | AVAILABLE (default) or HELD |
description | Yes | Reason for the adjustment (1-500 characters) |
type to control direction. DEBIT fails if the available balance is insufficient, unless allow_negative is set to true. If an amount has more decimal places than the asset’s scale, it is rounded automatically (e.g., "1.009" becomes "1.01" for scale: 2).
Negative Balances
Setallow_negative to true on a DEBIT to let the balance go below zero. This is useful when you need to recover value that a participant has already spent:
- Refund clawbacks. A cardholder earned cashback on a purchase that was later refunded. The cashback has already been redeemed, so the available balance is zero. A negative-balance debit records the debt.
- Chargeback recovery. A payment is disputed and reversed, but the associated reward points were already used. The debit brings the balance negative until the participant earns enough to offset it.
- Corrections. An incorrect credit was issued and the participant has already spent part of it. A negative-balance debit corrects the ledger without waiting for funds to replenish.
LOT-mode assets, the system consumes whatever lots are available first, then posts the remaining amount as an overdraft. The balance goes negative by the uncovered portion.
allow_negative also works in rule actions. This lets your rules engine handle clawbacks automatically, for example debiting cashback when a refund event arrives, even if the participant’s balance is zero.
allow_negative only applies to adjustments and rule-based debits. Transfers and redemptions always require sufficient funds.Hold
Reserve funds by moving them fromAVAILABLE to HELD:
| Field | Required | Description |
|---|---|---|
program_id | Yes | Program context |
asset_id | Yes | Which asset to hold |
amount | Yes | Positive amount to reserve |
reference_id | No | Correlation ID for this hold (LOT mode only). Stamps held lots so a future release can target them. 1-255 characters, alphanumeric plus ._:@-. |
description | Yes | Reason for the hold (1-500 characters) |
- Authorization holds (reserve rewards until the transaction settles)
- Fraud review (freeze funds pending investigation)
- Pending approvals (hold until manual review completes)
Release
Move held funds back toAVAILABLE:
| Field | Required | Description |
|---|---|---|
program_id | Yes | Program context |
asset_id | Yes | Which asset to release |
amount | No | Amount to release. If omitted, all matching held lots are released. |
reference_id | No | Release only lots stamped with this reference during a previous hold (LOT mode only) |
description | Yes | Reason for the release (1-500 characters) |
reference_id is provided, only lots stamped with that reference during a previous hold are targeted. You can also filter by lot age using earned_from, earned_to, expires_before, and expires_after for batch-releasing held balances.
Forfeit
Remove funds permanently from a participant’s balance:| Field | Required | Description |
|---|---|---|
program_id | Yes | Program context |
asset_id | Yes | Which asset to forfeit |
amount | Yes | Positive amount |
bucket | Yes | AVAILABLE or HELD. Specifies which balance bucket to forfeit from. |
description | No | Reason for the forfeit |
SYSTEM_BREAKAGE account.
Auth / Settlement Pattern
Holds model authorization and settlement flows. Usereference_id to correlate the hold with its corresponding settlement or void, especially when a participant has multiple concurrent holds.
Transaction authorized
Your backend sends an event with Or, if crediting new points directly into
event.type == "auth". A rule matches and holds existing points, stamping the held lots with a reference_id:HELD:Transaction settles
Your backend sends a second event with When When
event.type == "settlement". Two approaches:Release held funds. A rule releases the held lots by reference, returning them to AVAILABLE:amount is omitted with a reference_id, all lots held under that reference are released.Settle via CREDIT. A rule credits to AVAILABLE with the same reference_id used during the hold:reference_id matches existing held lots, the system reconciles the held amount against the settlement amount. If the settlement differs from the hold, the difference is handled automatically. Excess is credited to the participant, and shortfall is returned to the program. If no prior hold exists for the reference, a standard credit is applied.reference_id requires a LOT mode asset. For SIMPLE mode assets, use amount-based holds and releases without reference_id.Lot Preservation
ForLOT-mode assets, hold and release operations preserve lot metadata (expires_at, matures_at, created_at). Lots move between buckets but retain their identity and lifecycle dates.
Inactive Participants
Most balance operations (adjust, hold, release) are blocked forSUSPENDED and CLOSED participants. The API returns a 409 error with code participant_inactive.
Forfeit is the exception: it is allowed on CLOSED participants so you can clean up remaining balances after account closure. Forfeit is still blocked for SUSPENDED participants.