---
title: "End a reservation now (platform admin)"
method: POST
path: "/v1/nodes/{nodeId}/reservations/{id}/cancel"
tags: ["Reservations"]
---

# End a reservation now (platform admin)

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

Returns the GPU units to the public pool immediately. Workloads the tenant is already running keep running; the node's owning org terminates them when it needs the capacity.

## Path parameters

- `nodeId` string, required
- `id` 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
  - `contractRef` string
  - `createdAt` string
  - `endsAt` string — Absent = open-ended until cancelled
  - `id` string, required
  - `nodeId` string, required
  - `reason` string
  - `reservedUnitIds` string[], required
  - `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.
  - `topologyGen` integer — Node topology generation this reservation was written against
  - `updatedAt` string

## Other responses

- `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/versions/4c42fd61ed41/schema)
