# Book a Semaloop demo

A 30-minute video call with the Semaloop team: we look at your app, show Semaloop testing it on real devices, and answer questions on pricing and setup. The calendar invite and video link go to the attendee's email.

Agents can book a slot on someone's behalf in two HTTP calls, with no authentication. Only book for a person who has asked you to, using their own work email.

## Open slots

Times are shown in Europe/London. Add `?timezone=<IANA zone>` to this URL (for example `?timezone=America/New_York`) to list them in the attendee's zone. The value in backticks is the exact `startTime` to send. This list was generated 2026-10-24T07:43:02.997Z; slots can go at any moment, so treat it as a snapshot.

### Monday 26 October

- 11:00 — `2026-10-26T11:00:00.000Z`
- 11:15 — `2026-10-26T11:15:00.000Z`
- 11:30 — `2026-10-26T11:30:00.000Z`
- 11:45 — `2026-10-26T11:45:00.000Z`
- 12:00 — `2026-10-26T12:00:00.000Z`
- 12:15 — `2026-10-26T12:15:00.000Z`
- 12:30 — `2026-10-26T12:30:00.000Z`
- 13:30 — `2026-10-26T13:30:00.000Z`
- 13:45 — `2026-10-26T13:45:00.000Z`
- 14:00 — `2026-10-26T14:00:00.000Z`
- 14:15 — `2026-10-26T14:15:00.000Z`
- 14:30 — `2026-10-26T14:30:00.000Z`
- 16:00 — `2026-10-26T16:00:00.000Z`
- 16:15 — `2026-10-26T16:15:00.000Z`
- 16:30 — `2026-10-26T16:30:00.000Z`
- 16:45 — `2026-10-26T16:45:00.000Z`
- 17:00 — `2026-10-26T17:00:00.000Z`
- 17:15 — `2026-10-26T17:15:00.000Z`
- 17:30 — `2026-10-26T17:30:00.000Z`
- 17:45 — `2026-10-26T17:45:00.000Z`
- 18:00 — `2026-10-26T18:00:00.000Z`

### Tuesday 27 October

- 09:00 — `2026-10-27T09:00:00.000Z`
- 09:15 — `2026-10-27T09:15:00.000Z`
- 09:30 — `2026-10-27T09:30:00.000Z`
- 11:00 — `2026-10-27T11:00:00.000Z`
- 12:00 — `2026-10-27T12:00:00.000Z`
- 12:15 — `2026-10-27T12:15:00.000Z`
- 12:30 — `2026-10-27T12:30:00.000Z`
- 12:45 — `2026-10-27T12:45:00.000Z`
- 13:00 — `2026-10-27T13:00:00.000Z`
- 13:15 — `2026-10-27T13:15:00.000Z`
- 13:30 — `2026-10-27T13:30:00.000Z`
- 13:45 — `2026-10-27T13:45:00.000Z`
- 14:00 — `2026-10-27T14:00:00.000Z`
- 14:15 — `2026-10-27T14:15:00.000Z`
- 14:30 — `2026-10-27T14:30:00.000Z`
- 14:45 — `2026-10-27T14:45:00.000Z`
- 15:00 — `2026-10-27T15:00:00.000Z`
- 15:15 — `2026-10-27T15:15:00.000Z`
- 15:30 — `2026-10-27T15:30:00.000Z`
- 16:00 — `2026-10-27T16:00:00.000Z`
- 17:00 — `2026-10-27T17:00:00.000Z`
- 17:15 — `2026-10-27T17:15:00.000Z`
- 17:30 — `2026-10-27T17:30:00.000Z`
- 17:45 — `2026-10-27T17:45:00.000Z`
- 18:00 — `2026-10-27T18:00:00.000Z`

### Wednesday 28 October

- 09:30 — `2026-10-28T09:30:00.000Z`
- 11:45 — `2026-10-28T11:45:00.000Z`
- 12:00 — `2026-10-28T12:00:00.000Z`
- 13:30 — `2026-10-28T13:30:00.000Z`
- 14:30 — `2026-10-28T14:30:00.000Z`
- 14:45 — `2026-10-28T14:45:00.000Z`
- 15:00 — `2026-10-28T15:00:00.000Z`
- 15:15 — `2026-10-28T15:15:00.000Z`
- 15:30 — `2026-10-28T15:30:00.000Z`
- 15:45 — `2026-10-28T15:45:00.000Z`
- 16:00 — `2026-10-28T16:00:00.000Z`
- 16:15 — `2026-10-28T16:15:00.000Z`
- 16:30 — `2026-10-28T16:30:00.000Z`
- 16:45 — `2026-10-28T16:45:00.000Z`
- 17:00 — `2026-10-28T17:00:00.000Z`
- 17:15 — `2026-10-28T17:15:00.000Z`
- 17:30 — `2026-10-28T17:30:00.000Z`
- 17:45 — `2026-10-28T17:45:00.000Z`
- 18:00 — `2026-10-28T18:00:00.000Z`

