---
title: "Release Hold"
method: POST
path: "/billing/internal/release-hold"
tags: ["billing"]
---

# Release Hold

`POST /billing/internal/release-hold`

Called by Modal on generation failure to release credit hold.

Routes the refund to the shared team pool when ``snapshot_id`` is supplied
and the snapshot is team-owned; otherwise the personal balance. The
snapshot_id is optional for backward compatibility with indexer builds that
don't yet send it — those release to the user (the historical behaviour),
so a lagging Modal deploy degrades safely for personal holds.

## Headers

- `x-service-token` string, required

## Request body

- ReleaseHoldRequest
  - `user_id` string, required
  - `estimated_cost_cents` integer, required
  - `snapshot_id` string, nullable

## Response `200`

Successful Response

- unknown

## Other responses

- `422` — Validation Error

---

[API](https://skmtc.dev/repowise/apis/repowise-hosted-api.md) · [All operations](https://skmtc.dev/repowise/apis/repowise-hosted-api/llms.txt) · [OpenAPI document](https://skmtc-service-production.skmtc.workers.dev/v1/apis/repowise/repowise-hosted-api/revisions/1e57283a9737/schema)
