# POST /crm/reservations/availability

Section: [CRM · Reservations](https://appengine.appmint.io/documentation/tag/crm-reservations.md) · Full index: https://appengine.appmint.io/documentation.md
## POST /crm/reservations/availability

**Availability across a run of days**

`operationId: ReservationsController_getAvailability`

What is open for a service over up to 31 days, in one call — the question a caller asks ("anything Friday or Saturday?").

Unlike `slots`, full slots are returned too (`spotsAvailable: 0`), so a screen can show the shape of each day rather than a list with holes in it. A slot already past, or inside a blocked time, is not a slot and is left out. A day outside `workDays` comes back `closed: true` with no slots.

Capacity is the definition's `spots`: how many bookings one slot holds. Any live booking that overlaps the slot at all takes a spot.

Times are UTC; format them in the returned `timezone` (the business's), not the viewer's.

#### Signature

```http
POST /crm/reservations/availability (body) -> Per-day slots, plus the first open one
```

#### Access

Public — no credentials required.

#### Notes

- No hold is placed. Handle the race between showing a slot and booking it.

#### Errors

Plus the standard platform errors: `429`, `500`.

#### See also

- `POST /crm/reservations/reschedule/{id}`
- `POST /crm/reservations/create`

### Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `orgid` | header | string | yes | Organization (tenant) identifier. Every request is scoped to this org; data from other orgs is never visible. Issued with your API credentials. |

### Request body

What to look for.

```json
{
  "reservationDefinitionId": "6aa798c44f3cf920a2c64b07",
  "serviceName": "consultation",
  "from": "2026-09-21",
  "days": 7
}
```

### Responses

| Status | Meaning |
| --- | --- |
| `201` | Per-day slots, plus the first open one |
| `429` | Too Many Requests — More than 100,000 requests from one IP within 5 minutes (configurable per deployment). CORS preflights and requests from inside the platform cluster are not counted. The limiter answers before the error filter, so the body is `{ statusCode, error, message }` with no `path`, `method` or `timeStamp`; the `RateLimit-*` response headers say when the window resets. |
| `500` | An unexpected error occurred. Our team has been notified. — An unhandled server-side failure. |

Example response:

```json
{
  "reservationDefinitionId": "6aa798c44f3cf920a2c64b07",
  "service": {
    "name": "consultation",
    "duration": 30,
    "price": 0
  },
  "timezone": "America/New_York",
  "from": "2026-09-21",
  "to": "2026-09-27",
  "nextAvailable": {
    "date": "2026-09-21",
    "startTime": "2026-09-21T18:00:00.000Z",
    "endTime": "2026-09-21T18:30:00.000Z",
    "spotsTotal": 2,
    "spotsAvailable": 1
  },
  "days": [
    {
      "date": "2026-09-21",
      "weekday": "Monday",
      "closed": false,
      "openSlots": 5,
      "slots": [
        {
          "startTime": "2026-09-21T18:00:00.000Z",
          "endTime": "2026-09-21T18:30:00.000Z",
          "spotsTotal": 2,
          "spotsAvailable": 1
        }
      ]
    }
  ]
}
```