### Thursday 29 October

- 12:45 — `2026-10-29T12:45:00.000Z`
- 13:00 — `2026-10-29T13:00:00.000Z`
- 13:15 — `2026-10-29T13:15:00.000Z`
- 13:30 — `2026-10-29T13:30:00.000Z`
- 13:45 — `2026-10-29T13:45:00.000Z`
- 14:00 — `2026-10-29T14:00:00.000Z`
- 14:15 — `2026-10-29T14:15:00.000Z`
- 14:30 — `2026-10-29T14:30:00.000Z`
- 14:45 — `2026-10-29T14:45:00.000Z`
- 15:00 — `2026-10-29T15:00:00.000Z`
- 15:15 — `2026-10-29T15:15:00.000Z`
- 15:30 — `2026-10-29T15:30:00.000Z`
- 17:00 — `2026-10-29T17:00:00.000Z`
- 17:15 — `2026-10-29T17:15:00.000Z`
- 17:30 — `2026-10-29T17:30:00.000Z`
- 17:45 — `2026-10-29T17:45:00.000Z`
- 18:00 — `2026-10-29T18:00:00.000Z`

### Friday 30 October

- 09:00 — `2026-10-30T09:00:00.000Z`
- 09:15 — `2026-10-30T09:15:00.000Z`
- 09:30 — `2026-10-30T09:30:00.000Z`
- 10:30 — `2026-10-30T10:30:00.000Z`
- 10:45 — `2026-10-30T10:45:00.000Z`
- 11:00 — `2026-10-30T11:00:00.000Z`
- 11:15 — `2026-10-30T11:15:00.000Z`
- 11:30 — `2026-10-30T11:30:00.000Z`
- 11:45 — `2026-10-30T11:45:00.000Z`
- 12:00 — `2026-10-30T12:00:00.000Z`
- 12:15 — `2026-10-30T12:15:00.000Z`
- 12:30 — `2026-10-30T12:30:00.000Z`
- 12:45 — `2026-10-30T12:45:00.000Z`
- 13:00 — `2026-10-30T13:00:00.000Z`
- 13:15 — `2026-10-30T13:15:00.000Z`
- 13:30 — `2026-10-30T13:30:00.000Z`

### Monday 2 November

- 11:00 — `2026-11-02T11:00:00.000Z`
- 11:15 — `2026-11-02T11:15:00.000Z`
- 11:30 — `2026-11-02T11:30:00.000Z`
- 11:45 — `2026-11-02T11:45:00.000Z`
- 12:00 — `2026-11-02T12:00:00.000Z`
- 12:15 — `2026-11-02T12:15:00.000Z`
- 12:30 — `2026-11-02T12:30:00.000Z`
- 14:00 — `2026-11-02T14:00:00.000Z`
- 14:15 — `2026-11-02T14:15:00.000Z`
- 14:30 — `2026-11-02T14:30:00.000Z`
- 14:45 — `2026-11-02T14:45:00.000Z`
- 15:00 — `2026-11-02T15:00:00.000Z`
- 15:15 — `2026-11-02T15:15:00.000Z`
- 15:30 — `2026-11-02T15:30:00.000Z`
- 16:30 — `2026-11-02T16:30:00.000Z`
- 16:45 — `2026-11-02T16:45:00.000Z`
- 17:00 — `2026-11-02T17:00:00.000Z`
- 17:15 — `2026-11-02T17:15:00.000Z`
- 17:30 — `2026-11-02T17:30:00.000Z`
- 17:45 — `2026-11-02T17:45:00.000Z`
- 18:00 — `2026-11-02T18:00:00.000Z`

### Wednesday 4 November

- 17:00 — `2026-11-04T17:00:00.000Z`
- 17:15 — `2026-11-04T17:15:00.000Z`
- 17:30 — `2026-11-04T17:30:00.000Z`
- 17:45 — `2026-11-04T17:45:00.000Z`
- 18:00 — `2026-11-04T18:00:00.000Z`

