Extralingo
Search language schools abroad, compare courses, dates and prices, and request bookings.
¿Debería usar esto?
Calidad y seguridad
Basado en el análisis automatizado de las definiciones de herramientas y el cumplimiento del protocolo.
Costo de contexto
Este es el número aproximado de tokens que se consumen cada vez que las herramientas del servidor se cargan en el contexto de un modelo. Los recuentos más altos reducen la atención disponible para otras tareas.
Instalar
Instalación con un clic
Agrega esto a tu archivo `claude_desktop_config.json`:
{
"mcpServers": {
"extralingo": {
"url": "https://www.extralingo.com/mcp"
}
}
}Puntos de conexión remotos
https://www.extralingo.com/mcpstreamable-httpQué puede hacer
Inventario de herramientas
Herramientas (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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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).
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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).
Esquema de entrada
{
"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
}Esquema de salida
{
"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).
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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).
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"type": "object",
"properties": {
"trip_id": {
"type": "string",
"description": "trip_id returned by save_trip."
}
},
"required": [
"trip_id"
],
"additionalProperties": true
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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.
Esquema de entrada
{
"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
}Esquema de salida
{
"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
}Comunidad
Evidencia