# Attendees API – Tiempo

> A booking with seats is a session (a class, a group). Each attendee takes seats with the same hold-then-confirm flow. Never oversold.

Source: https://tiempo.one/docs/attendees

A booking with seats is a session (a class, a group). Each attendee takes seats with the same hold-then-confirm flow. Never oversold.

## Add an attendee

`POST /v1/bookings/{id}/attendees`

Takes seats in a session: pending by default, or confirmed with status "confirmed". A 409 when there aren’t enough seats left.

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

### Body parameters

-   `seats` (integer)
    
    Makes the booking a session that attendees take seats in.
    
-   `status` (string)
    
    pending (a hold) or confirmed.
    
-   `expires_at` (timestamp)
    
    When a hold lapses. Defaults to 15 minutes; at most your platform’s longest hold ahead, 24 hours unless an owner or admin changes it in the dashboard (up to 7 days).
    
-   `metadata` (map)
    
    Up to 50 keys of your own (strings, keys up to 40 characters, values up to 500). Returned on every read and webhook. On update, an empty string removes a key.
    

POST /v1/bookings/{id}/attendees

```bash
curl -X POST "https://api.tiempo.one/v1/bookings/att_01m43y9a84ha3w86s7w5eq2y3a/attendees" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw" \
  -H "Content-Type: application/json" \
  -d '{
    "seats": 2,
    "metadata": {
      "your_customer_id": "cus_881"
    }
  }'
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

## List a session’s attendees

`GET /v1/bookings/{id}/attendees`

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

### Query parameters

-   `status` (string)
    
    Only objects with this status.
    
-   `limit` (integer)
    
    1 to 100. Defaults to 20.
    
-   `starting_after` (string)
    
    An object id from the previous page; returns the page after it.
    
-   `ending_before` (string)
    
    An object id; returns the page before it.
    
-   `metadata[key]` (string)
    
    Only objects whose metadata has this key and value. Repeat for several.
    

GET /v1/bookings/{id}/attendees

```bash
curl "https://api.tiempo.one/v1/bookings/att_01m43y9a84ha3w86s7w5eq2y3a/attendees?status=confirmed" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw"
```

200Response

```json
{
  "object": "list",
  "data": [
    {
      "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
      "object": "attendee",
      "livemode": false,
      "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
      "status": "pending",
      "seats": 2,
      "expires_at": "2026-10-04T08:20:24Z",
      "cancellation_reason": null,
      "confirmed_at": null,
      "cancelled_at": null,
      "metadata": {
        "your_customer_id": "cus_881"
      },
      "created_at": "2026-10-04T08:05:24Z",
      "updated_at": "2026-10-04T08:05:24Z"
    }
  ],
  "has_more": false
}
```

## Retrieve an attendee

`GET /v1/attendees/{id}`

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

GET /v1/attendees/{id}

```bash
curl "https://api.tiempo.one/v1/attendees/att_01m43y9a84ha3w86s7w5eq2y3a" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw"
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

## Update an attendee

`POST /v1/attendees/{id}`

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

### Body parameters

-   `expires_at` (timestamp)
    
    When a hold lapses. Defaults to 15 minutes; at most your platform’s longest hold ahead, 24 hours unless an owner or admin changes it in the dashboard (up to 7 days).
    
-   `metadata` (map)
    
    Up to 50 keys of your own (strings, keys up to 40 characters, values up to 500). Returned on every read and webhook. On update, an empty string removes a key.
    

POST /v1/attendees/{id}

```bash
curl -X POST "https://api.tiempo.one/v1/attendees/att_01m43y9a84ha3w86s7w5eq2y3a" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw" \
  -H "Content-Type: application/json" \
  -d '{
    "metadata": {
      "note": "front row"
    }
  }'
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

## Confirm an attendee

`POST /v1/attendees/{id}/confirm`

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

POST /v1/attendees/{id}/confirm

```bash
curl -X POST "https://api.tiempo.one/v1/attendees/att_01m43y9a84ha3w86s7w5eq2y3a/confirm" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw"
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

## Cancel an attendee

`POST /v1/attendees/{id}/cancel`

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

### Body parameters

-   `reason` (string)
    
    Your note, kept on the object and its webhook.
    

POST /v1/attendees/{id}/cancel

```bash
curl -X POST "https://api.tiempo.one/v1/attendees/att_01m43y9a84ha3w86s7w5eq2y3a/cancel" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw" \
  -H "Content-Type: application/json" \
  -d '{
    "reason": "customer_request"
  }'
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

## Complete an attendee

`POST /v1/attendees/{id}/complete`

Records that they came, or paid: allowed before the session. They keep their seat.

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

POST /v1/attendees/{id}/complete

```bash
curl -X POST "https://api.tiempo.one/v1/attendees/att_01m43y9a84ha3w86s7w5eq2y3a/complete" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw"
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

## Mark an attendee as a no-show

`POST /v1/attendees/{id}/no_show`

Only once the session has started.

Send the business’s id in `Tiempo-Account`.

### Path parameters

-   `id` (string, required)
    
    The object’s id.
    

POST /v1/attendees/{id}/no_show

```bash
curl -X POST "https://api.tiempo.one/v1/attendees/att_01m43y9a84ha3w86s7w5eq2y3a/no_show" \
  -H "Authorization: Bearer tpt_4qZ8m1VwXc0L…" \
  -H "Tiempo-Account: acct_01m42yt93ayvyrwr3yczhv6yhw"
```

200Response

```json
{
  "id": "att_01m43y9a84ha3w86s7w5eq2y3a",
  "object": "attendee",
  "livemode": false,
  "booking": "bkg_01m43y9a7hejhvj6mr5c2n9vgb",
  "status": "pending",
  "seats": 2,
  "expires_at": "2026-10-04T08:20:24Z",
  "cancellation_reason": null,
  "confirmed_at": null,
  "cancelled_at": null,
  "metadata": {
    "your_customer_id": "cus_881"
  },
  "created_at": "2026-10-04T08:05:24Z",
  "updated_at": "2026-10-04T08:05:24Z"
}
```

The machine-readable description is at [/openapi.json](https://tiempo.one/openapi.json). Try calls in [Swagger UI](https://tiempo.one/swagger-ui.html).[Tiempo home](https://tiempo.one/)[Dashboard](https://tiempo.one/app)