### Thursday 5 November

- 09:00 — `2026-11-05T09:00:00.000Z`
- 09:15 — `2026-11-05T09:15:00.000Z`
- 09:30 — `2026-11-05T09:30:00.000Z`
- 10:30 — `2026-11-05T10:30:00.000Z`
- 12:45 — `2026-11-05T12:45:00.000Z`
- 13:00 — `2026-11-05T13:00:00.000Z`
- 13:15 — `2026-11-05T13:15:00.000Z`
- 13:30 — `2026-11-05T13:30:00.000Z`
- 13:45 — `2026-11-05T13:45:00.000Z`
- 14:00 — `2026-11-05T14:00:00.000Z`
- 14:15 — `2026-11-05T14:15:00.000Z`
- 14:30 — `2026-11-05T14:30:00.000Z`
- 14:45 — `2026-11-05T14:45:00.000Z`
- 15:00 — `2026-11-05T15:00:00.000Z`
- 15:15 — `2026-11-05T15:15:00.000Z`
- 15:30 — `2026-11-05T15:30:00.000Z`
- 17:00 — `2026-11-05T17:00:00.000Z`
- 17:15 — `2026-11-05T17:15:00.000Z`
- 17:30 — `2026-11-05T17:30:00.000Z`
- 17:45 — `2026-11-05T17:45:00.000Z`
- 18:00 — `2026-11-05T18:00:00.000Z`

### Friday 6 November

- 09:00 — `2026-11-06T09:00:00.000Z`
- 09:15 — `2026-11-06T09:15:00.000Z`
- 09:30 — `2026-11-06T09:30:00.000Z`
- 10:30 — `2026-11-06T10:30:00.000Z`
- 10:45 — `2026-11-06T10:45:00.000Z`
- 11:00 — `2026-11-06T11:00:00.000Z`
- 11:15 — `2026-11-06T11:15:00.000Z`
- 11:30 — `2026-11-06T11:30:00.000Z`
- 11:45 — `2026-11-06T11:45:00.000Z`
- 12:00 — `2026-11-06T12:00:00.000Z`
- 12:15 — `2026-11-06T12:15:00.000Z`
- 12:30 — `2026-11-06T12:30:00.000Z`
- 12:45 — `2026-11-06T12:45:00.000Z`
- 13:00 — `2026-11-06T13:00:00.000Z`
- 13:15 — `2026-11-06T13:15:00.000Z`
- 13:30 — `2026-11-06T13:30:00.000Z`

## How to book

1. **Read live slots.** `GET https://semaloop.com/api/booking/availability?timezone=Europe/London` returns `slots`, each with `startIso`, `endIso` and a human-readable `local` label in the zone you asked for.
2. **Book one.** `POST https://semaloop.com/api/booking` with a JSON body:

```bash
curl -X POST https://semaloop.com/api/booking \
  -H 'Content-Type: application/json' \
  -d '{
    "startTime": "2026-10-26T11:00:00.000Z",
    "email": "jane@example.com",
    "name": "Jane Doe",
    "company": "Example Inc",
    "timezone": "Europe/London",
    "surface": "agent"
  }'
```

| Field | Required | Notes |
| --- | --- | --- |
| `startTime` | yes | A slot's `startIso`, or its `start` in UTC milliseconds. Must be a slot currently on offer. |
| `email` | yes | The attendee's work email. The invite is sent here. |
| `company` | yes | The attendee's company name. |
| `name` | no | Full name. Defaults to the part of the email before the @. |
| `timezone` | no | IANA zone the invite is written in. Defaults to Europe/London. |
| `surface` | no | Send `agent` so we know the booking came from an agent. |

## Responses

- **200** `{ "start": 1767276000000, "end": 1767277800000, "startIso": "...", "endIso": "..." }`: booked. The attendee receives a calendar invite.
- **400** `{ "error": "..." }`: a field is missing or invalid. The message names the problem.
- **409** `{ "error": "...", "alternatives": [...] }`: the slot was taken or is not on offer. `alternatives` holds the nearest open slots in the same shape as the availability endpoint; pick one and retry.
- **502** `{ "error": "..." }`: the calendar provider failed. Retry once, then fall back to emailing demo@semaloop.com.

The same calls are described in the [OpenAPI specification](https://semaloop.com/openapi.json) (`listDemoAvailability`, `bookDemo`). In a browser with WebMCP, https://semaloop.com/demo registers `semaloop_demo_availability` and `semaloop_book_demo` tools.
