---
title: "Forfeit group balance"
method: POST
path: "/v1/groups/{group_id}/balances/forfeit"
tags: ["Groups"]
---

# Forfeit group balance

`POST /v1/groups/{group_id}/balances/forfeit`

## Request

- Base URL: `https://api.scrip.dev`
- URL: `https://api.scrip.dev/v1/groups/{group_id}/balances/forfeit`
- Auth: HTTP bearer

Moves group balance to breakage (system account). Allowed on archived assets as an explicit cleanup operation.

## Path parameters

- `group_id` string, uuid, required

## Headers

- `Idempotency-Key` string

## Request body

- BalanceOperationRequest: Holds, releases, forfeits or voids value, depending on the endpoint. Choose which value moves with an amount, lot ids, lot dates or a `reference_id`.
  - `amount` string: Amount to process. Omit to process the full balance (SIMPLE) or all matching lots (LOT)
  - `asset_id` string, uuid, required: Asset to operate on
  - `bucket` 'AVAILABLE' | 'HELD': Which bucket to forfeit from. Required for forfeit; ignored for hold/release
  - `description` string, required: Reason for this operation
  - `earned_from` string, date-time: Only process lots earned on or after this time (RFC 3339). LOT mode only. Void pending rejects this field.
  - `earned_to` string, date-time: Only process lots earned on or before this time (RFC 3339). LOT mode only. Must be >= earned_from when both are provided. Void pending rejects this field.
  - `idempotency_key` string: Your key for this operation. You can send it in the Idempotency-Key header instead; when both are sent they must match. The same key with the same fields returns the first result again, and the same key with different fields returns 409 `idempotency_conflict`.
  - `lot_ids` string[]: Restrict to specific lots. LOT mode only. Void pending rejects this field.
  - `program_id` string, uuid, required: Program this operation belongs to
  - `reference_id` string: Correlation ID that links a hold to its release, or names the pending rewards to void. It cannot start with `scrip:`. LOT mode only. Required for void pending; forfeit rejects it.

## Response `200`

Balance forfeited

- BalanceOperationResponse: The result of a hold, release, forfeit or void: the amount processed, the lots touched and the balance after.
  - `amount_processed` string: Total amount processed
  - `asset_id` string, uuid: The asset the operation applied to.
  - `balance` BalanceSummary: A balance split into available, held and deferred amounts.
    - `available` string: Spendable balance
    - `deferred` string: Balance not yet matured
    - `held` string: Balance reserved by hold operations
  - `journal_entry_id` string, uuid: Ledger journal entry created by this operation
  - `lots_processed` ProcessedLotResponse[]: Individual lots affected. Only present for LOT mode assets
    - `amount` string: Amount processed from this lot
    - `id` string, uuid: The id of the lot the operation changed.
  - `message` string: Confirmation message
  - `operation` 'HOLD' | 'RELEASE' | 'FORFEIT' | 'VOID_PENDING': The balance operation that was performed, matching the endpoint you called.
  - `program_id` string, uuid: The program the operation belongs to.
  - `reference_id` string: Correlation ID linking this hold/release (if provided)

## Other responses

- `400`: Invalid parameters or invalid/mismatched Idempotency-Key header (code: validation_error)
- `401`: The API key is missing or not valid. See [Authentication](https://docs.scrip.dev/authentication).
- `403`: The caller is not allowed to do this.
- `404`: Group not found (code: group_not_found)
- `409`: Idempotency key conflict, program not active, or another request changed the same balance at the same time (code: idempotency_conflict | retryable_conflict | program_inactive)
- `422`: Insufficient funds (code: insufficient_funds)
- `429`: Too many requests. Wait the number of seconds in the `Retry-After` header, then retry. See [Limits and durations](https://docs.scrip.dev/limits#rate-limits).
- `500`: Something failed on Scrip's side. Retry the request, and quote `request_id` if it keeps failing. [Errors](https://docs.scrip.dev/errors) lists every code, and the [API introduction](https://docs.scrip.dev/api-reference/introduction) describes the error format.

---

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