Extralingo

Search language schools abroad, compare courses, dates and prices, and request bookings.

사용해야 할까요

품질 및 안전성

A
설명 품질
100%
스키마 완전성
95%
이름 품질
95%
오염 위험
100%
권한 일치
100%
프로토콜 준수
100%

도구 정의와 프로토콜 준수에 대한 자동 분석을 기반으로 합니다.

컨텍스트 비용

~7,469토큰 (도구 정의)
~4.8 KB일반적인 응답 크기
상당한 주의 영향 (128k 컨텍스트의 5.84%)

이는 서버의 도구가 모델의 컨텍스트에 로드될 때마다 소비되는 대략적인 토큰 수입니다. 수치가 높을수록 다른 작업에 사용할 수 있는 주의가 줄어듭니다.

설치

원클릭 설치

`claude_desktop_config.json` 파일에 다음을 추가하세요:

{
  "mcpServers": {
    "extralingo": {
      "url": "https://www.extralingo.com/mcp"
    }
  }
}

원격 엔드포인트

https://www.extralingo.com/mcpstreamable-http

할 수 있는 일

도구 목록

도구 (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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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).

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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).

입력 스키마

{
  "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
}

출력 스키마

{
  "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).

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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).

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "type": "object",
  "properties": {
    "trip_id": {
      "type": "string",
      "description": "trip_id returned by save_trip."
    }
  },
  "required": [
    "trip_id"
  ],
  "additionalProperties": true
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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.

입력 스키마

{
  "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
}

출력 스키마

{
  "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
}

커뮤니티

이 서버 평가하기

증거

최근 관측

검증됨버전이 기록되지 않음도구 17개