Skip to main content
POST
/
v1
/
inventory
/
holds
/
{id}
/
release
Release one Hold by ID
curl --request POST \
  --url https://{base_url_domain}/api/global/v1/inventory/holds/{id}/release \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{}'
{
  "resource": {
    "type": "Hold",
    "id": 142,
    "qty": 12,
    "held_at": "2026-04-28T14:32:00Z",
    "status": "active",
    "merchant": {
      "type": "Merchant",
      "id": 4
    },
    "warehouse": {
      "type": "Warehouse",
      "id": 123
    },
    "product": {
      "id": 123
    },
    "location": {
      "type": "Location",
      "id": 42
    },
    "lot": {
      "type": "Lot",
      "id": 54
    },
    "reason": {
      "code": "damaged",
      "label": "Damaged",
      "parent_code": "damaged"
    },
    "held_by": {
      "type": "Requester",
      "id": 3
    },
    "released_at": null,
    "released_by": {
      "type": "Requester",
      "id": 3
    },
    "notes": "Damaged in receiving",
    "updated_at": "2026-04-28T14:32:00Z"
  }
}

Authorizations

Authorization
string
header
required

Generate a JWT access token through a Custom Global Integration and provide it with each request in the Authorization header prefixed with "Bearer" and then a single space.

Path Parameters

id
integer<int64>
required

hold_id to release.

Body

application/json

Empty object {}. The engine's Hold::release() does not currently accept release-time notes — the notes set when the hold was placed is preserved in the audit history.

The body is of type object.

Response

Hold released.

resource
Hold Ā· object

An inventory hold record. Cross-merchant view (Global API surface).

Releasing cascaded holds: when holdLot is called with cascade_bom=true, free the cascade tree by releasing each child via POST /holds/{id}/release, using origin.created_origin_hold_ids ∪ cascade.child_hold_ids from the original holdLot response.

Do not include origin.root_hold_ids blindly in the release set — those may include pre-existing roots from a prior cascadeLotHold call that this call attached children to, and releasing them would also release siblings the current caller did not place.