---
title: "Submit an unpaid booking (school still confirms)"
method: POST
path: "/bookings"
tags: ["bookings"]
---

# Submit an unpaid booking (school still confirms)

`POST /bookings`

## Request

- Base URL: `https://www.extralingo.com/api/v1`
- URL: `https://www.extralingo.com/api/v1/bookings`
- Auth: HTTP bearer

Same path as the V2 school-page Book now flow. Not confirmed. Not paid. Contact email is always the verified account email. Optional Idempotency-Key header or idempotencyKey in JSON.

## Headers

- `Idempotency-Key` string

## Request body

- object
  - `trip_id` string
  - `school_id` integer
  - `configuration` object
  - `phone` string
  - `termsAccepted` boolean
  - `privacyAccepted` boolean
  - `idempotencyKey` string: Optional body alias of Idempotency-Key. Same key + same payload within 24h replays the response.
  - `contact` object: Optional first_name, last_name, phone. Email always comes from the verified account. A different contact.email is rejected.

## Response `200`

OK

- object

## Other responses

- `400`: Bad request
- `401`: Email verification required
- `404`: Not found
- `422`: Validation failed or idempotency key reused with a different payload
- `429`: Rate limited

---

[API](https://skmtc.dev/extralingo/apis/extralingo-public-api.md) · [All operations](https://skmtc.dev/extralingo/apis/extralingo-public-api/llms.txt) · [OpenAPI document](https://skmtc.dev/extralingo/apis/extralingo-public-api/revisions/e30a5e5bf44c?raw)
