Servidor MCP

Extralingo

com.extralingo/extralingo
Viajes y hospitalidad Público y accesible MCP 2026-07-28

Qué hace este MCP

Searches language schools abroad, compares courses and accommodations, calculates trip prices and submits booking or quote requests.

ask_school_question
Send a question to the school without a full trip configuration. Requires OAuth requests scope. Optional idempotency_key.
Acceso externo
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'kind': {'enum': ['question'], 'type': 'string', 'description': 'Lead type on success.'}, 'message': {'type': 'string', 'description': 'Human-readable confirmation (not a booking confirmation).'}, 'success': {'const': True}, 'redirectUrl': {'type': ['string', 'null'], 'description': 'Extralingo /my URL for the student to follow the request, when available.'}, 'newBookingId': {'type': ['integer', 'null'], 'description': 'Craft newBookings entry id when created.'}}, 'additionalProperties': True}
calculate_trip_price
Live checkout quote for a configuration. Not a booking. Call before create_booking and before telling the student a final price.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'data': {'type': 'object', 'description': 'Full pricing breakdown from the booking engine.', 'additionalProperties': True}, 'quote': {'type': 'object', 'description': 'Human-oriented price summary.', 'additionalProperties': True}, 'success': {'const': True}}, 'additionalProperties': True}
create_booking
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.
Acceso externo
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'status': {'type': 'string', 'description': 'e.g. awaiting_school_confirmation.'}, 'success': {'const': True}, 'bookingId': {'type': ['integer', 'null'], 'description': 'Craft booking id when returned by the booking engine.'}, 'redirectUrl': {'type': ['string', 'null']}, 'studentMessage': {'type': 'string'}, 'bookingReference': {'type': ['string', 'null']}, 'agent_must_tell_the_user': {'type': 'array', 'items': {'type': 'string'}}}, 'additionalProperties': True}
email_trip
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.
Acceso externo
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'url': {'type': 'string', 'description': 'Legacy alias of continue_url.'}, 'message': {'type': 'string'}, 'success': {'const': True}, 'trip_id': {'type': 'string'}, 'trip_url': {'type': 'string'}, 'emailed_to': {'type': 'string', 'description': 'Verified account inbox that received the email.'}, 'continue_url': {'type': 'string'}}, 'additionalProperties': True}
get_accommodation_details
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.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'group': {'type': 'object', 'properties': {'id': {'type': 'string', 'description': 'Group id (matches group_id).'}, 'name': {'type': 'string', 'description': 'Display name of the accommodation group.'}, '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}, 'amenities': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Facilities and highlighted amenities.'}, 'occupancy': {'type': 'object', 'description': 'Minimum/maximum age and occupancy limits.', 'additionalProperties': True}, 'group_name': {'type': 'string', 'description': 'Grouped title when room-type grouping is enabled.'}, 'room_types': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Room variants, each with meal_options, stay_length, and week pricing.'}, 'stay_length': {'type': 'object', 'description': 'Minimum and maximum stay in weeks.', 'additionalProperties': True}, 'meal_options': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Board/meal plans with pricing_for_requested_weeks when not split by room_types.'}, 'classification': {'type': 'object', 'description': 'Accommodation type, class, and room metadata.', 'additionalProperties': True}}, '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}, 'success': {'const': True}}, 'additionalProperties': True}
get_course_details
Details for one course id from list_courses (pricing rows, supplements, metadata).
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'course': {'type': ['object', 'null'], 'description': 'Single course product with pricing rows and supplements for the requested start date.', 'additionalProperties': True}, 'success': {'const': True}}, 'additionalProperties': True}
get_school
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.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'data': {'type': 'object', 'description': 'School profile (title, url, city, country, bookings_live, reviews, images[]).', 'additionalProperties': True}, 'success': {'const': True}}, 'additionalProperties': True}
get_school_filters
Valid filter values for search_language_schools (languages, countries, cities, course types, and other facets).
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'data': {'type': 'object', 'description': 'Facet lists keyed by filter name.', 'additionalProperties': True}, 'success': {'const': True}}, 'additionalProperties': True}
get_trip
Load a saved trip by trip_id from save_trip. Returns continue_url for website handoff with configuration restored.
Solo lectura Idempotente
Esquema de entrada
{'type': 'object', 'required': ['trip_id'], 'properties': {'trip_id': {'type': 'string', 'description': 'trip_id returned by save_trip.'}}, 'additionalProperties': True}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'url': {'type': 'string', 'description': 'Legacy alias of continue_url.'}, 'note': {'type': 'string'}, 'success': {'const': True}, 'summary': {'type': 'string', 'description': 'Human-readable configuration summary for agents.'}, 'trip_id': {'type': 'string', 'description': 'Shareable trip id (/s/{id}).'}, 'trip_url': {'type': 'string'}, 'school_id': {'type': 'integer', 'description': 'Craft school entry id.'}, 'school_url': {'type': 'string'}, 'school_name': {'type': 'string'}, 'continue_url': {'type': 'string', 'description': 'Shareable Extralingo URL that restores configuration.'}, 'configuration': {'type': 'object', 'additionalProperties': True}}, 'additionalProperties': True}
list_accommodations
Accommodation groups for a school. Use group ids in save_trip configuration (accommodationGroupId).
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'school': {'type': ['object', 'null'], 'additionalProperties': True}, 'success': {'const': True}, 'currency': {'type': 'string'}, 'start_date': {'type': 'string'}, 'location_discount': {'type': ['object', 'null'], 'additionalProperties': True}, 'busy_school_months': {'type': ['object', 'null'], 'additionalProperties': True}, 'accommodation_groups': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Flat list of accommodation groups (id for get_accommodation_details / configuration).'}, 'has_location_discounts': {'type': 'boolean'}, 'accommodation_categories': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Same groups nested by category for display.'}, 'allows_double_room_individual_bookings': {'type': 'boolean'}}, 'additionalProperties': True}
list_courses
Live course catalogue for a bookings_live school (course ids, weeks, prices). Use returned course ids inside save_trip configuration.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'school': {'type': ['object', 'null'], 'description': 'School metadata from the booking API.', 'additionalProperties': True}, 'success': {'const': True}, 'currency': {'type': 'string'}, 'start_date': {'type': 'string', 'description': 'Effective start date used for pricing (YYYY-MM-DD).'}, 'course_types': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Course types with nested courses[] (course ids, weeks, week prices).'}, 'pricing_rule': {'type': ['object', 'null'], 'additionalProperties': True}, 'location_discount': {'type': ['object', 'null'], 'additionalProperties': True}, 'busy_school_months': {'type': ['object', 'null'], 'additionalProperties': True}, 'has_location_discounts': {'type': 'boolean'}}, 'additionalProperties': True}
list_starting_dates
Allowed course start dates (typically Mondays) for a school. Use startDate values in list_courses and configuration.startDate.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'dates': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Bookable course start dates (typically Mondays, YYYY-MM-DD strings).'}, 'success': {'const': True}}, 'additionalProperties': True}
request_discussion
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.
Acceso externo
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'kind': {'enum': ['discussion'], 'type': 'string', 'description': 'Lead type on success.'}, 'message': {'type': 'string', 'description': 'Human-readable confirmation (not a booking confirmation).'}, 'success': {'const': True}, 'redirectUrl': {'type': ['string', 'null'], 'description': 'Extralingo /my URL for the student to follow the request, when available.'}, 'newBookingId': {'type': ['integer', 'null'], 'description': 'Craft newBookings entry id when created.'}}, 'additionalProperties': True}
request_quote
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.
Acceso externo
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'kind': {'enum': ['quote'], 'type': 'string', 'description': 'Lead type on success.'}, 'message': {'type': 'string', 'description': 'Human-readable confirmation (not a booking confirmation).'}, 'success': {'const': True}, 'redirectUrl': {'type': ['string', 'null'], 'description': 'Extralingo /my URL for the student to follow the request, when available.'}, 'newBookingId': {'type': ['integer', 'null'], 'description': 'Craft newBookings entry id when created.'}}, 'additionalProperties': True}
save_trip
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': {'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'url': {'type': 'string', 'description': 'Legacy alias of continue_url.'}, 'note': {'type': 'string'}, 'success': {'const': True}, 'summary': {'type': 'string', 'description': 'Human-readable configuration summary for agents.'}, 'trip_id': {'type': 'string', 'description': 'Shareable trip id (/s/{id}).'}, 'trip_url': {'type': 'string'}, 'school_id': {'type': 'integer', 'description': 'Craft school entry id.'}, 'school_url': {'type': 'string'}, 'school_name': {'type': 'string'}, 'continue_url': {'type': 'string', 'description': 'Shareable Extralingo URL that restores configuration.'}, 'configuration': {'type': 'object', 'additionalProperties': True}}, 'additionalProperties': True}
search_destinations
Search cities, countries, and school names. Use before search_language_schools to resolve place names to slugs.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'hits': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Destination matches.'}, 'query': {'type': 'string'}, 'locale': {'enum': ['en', 'nl', 'da', 'sv'], 'type': 'string'}, 'schools': {'type': 'array', 'items': {'type': 'object', 'additionalProperties': True}, 'description': 'Optional school name fallback hits.'}, 'success': {'const': True}}, 'additionalProperties': True}
search_language_schools
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.
Solo lectura Idempotente
Esquema de entrada
{'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}
Esquema de salida
{'type': 'object', 'required': ['success'], 'properties': {'data': {'type': 'object', 'description': 'Meilisearch-style payload with hits[] (school_id, title, url, city, country, pricing hints).', 'additionalProperties': True}, 'success': {'const': True}}, 'additionalProperties': True}
Añadido
ask_school_question
4 de October de 2026 a las 02:40
Añadido
request_discussion
4 de October de 2026 a las 02:40
Añadido
request_quote
4 de October de 2026 a las 02:40
Añadido
create_booking
4 de October de 2026 a las 02:40
Añadido
email_trip
4 de October de 2026 a las 02:40
Añadido
get_trip
4 de October de 2026 a las 02:40
Añadido
save_trip
4 de October de 2026 a las 02:40
Añadido
calculate_trip_price
4 de October de 2026 a las 02:40
Añadido
get_accommodation_details
4 de October de 2026 a las 02:40
Añadido
get_course_details
4 de October de 2026 a las 02:40
Añadido
list_accommodations
4 de October de 2026 a las 02:40
Añadido
list_starting_dates
4 de October de 2026 a las 02:40
Añadido
list_courses
4 de October de 2026 a las 02:40
Añadido
get_school
4 de October de 2026 a las 02:40
Añadido
get_school_filters
4 de October de 2026 a las 02:40
Añadido
search_destinations
4 de October de 2026 a las 02:40
Añadido
search_language_schools
4 de October de 2026 a las 02:40