---
title: "Blocking seats"
description: "Take individual inventory off sale, schedule its release, and return blocked seats safely."
---

Blocking is organizer-controlled inventory: production holds, comps, sightline
closures, press allocations, or seats not ready for sale. It is not a buyer hold
and does not consume a booked-seat credit.

## Block seats

<ApiEndpoint method="POST" path="/v1/events/:key/block" auth="Secret key, dashboard session, or event:block manage token" />

```bash
curl -sX POST "https://api.seatlayer.io/v1/events/ev_9f3a/block" \
  -H "authorization: Bearer $SEATLAYER_SECRET_KEY" \
  -H "content-type: application/json" \
  -d '{"labels":["A-1","A-2"]}'
```

Success returns:

```json
{
  "ok": true,
  "blocked": ["A-1", "A-2"]
}
```

Blocking is atomic across the requested labels. Every label must exist and be
`free`. If one is held, booked, blocked, or missing, nothing changes:

```json
{
  "error": "conflict",
  "conflicts": [
    {
      "label": "A-2",
      "status": "held"
    }
  ]
}
```

## Schedule automatic release

Add a future epoch-ms `releaseAt`:

```json
{
  "labels": ["P-1", "P-2"],
  "releaseAt": 1767200400000
}
```

A past or invalid time does not schedule a release; the block remains until an
explicit unblock. Store your intended release time in your own operation record
because the basic block response returns only the blocked labels.

## Unblock selected seats

<ApiEndpoint method="POST" path="/v1/events/:key/unblock" auth="Secret key, dashboard session, or event:block manage token" />

```bash
curl -sX POST "https://api.seatlayer.io/v1/events/ev_9f3a/unblock" \
  -H "authorization: Bearer $SEATLAYER_SECRET_KEY" \
  -H "content-type: application/json" \
  -d '{"labels":["A-1","A-2"]}'
```

Non-blocked labels are ignored. The response contains the labels actually
returned to sale.

## Unblock all

<ApiEndpoint method="POST" path="/v1/events/:key/unblock-all" auth="Secret key, dashboard session, or event:block manage token" />

No body is required. A successful response is:

```json
{
  "ok": true,
  "freed": 12
}
```

## Buyer and operator behavior

Blocked inventory is exposed to buyer surfaces as `not_for_sale`; buyers do not
see your internal reason. Live SDK and control-room views repaint after the
mutation without polling.

| State change | Use |
|---|---|
| `free → blocked` | `block` |
| `blocked → free` | `unblock` or `unblock-all` |
| `booked → free` | [booking-safe cancellation](/server-api/cancellations-and-box-office) |
| `free → booked` from a trusted Platform backend | [direct inventory booking](/server-api/cancellations-and-box-office) |

## Checklist

- [ ] Secret keys are used only from a trusted server.
- [ ] Browser operator tokens carry only `event:block` when that is sufficient.
- [ ] Batch conflicts are shown as a retry/reselect action.
- [ ] Scheduled-release times are future UTC epoch milliseconds.
- [ ] Blocking is not treated as a payment reservation.
- [ ] The host keeps its own reason and operator audit context.

For sections and zones, use
[inventory and availability](/server-api/inventory).