Extralingo
Search language schools abroad, compare courses, dates and prices, and request bookings.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"extralingo": {
"url": "https://www.extralingo.com/mcp"
}
}
}Remote endpoints
https://www.extralingo.com/mcpstreamable-httpWhat it can do
Tool inventory
Tools (17)
🟢search_language_schools(query, language, country, city, cities, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Free-text search (school name, city, or keyword). Empty returns popular matches for the other filters.",
"examples": [
"Barcelona intensive Spanish"
]
},
"language": {
"type": "string",
"description": "Language slug filter from get_school_filters (e.g. spanish, english).",
"examples": [
"spanish"
]
},
"country": {
"type": "string",
"description": "Country slug or name filter from get_school_filters."
},
"city": {
"type": "string",
"description": "Single city slug filter. Prefer cities[] for multiple."
},
"cities": {
"type": "array",
"description": "City slug filters from get_school_filters.",
"items": {
"type": "string",
"description": "City slug."
}
},
"course_type": {
"type": "string",
"description": "Course type slug from get_school_filters (e.g. intensive, private)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 5,
"description": "Maximum schools to return (1–20)."
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"data": {
"type": "object",
"description": "Meilisearch-style payload with hits[] (school_id, title, url, city, country, pricing hints).",
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢search_destinations(query, language, limit, locale)
Search cities, countries, and school names. Use before search_language_schools to resolve place names to slugs.
Input Schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Destination or school name prefix. Empty returns popular destinations."
},
"language": {
"type": "string",
"description": "Optional language slug to restrict destinations (e.g. spanish)."
},
"limit": {
"type": "integer",
"minimum": 1,
"maximum": 20,
"default": 8,
"description": "Maximum results (1–20)."
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"query": {
"type": "string"
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
]
},
"hits": {
"type": "array",
"description": "Destination matches.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"schools": {
"type": "array",
"description": "Optional school name fallback hits.",
"items": {
"type": "object",
"additionalProperties": true
}
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢get_school_filters(locale)
Valid filter values for search_language_schools (languages, countries, cities, course types, and other facets).
Input Schema
{
"type": "object",
"properties": {
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"data": {
"type": "object",
"description": "Facet lists keyed by filter name.",
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢get_school(school_id, locale, include_hero_image)
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.
Input Schema
{
"type": "object",
"properties": {
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
},
"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."
}
},
"required": [
"school_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"data": {
"type": "object",
"description": "School profile (title, url, city, country, bookings_live, reviews, images[]).",
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢list_courses(school_id, startDate, currency, locale, country_code)
Live course catalogue for a bookings_live school (course ids, weeks, prices). Use returned course ids inside save_trip configuration.
Input Schema
{
"type": "object",
"properties": {
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
},
"country_code": {
"type": "string",
"description": "Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.",
"examples": [
"NL",
"DE"
]
}
},
"required": [
"school_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"course_types": {
"type": "array",
"description": "Course types with nested courses[] (course ids, weeks, week prices).",
"items": {
"type": "object",
"additionalProperties": true
}
},
"school": {
"type": [
"object",
"null"
],
"additionalProperties": true,
"description": "School metadata from the booking API."
},
"currency": {
"type": "string"
},
"start_date": {
"type": "string",
"description": "Effective start date used for pricing (YYYY-MM-DD)."
},
"busy_school_months": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"pricing_rule": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"has_location_discounts": {
"type": "boolean"
},
"location_discount": {
"type": [
"object",
"null"
],
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢list_starting_dates(school_id, locale)
Allowed course start dates (typically Mondays) for a school. Use startDate values in list_courses and configuration.startDate.
Input Schema
{
"type": "object",
"properties": {
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"required": [
"school_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"dates": {
"type": "array",
"description": "Bookable course start dates (typically Mondays, YYYY-MM-DD strings).",
"items": {
"type": "string"
}
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢list_accommodations(school_id, startDate, currency, locale, country_code)
Accommodation groups for a school. Use group ids in save_trip configuration (accommodationGroupId).
Input Schema
{
"type": "object",
"properties": {
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
},
"country_code": {
"type": "string",
"description": "Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.",
"examples": [
"NL",
"DE"
]
}
},
"required": [
"school_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"accommodation_groups": {
"type": "array",
"description": "Flat list of accommodation groups (id for get_accommodation_details / configuration).",
"items": {
"type": "object",
"additionalProperties": true
}
},
"accommodation_categories": {
"type": "array",
"description": "Same groups nested by category for display.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"allows_double_room_individual_bookings": {
"type": "boolean"
},
"school": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"currency": {
"type": "string"
},
"start_date": {
"type": "string"
},
"busy_school_months": {
"type": [
"object",
"null"
],
"additionalProperties": true
},
"has_location_discounts": {
"type": "boolean"
},
"location_discount": {
"type": [
"object",
"null"
],
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢get_course_details(course_id, school_id, startDate, currency, locale)
Details for one course id from list_courses (pricing rows, supplements, metadata).
Input Schema
{
"type": "object",
"properties": {
"course_id": {
"type": "string",
"description": "Course product id from list_courses."
},
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"required": [
"course_id",
"school_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"course": {
"type": [
"object",
"null"
],
"description": "Single course product with pricing rows and supplements for the requested start date.",
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢get_accommodation_details(group_id, startDate, currency, locale)
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.
Input Schema
{
"type": "object",
"properties": {
"group_id": {
"type": "string",
"description": "Accommodation group id from list_accommodations."
},
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"required": [
"group_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"group": {
"type": "object",
"description": "Accommodation group from GET /v3/accommodations/{id} (v2 grouping): labels, classification, room and meal options, facilities, rules, and pricing hints for the requested start date.",
"additionalProperties": true,
"properties": {
"id": {
"type": "string",
"description": "Group id (matches group_id)."
},
"name": {
"type": "string",
"description": "Display name of the accommodation group."
},
"group_name": {
"type": "string",
"description": "Grouped title when room-type grouping is enabled."
},
"classification": {
"type": "object",
"description": "Accommodation type, class, and room metadata.",
"additionalProperties": true
},
"distance": {
"type": [
"string",
"object",
"null"
],
"description": "Distance-to-school summary (string or structured object from the API).",
"additionalProperties": true
},
"location": {
"type": "object",
"description": "Address, distance_to_school, and travel-time hints.",
"additionalProperties": true
},
"room_types": {
"type": "array",
"description": "Room variants, each with meal_options, stay_length, and week pricing.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"meal_options": {
"type": "array",
"description": "Board/meal plans with pricing_for_requested_weeks when not split by room_types.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"amenities": {
"type": "array",
"description": "Facilities and highlighted amenities.",
"items": {
"type": "object",
"additionalProperties": true
}
},
"occupancy": {
"type": "object",
"description": "Minimum/maximum age and occupancy limits.",
"additionalProperties": true
},
"stay_length": {
"type": "object",
"description": "Minimum and maximum stay in weeks.",
"additionalProperties": true
}
}
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢calculate_trip_price(school_id, trip_id, configuration, currency, locale, ...)
Live checkout quote for a configuration. Not a booking. Call before create_booking and before telling the student a final price.
Input Schema
{
"type": "object",
"properties": {
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"trip_id": {
"type": "string",
"description": "Optional saved trip id; when set, the quote may be stored on that trip."
},
"configuration": {
"type": "object",
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true,
"properties": {
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"students": {
"type": "array",
"description": "One object per traveller. courseId comes from list_courses.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
},
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
}
}
}
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
},
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
}
}
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
},
"discountCode": {
"type": "string",
"description": "Optional promotion or discount code."
},
"country_code": {
"type": "string",
"description": "Visitor country ISO 3166-1 alpha-2 (e.g. NL). Affects fee display where applicable.",
"examples": [
"NL",
"DE"
]
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"quote": {
"type": "object",
"description": "Human-oriented price summary.",
"additionalProperties": true
},
"data": {
"type": "object",
"description": "Full pricing breakdown from the booking engine.",
"additionalProperties": true
}
},
"required": [
"success"
],
"additionalProperties": true
}🟡save_trip(school_id, trip_id, configuration, email, locale)
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).
Input Schema
{
"type": "object",
"properties": {
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"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."
},
"configuration": {
"type": "object",
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true,
"properties": {
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"students": {
"type": "array",
"description": "One object per traveller. courseId comes from list_courses.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
},
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
}
}
}
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
},
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
}
}
},
"email": {
"type": "string",
"description": "Optional student email for anonymous drafts. With OAuth, the verified account email is used."
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"trip_id": {
"type": "string",
"description": "Shareable trip id (/s/{id})."
},
"school_id": {
"type": "integer",
"description": "Craft school entry id."
},
"school_name": {
"type": "string"
},
"school_url": {
"type": "string"
},
"url": {
"type": "string",
"description": "Legacy alias of continue_url."
},
"trip_url": {
"type": "string"
},
"continue_url": {
"type": "string",
"description": "Shareable Extralingo URL that restores configuration."
},
"configuration": {
"type": "object",
"additionalProperties": true
},
"summary": {
"type": "string",
"description": "Human-readable configuration summary for agents."
},
"note": {
"type": "string"
}
},
"required": [
"success"
],
"additionalProperties": true
}🟢get_trip(trip_id)
Load a saved trip by trip_id from save_trip. Returns continue_url for website handoff with configuration restored.
Input Schema
{
"type": "object",
"properties": {
"trip_id": {
"type": "string",
"description": "trip_id returned by save_trip."
}
},
"required": [
"trip_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"trip_id": {
"type": "string",
"description": "Shareable trip id (/s/{id})."
},
"school_id": {
"type": "integer",
"description": "Craft school entry id."
},
"school_name": {
"type": "string"
},
"school_url": {
"type": "string"
},
"url": {
"type": "string",
"description": "Legacy alias of continue_url."
},
"trip_url": {
"type": "string"
},
"continue_url": {
"type": "string",
"description": "Shareable Extralingo URL that restores configuration."
},
"configuration": {
"type": "object",
"additionalProperties": true
},
"summary": {
"type": "string",
"description": "Human-readable configuration summary for agents."
},
"note": {
"type": "string"
}
},
"required": [
"success"
],
"additionalProperties": true
}⚪email_trip(trip_id, email, firstName, lastName, locale)
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.
Input Schema
{
"type": "object",
"properties": {
"trip_id": {
"type": "string",
"description": "trip_id from save_trip."
},
"email": {
"type": "string",
"description": "Optional. Must match the verified OAuth account email if sent. The link is always sent to that account."
},
"firstName": {
"type": "string",
"description": "Optional salutation for the email body."
},
"lastName": {
"type": "string",
"description": "Optional salutation for the email body."
},
"locale": {
"type": "string",
"enum": [
"en",
"nl",
"da",
"sv"
],
"description": "Response language and site context. One of en, nl, da, sv.",
"examples": [
"en",
"nl",
"da",
"sv"
]
}
},
"required": [
"trip_id"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"trip_id": {
"type": "string"
},
"emailed_to": {
"type": "string",
"description": "Verified account inbox that received the email."
},
"message": {
"type": "string"
},
"url": {
"type": "string",
"description": "Legacy alias of continue_url."
},
"trip_url": {
"type": "string"
},
"continue_url": {
"type": "string"
}
},
"required": [
"success"
],
"additionalProperties": true
}🟡create_booking(trip_id, school_id, configuration, phone, phoneCountry, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip linking this booking to a draft."
},
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"configuration": {
"type": "object",
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true,
"properties": {
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"students": {
"type": "array",
"description": "One object per traveller. courseId comes from list_courses.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
},
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
}
}
}
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
},
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
}
}
},
"phone": {
"type": "string",
"description": "Student phone number (required)."
},
"phoneCountry": {
"type": "string",
"description": "ISO 3166-1 alpha-2 country for the phone (e.g. NL)."
},
"termsAccepted": {
"type": "boolean",
"description": "Must be true when not using OAuth (OAuth grants record acceptance)."
},
"privacyAccepted": {
"type": "boolean",
"description": "Must be true when not using OAuth."
},
"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
},
"studentDetails": {
"type": "array",
"description": "Per-student details aligned with configuration.students (names, dates of birth, etc.).",
"items": {
"type": "object",
"additionalProperties": true
}
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"idempotency_key": {
"type": "string",
"description": "Optional. Same key + same payload within 24 hours replays the original response; conflicting payload returns validation_failed."
},
"specialRequests": {
"type": "string",
"description": "Free-text notes for the school."
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"bookingId": {
"type": [
"integer",
"null"
],
"description": "Craft booking id when returned by the booking engine."
},
"bookingReference": {
"type": [
"string",
"null"
]
},
"status": {
"type": "string",
"description": "e.g. awaiting_school_confirmation."
},
"redirectUrl": {
"type": [
"string",
"null"
]
},
"studentMessage": {
"type": "string"
},
"agent_must_tell_the_user": {
"type": "array",
"items": {
"type": "string"
}
}
},
"required": [
"success"
],
"additionalProperties": true
}⚪request_quote(idempotency_key, idempotencyKey, trip_id, school_id, configuration, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"idempotency_key": {
"type": "string",
"description": "Optional. Same semantics as create_booking (24 hour replay window)."
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip."
},
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"configuration": {
"type": "object",
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true,
"properties": {
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"students": {
"type": "array",
"description": "One object per traveller. courseId comes from list_courses.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
},
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
}
}
}
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
},
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
}
}
},
"comments": {
"type": "string",
"description": "Student message to the school."
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"contact": {
"type": "object",
"description": "Optional first_name, last_name. Email always comes from the verified account.",
"additionalProperties": true
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"kind": {
"type": "string",
"description": "Lead type on success.",
"enum": [
"quote"
]
},
"newBookingId": {
"type": [
"integer",
"null"
],
"description": "Craft newBookings entry id when created."
},
"redirectUrl": {
"type": [
"string",
"null"
],
"description": "Extralingo /my URL for the student to follow the request, when available."
},
"message": {
"type": "string",
"description": "Human-readable confirmation (not a booking confirmation)."
}
},
"required": [
"success"
],
"additionalProperties": true
}⚪request_discussion(idempotency_key, idempotencyKey, trip_id, school_id, configuration, ...)
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.
Input Schema
{
"type": "object",
"properties": {
"idempotency_key": {
"type": "string",
"description": "Optional. Same semantics as create_booking (24 hour replay window)."
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip."
},
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"configuration": {
"type": "object",
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true,
"properties": {
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"students": {
"type": "array",
"description": "One object per traveller. courseId comes from list_courses.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
},
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
}
}
}
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
},
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
}
}
},
"message": {
"type": "string",
"description": "Student message to the school."
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"contact": {
"type": "object",
"description": "Optional first_name, last_name. Email always comes from the verified account.",
"additionalProperties": true
}
},
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"kind": {
"type": "string",
"description": "Lead type on success.",
"enum": [
"discussion"
]
},
"newBookingId": {
"type": [
"integer",
"null"
],
"description": "Craft newBookings entry id when created."
},
"redirectUrl": {
"type": [
"string",
"null"
],
"description": "Extralingo /my URL for the student to follow the request, when available."
},
"message": {
"type": "string",
"description": "Human-readable confirmation (not a booking confirmation)."
}
},
"required": [
"success"
],
"additionalProperties": true
}🟡ask_school_question(idempotency_key, idempotencyKey, trip_id, school_id, configuration, ...)
Send a question to the school without a full trip configuration. Requires OAuth requests scope. Optional idempotency_key.
Input Schema
{
"type": "object",
"properties": {
"idempotency_key": {
"type": "string",
"description": "Optional. Same semantics as create_booking (24 hour replay window)."
},
"idempotencyKey": {
"type": "string",
"description": "Optional alias of idempotency_key."
},
"trip_id": {
"type": "string",
"description": "Optional trip_id from save_trip."
},
"school_id": {
"type": "integer",
"description": "Craft CMS school entry id from search_language_schools hits (field school_id). Not the CRM UUID.",
"examples": [
12345
]
},
"configuration": {
"type": "object",
"description": "Same shape as the Extralingo school-page configurator: startDate (YYYY-MM-DD), students[] with courseId, weeks, optional accommodationGroupId, mealType, extras.",
"additionalProperties": true,
"properties": {
"startDate": {
"type": "string",
"description": "Course start calendar date (YYYY-MM-DD). Typically a Monday from list_starting_dates.",
"examples": [
"2026-09-07"
]
},
"students": {
"type": "array",
"description": "One object per traveller. courseId comes from list_courses.",
"items": {
"type": "object",
"additionalProperties": true,
"properties": {
"courseId": {
"type": "string",
"description": "Course product id from list_courses for this school."
},
"weeks": {
"type": "integer",
"minimum": 1,
"description": "Course duration in weeks."
}
}
}
},
"accommodationGroupId": {
"type": "string",
"description": "Accommodation group id from list_accommodations (optional)."
},
"mealType": {
"type": "string",
"description": "Meal plan key when accommodation is selected."
}
}
},
"message": {
"type": "string",
"description": "Student message to the school."
},
"currency": {
"type": "string",
"default": "EUR",
"description": "ISO 4217 currency for prices in this call. Usually EUR.",
"examples": [
"EUR"
]
},
"contact": {
"type": "object",
"description": "Optional first_name, last_name. Email always comes from the verified account.",
"additionalProperties": true
}
},
"required": [
"school_id",
"message"
],
"additionalProperties": true
}Output Schema
{
"type": "object",
"properties": {
"success": {
"const": true
},
"kind": {
"type": "string",
"description": "Lead type on success.",
"enum": [
"question"
]
},
"newBookingId": {
"type": [
"integer",
"null"
],
"description": "Craft newBookings entry id when created."
},
"redirectUrl": {
"type": [
"string",
"null"
],
"description": "Extralingo /my URL for the student to follow the request, when available."
},
"message": {
"type": "string",
"description": "Human-readable confirmation (not a booking confirmation)."
}
},
"required": [
"success"
],
"additionalProperties": true
}Community
Evidence