---
title: "Take released GPU units back off the market, evicting spot workloads"
method: POST
path: "/v1/nodes/{nodeId}/reservations/{id}/reclaim"
tags: ["Reservations"]
---

# Take released GPU units back off the market, evicting spot workloads

`POST /v1/nodes/{nodeId}/reservations/{id}/reclaim`

Returns the named units to exclusive use AND terminates the spot workloads running on them, in one call. Everything evicted was bought at the spot tier, whose terms are exactly that the capacity owner can reclaim without notice. Pass dryRun to see what would be terminated without changing anything. Callable by a platform operator, the org that owns the node, or an org in the reservation's managingOrgIds.

## Path parameters

- `nodeId` string, required
- `id` string, required

## Request body

- ReservationReclaimRequest — Reclaim takes units back off the spot market and terminates the spot workloads on them, so unlike release it can destroy someone's running VM: hence the dry run.
  - `dryRun` boolean — Report which spot workloads would be terminated, and change nothing: no terminations, and the capacity boundary stays where it is.
  - `reason` string — Recorded in the audit trail.
  - `unitIds` string[], required

## Response `200`

OK

- NodeReservation — Exclusive placement rights for a set of orgs over specific GPU units of one node, for a term. Scoped to units, not GPU counts, because units are the indivisible allocation primitive.
  - `allowedOrgIds` string[], required — The audience: orgs that may place workloads on the reserved units.
  - `contractRef` string
  - `createdAt` string
  - `endsAt` string — Absent = open-ended until cancelled
  - `id` string, required
  - `managingOrgIds` string[] — Orgs that may release these units to the market, reclaim them, and terminate the spot workloads on them, on the node owner's behalf. Being in the audience does not confer this.
  - `nodeId` string, required
  - `reason` string
  - `releasedUnitIds` string[] — The subset of reservedUnitIds currently on the spot market (double sell). Still this reservation's capacity, sellable to anyone at tier=spot only, and reclaimable at any time.
  - `reservedUnitIds` string[], required
  - `skipped` string[] — Reclaim only: VM ids left running because they are not spot.
  - `startsAt` string, required
  - `status` 'pending' | 'active' | 'expired' | 'cancelled' | 'needs-review', required — needs-review means the node's GPU topology changed under the reservation: it grants nothing (and withholds its units from everyone) until an operator re-affirms it.
  - `terminated` string[] — Reclaim only: spot VM ids terminated to free the reclaimed units.
  - `topologyGen` integer — Node topology generation this reservation was written against
  - `updatedAt` string
  - `wouldSkip` string[] — Reclaim dry run only: VM ids that would be left running.
  - `wouldTerminate` string[] — Reclaim dry run only: the spot VM ids this call would terminate.

## Other responses

- `400` — The request is invalid
- `401` — Missing or invalid API key
- `403` — API key lacks the required scope
- `404` — Resource not found
- `409` — The request conflicts with existing state

---

[API](https://skmtc.net/openrelay/apis/openrelay-api.md) · [All operations](https://skmtc.net/openrelay/apis/openrelay-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/openrelay/openrelay-api/revisions/b75b478564cc/schema)
