Search language schools abroad, compare courses, dates and prices, and request bookings.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Send a question to the school without a full trip configuration. Requires OAuth requests scope. Optional idempotency_key.
Student message to the school.
Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.
Optional first_name, last_name. Email always comes from the verified account.
Optional trip_id from save_trip.
ISO 4217 currency for prices in this call. Usually EUR.
Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.
Optional alias of idempotency_key.
Optional. Same semantics as create_booking (24 hour replay window).
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Send a question to the school without a full trip configuration. Requires OAuth requests scope. Optional idempotency_key.
| Argument | Type | Description |
|---|---|---|
| contact | object | Optional first_name, last_name. Email always comes from the verified account. |
| message* | string | Student message to the school. |
| trip_id | string | Optional trip_id from save_trip. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id* | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| configuration | object | Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras. |
| idempotencyKey | string | Optional alias of idempotency_key. |
| idempotency_key | string | Optional. Same semantics as create_booking (24 hour replay window). |
{
"type": "object",
"required": [
"school_id",
"message"
],
"properties": {
"contact": {
"type": "object",
"description": "Optional first_name, last_name. Email always comes from the verified account.",
"additionalProperties": true
},
"message": {
"type": "string",
"description": "Student message to the school."
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"configuration": {
"type": "object",
"properties": {
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
},
"students": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
},
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
}
},
"additionalProperties": true
},
"description": "One object per traveller. courseId comes from list_courses."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
}
},
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Same semantics as create_booking (24 hour replay window)."
}
},
"additionalProperties": true
}Live checkout quote for a configuration. Not a booking. Call before create_booking and before telling the student a final price.
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| trip_id | string | Optional saved trip id; when set, the quote may be stored on that trip. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| country_code | string | Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable. |
| discountCode | string | Optional promotion or discount code. |
| configuration | object | Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras. |
{
"type": "object",
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"trip_id": {
"type": "string",
"description": "Optional saved trip id; when set, the quote may be stored on that trip."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"country_code": {
"type": "string",
"examples": [
"NL",
"DE"
],
"description": "Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable."
},
"discountCode": {
"type": "string",
"description": "Optional promotion or discount code."
},
"configuration": {
"type": "object",
"properties": {
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
},
"students": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
},
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
}
},
"additionalProperties": true
},
"description": "One object per traveller. courseId comes from list_courses."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
}
},
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true
}
},
"additionalProperties": true
}Submit an unpaid booking for a bookings_live school (same path as the website Book now flow). The school still confirms availability; Extralingo emails the student; down payment is due within 5 days of school confirmation via Extralingo only. Never tell the user they are confirmed or paid. Requires OAuth bookings scope (Bearer token). Optional idempotency_key replays the same payload within 24 hours.
| Argument | Type | Description |
|---|---|---|
| phone | string | Student phone number (required). |
| contact | object | Optional first_name, last_name, phone. Email always comes from the verified account; contact.email must match or be omitted. |
| trip_id | string | Optional trip_id from save_trip linking this booking to a draft. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| phoneCountry | string | ISO 3166-1 alpha-2 country for the phone (e.g. NL). |
| configuration | object | Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras. |
| termsAccepted |
Email continue_url (/s/{id}) to the verified account inbox. Requires OAuth trips scope. Rate-limited. Not a booking; you can share continue_url without emailing.
| Argument | Type | Description |
|---|---|---|
| string | Optional. Must match the verified OAuth account email if sent. The link is always sent to that account. | |
| locale | string | Response language and site context. One of en, nl, da, sv. |
| trip_id* | string | trip_id from save_trip. |
| lastName | string | Optional salutation for the email body. |
| firstName | string | Optional salutation for the email body. |
{
"type": "object",
"required": [
"trip_id"
],
"properties": {
"email": {
"type": "string",
"description": "Optional. Must match the verified OAuth account email if sent. The link is always sent to that account."
},
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"trip_id": {
"type": "string",
"description": "trip_id from save_trip."
},
"lastName": {
"type": "string",
"description": "Optional salutation for the email body."
},
"firstName": {
"type": "string",
"description": "Optional salutation for the email body."
}
},
"additionalProperties": true
}One group from list_accommodations (group_id): type, room_types, meal/board options, distance, amenities, age and min-stay rules, and week prices for startDate and currency. Use after list_accommodations, before save_trip or calculate_trip_price, or to answer questions about one option. Week prices are indicative; call calculate_trip_price for a checkout total.
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| group_id* | string | Accommodation group id from list_accommodations. |
| startDate | string | Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates. |
{
"type": "object",
"required": [
"group_id"
],
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"group_id": {
"type": "string",
"description": "Accommodation group id from list_accommodations."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
}
},
"additionalProperties": true
}Details for one course id from list_courses (pricing rows, supplements, metadata).
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| course_id* | string | Course product id from list_courses. |
| school_id* | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| startDate | string | Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates. |
{
"type": "object",
"required": [
"course_id",
"school_id"
],
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"course_id": {
"type": "string",
"description": "Course product id from list_courses."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
}
},
"additionalProperties": true
}School briefing: profile, cancellation policy, reviews, image URLs, bookings_live flag, and optional hero image for chat UI. Requires school_id from search_language_schools.
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| school_id* | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| include_hero_image | boolean | When true, structuredContent may include a compressed JPEG in MCP image content; hero_image is stripped from structuredContent after attach. |
{
"type": "object",
"required": [
"school_id"
],
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"include_hero_image": {
"type": "boolean",
"default": true,
"description": "When true, structuredContent may include a compressed JPEG in MCP image content; hero_image is stripped from structuredContent after attach."
}
},
"additionalProperties": true
}Valid filter values for search_language_schools (languages, countries, cities, course types, and other facets).
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
{
"type": "object",
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
}
},
"additionalProperties": true
}Load a saved trip by trip_id from save_trip. Returns continue_url for website handoff with configuration restored.
| Argument | Type | Description |
|---|---|---|
| trip_id* | string | trip_id returned by save_trip. |
{
"type": "object",
"required": [
"trip_id"
],
"properties": {
"trip_id": {
"type": "string",
"description": "trip_id returned by save_trip."
}
},
"additionalProperties": true
}Accommodation groups for a school. Use group ids in save_trip configuration (accommodationGroupId).
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id* | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| startDate | string | Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates. |
| country_code | string | Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable. |
{
"type": "object",
"required": [
"school_id"
],
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"country_code": {
"type": "string",
"examples": [
"NL",
"DE"
],
"description": "Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable."
}
},
"additionalProperties": true
}Live course catalogue for a bookings_live school (course ids, weeks, prices). Use returned course ids inside save_trip configuration.
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id* | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| startDate | string | Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates. |
| country_code | string | Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable. |
{
"type": "object",
"required": [
"school_id"
],
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"country_code": {
"type": "string",
"examples": [
"NL",
"DE"
],
"description": "Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable."
}
},
"additionalProperties": true
}Allowed course start dates (typically Mondays) for a school. Use startDate values in list_courses and configuration.startDate.
| Argument | Type | Description |
|---|---|---|
| locale | string | Response language and site context. One of en, nl, da, sv. |
| school_id* | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
{
"type": "object",
"required": [
"school_id"
],
"properties": {
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
}
},
"additionalProperties": true
}Trip discussion: trip_id or school_id+configuration plus message. ask_school_question: question without a trip. request_quote: personal quote (comments) when not booking. School gets the config; Extralingo emails the verified account and coordinates replies. Returns kind, newBookingId, redirectUrl, message (not a booking). OAuth scope requests. Optional idempotency_key.
| Argument | Type | Description |
|---|---|---|
| contact | object | Optional first_name, last_name. Email always comes from the verified account. |
| message | string | Student message to the school. |
| trip_id | string | Optional trip_id from save_trip. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| configuration | object | Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras. |
| idempotencyKey | string | Optional alias of idempotency_key. |
| idempotency_key | string | Optional. Same semantics as create_booking (24 hour replay window). |
Ask the school for a personal quote when bookings_live is false or the student is not ready to book. Requires OAuth requests scope. Optional idempotency_key.
| Argument | Type | Description |
|---|---|---|
| contact | object | Optional first_name, last_name. Email always comes from the verified account. |
| trip_id | string | Optional trip_id from save_trip. |
| comments | string | Student message to the school. |
| currency | string | ISO 4217 currency for prices in this call. Usually EUR. |
| school_id | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| configuration | object | Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras. |
| idempotencyKey | string | Optional alias of idempotency_key. |
| idempotency_key | string | Optional. Same semantics as create_booking (24 hour replay window). |
Create or update a server-side trip draft. Returns trip_id, url, trip_url, and continue_url (/s/{id}) so the student can restore selections on Extralingo.com. Not a booking. Requires OAuth trips scope (Bearer token).
| Argument | Type | Description |
|---|---|---|
| string | Optional student email for anonymous drafts. With OAuth, the verified account email is used. | |
| locale | string | Response language and site context. One of en, nl, da, sv. |
| trip_id | string | Omit to create a new trip. Pass an existing trip_id from save_trip to update the same continue_url. |
| school_id | integer | Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID. |
| configuration | object | Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras. |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Optional student email for anonymous drafts. With OAuth, the verified account email is used."
},
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"trip_id": {
"type": "string",
"description": "Omit to create a new trip. Pass an existing trip_id from save_trip to update the same continue_url."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"configuration": {
"type": "object",
"properties": {
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
},
"students": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
},
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
}
},
"additionalProperties": true
},
"description": "One object per traveller. courseId comes from list_courses."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
}
},
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true
}
},
"additionalProperties": true
}Search cities, countries, and school names. Use before search_language_schools to resolve place names to slugs.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Maximum results (1–20). |
| query | string | Destination or school name prefix. Empty returns popular destinations. |
| locale | string | Response language and site context. One of en, nl, da, sv. |
| language | string | Optional language slug to restrict destinations (e.g. spanish). |
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"default": 8,
"maximum": 20,
"minimum": 1,
"description": "Maximum results (1–20)."
},
"query": {
"type": "string",
"description": "Destination or school name prefix. Empty returns popular destinations."
},
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"language": {
"type": "string",
"description": "Optional language slug to restrict destinations (e.g. spanish)."
}
},
"additionalProperties": true
}Search and rank language schools. Returns school_id, url, indicative from-price, and reviews. Prices are not a booking quote; call calculate_trip_price before quoting a total.
| Argument | Type | Description |
|---|---|---|
| city | string | Single city slug filter. Prefer cities[] for multiple. |
| limit | integer | Maximum schools to return (1–20). |
| query | string | Free-text search (school name, city, or keyword). Empty returns popular matches for the other filters. |
| cities | array | City slug filters from get_school_filters. |
| locale | string | Response language and site context. One of en, nl, da, sv. |
| country | string | Country slug or name filter from get_school_filters. |
| language | string | Language slug filter from get_school_filters (e.g. spanish, english). |
| course_type | string | Course type slug from get_school_filters (e.g. intensive, private). |
| boolean |
| Must be true when not using OAuth (OAuth grants record acceptance). |
| idempotencyKey | string | Optional alias of idempotency_key. |
| studentDetails | array | Per-student details aligned with configuration.students (names, dates of birth, etc.). |
| idempotency_key | string | Optional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed. |
| privacyAccepted | boolean | Must be true when not using OAuth. |
| specialRequests | string | Free-text notes for the school. |
{
"type": "object",
"properties": {
"phone": {
"type": "string",
"description": "Student phone number (required)."
},
"contact": {
"type": "object",
"description": "Optional first_name, last_name, phone. Email always comes from the verified account; contact.email must match or be omitted.",
"additionalProperties": true
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip linking this booking to a draft."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"phoneCountry": {
"type": "string",
"description": "ISO 3166-1 alpha-2 country for the phone (e.g. NL)."
},
"configuration": {
"type": "object",
"properties": {
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
},
"students": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
},
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
}
},
"additionalProperties": true
},
"description": "One object per traveller. courseId comes from list_courses."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
}
},
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true
},
"termsAccepted": {
"type": "boolean",
"description": "Must be true when not using OAuth (OAuth grants record acceptance)."
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"studentDetails": {
"type": "array",
"items": {
"type": "object",
"additionalProperties": true
},
"description": "Per-student details aligned with configuration.students (names, dates of birth, etc.)."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed."
},
"privacyAccepted": {
"type": "boolean",
"description": "Must be true when not using OAuth."
},
"specialRequests": {
"type": "string",
"description": "Free-text notes for the school."
}
},
"additionalProperties": true
}{
"type": "object",
"properties": {
"contact": {
"type": "object",
"description": "Optional first_name, last_name. Email always comes from the verified account.",
"additionalProperties": true
},
"message": {
"type": "string",
"description": "Student message to the school."
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"configuration": {
"type": "object",
"properties": {
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
},
"students": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
},
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
}
},
"additionalProperties": true
},
"description": "One object per traveller. courseId comes from list_courses."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
}
},
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Same semantics as create_booking (24 hour replay window)."
}
},
"additionalProperties": true
}{
"type": "object",
"properties": {
"contact": {
"type": "object",
"description": "Optional first_name, last_name. Email always comes from the verified account.",
"additionalProperties": true
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip."
},
"comments": {
"type": "string",
"description": "Student message to the school."
},
"currency": {
"type": "string",
"default": "EUR",
"examples": [
"EUR"
],
"description": "ISO 4217 currency for prices in this call. Usually EUR."
},
"school_id": {
"type": "integer",
"examples": [
12345
],
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID."
},
"configuration": {
"type": "object",
"properties": {
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
},
"students": {
"type": "array",
"items": {
"type": "object",
"properties": {
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
},
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
}
},
"additionalProperties": true
},
"description": "One object per traveller. courseId comes from list_courses."
},
"startDate": {
"type": "string",
"examples": [
"2026-09-07"
],
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates."
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
}
},
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Same semantics as create_booking (24 hour replay window)."
}
},
"additionalProperties": true
}{
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "Single city slug filter. Prefer cities[] for multiple."
},
"limit": {
"type": "integer",
"default": 5,
"maximum": 20,
"minimum": 1,
"description": "Maximum schools to return (1–20)."
},
"query": {
"type": "string",
"examples": [
"Barcelona intensive Spanish"
],
"description": "Free-text search (school name, city, or keyword). Empty returns popular matches for the other filters."
},
"cities": {
"type": "array",
"items": {
"type": "string",
"description": "City slug."
},
"description": "City slug filters from get_school_filters."
},
"locale": {
"enum": [
"en",
"nl",
"da",
"sv"
],
"type": "string",
"examples": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv."
},
"country": {
"type": "string",
"description": "Country slug or name filter from get_school_filters."
},
"language": {
"type": "string",
"examples": [
"spanish"
],
"description": "Language slug filter from get_school_filters (e.g. spanish, english)."
},
"course_type": {
"type": "string",
"description": "Course type slug from get_school_filters (e.g. intensive, private)."
}
},
"additionalProperties": true
}