{"openapi":"3.1.0","info":{"title":"Paris Minivan Transfer public API","version":"1.0.0","summary":"Fixed-price private transfers in Paris: routes, prices and how to book.","description":"Read-only access to Paris Minivan Transfer's published fixed-price transfers between Paris, the CDG, Orly and Beauvais airports, Disneyland Paris and Versailles. No authentication. Rate limit: 60 requests per minute per IP. The API cannot book or pay: send users to booking_url. The same operations are available as an MCP server at https://www.parisminivantransfer.com/mcp.","contact":{"url":"https://www.parisminivantransfer.com/en/contact"}},"externalDocs":{"description":"Developers and AI agents","url":"https://www.parisminivantransfer.com/en/developers"},"servers":[{"url":"https://www.parisminivantransfer.com"}],"security":[],"paths":{"/api/v1/transfers":{"get":{"operationId":"searchTransfers","summary":"Search fixed-price transfers","description":"Lists the published routes with their 'from' price in EUR (one way, 2 passengers and 2 bags), duration, distance and page URL. Filters match the departure, destination or title, ignoring case and accents.","tags":["Transfers"],"parameters":[{"name":"from","in":"query","required":false,"description":"Departure, e.g. CDG, Orly, Paris.","schema":{"type":"string","maxLength":80}},{"name":"to","in":"query","required":false,"description":"Destination, e.g. Disneyland.","schema":{"type":"string","maxLength":80}},{"name":"locale","in":"query","required":false,"description":"Language of titles and URLs.","schema":{"type":"string","enum":["en","fr","it","es"],"default":"en"}},{"name":"limit","in":"query","required":false,"description":"Maximum number of routes returned.","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}}],"responses":{"200":{"description":"Matching routes.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferList"}}}},"400":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per IP).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream data temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/transfers/{slug}":{"get":{"operationId":"getTransfer","summary":"Get one transfer","description":"Details of one route: fixed 'from' price, duration, distance, included passengers and bags, description, FAQ and booking link.","tags":["Transfers"],"parameters":[{"name":"slug","in":"path","required":true,"description":"Route slug as returned by searchTransfers.","schema":{"type":"string","maxLength":120,"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"}},{"name":"locale","in":"query","required":false,"description":"Language of titles and URLs.","schema":{"type":"string","enum":["en","fr","it","es"],"default":"en"}}],"responses":{"200":{"description":"The route.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/TransferDetail"}}}},"400":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"Not found.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per IP).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream data temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/v1/booking-info":{"get":{"operationId":"getBookingInfo","summary":"How to book","description":"Booking page, price list, phone / WhatsApp, email and the details to collect from the user. Booking itself happens on booking_url.","tags":["Booking"],"parameters":[{"name":"locale","in":"query","required":false,"description":"Language of titles and URLs.","schema":{"type":"string","enum":["en","fr","it","es"],"default":"en"}}],"responses":{"200":{"description":"Booking information.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BookingInfo"}}}},"400":{"description":"Invalid parameter.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (60 requests per minute per IP).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"503":{"description":"Upstream data temporarily unavailable.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Transfer":{"type":"object","required":["slug","title","from","to","price_from_eur","duration_min","distance_km","url","image_url"],"properties":{"slug":{"type":"string","description":"Identifier for getTransfer."},"title":{"type":"string"},"from":{"type":"string","description":"Departure."},"to":{"type":"string","description":"Destination."},"price_from_eur":{"type":["number","null"],"description":"'From' price in EUR, one way; null when on request."},"duration_min":{"type":["number","null"]},"distance_km":{"type":["number","null"]},"url":{"type":"string","format":"uri","description":"Page of the route on the website."},"image_url":{"type":["string","null"],"format":"uri","description":"Photo of the route, as shown on its page."}}},"TransferList":{"type":"object","required":["total","transfers","note"],"properties":{"total":{"type":"integer","description":"Number of matching routes before the limit."},"transfers":{"type":"array","items":{"$ref":"#/components/schemas/Transfer"}},"note":{"type":"string"}}},"TransferDetail":{"allOf":[{"$ref":"#/components/schemas/Transfer"},{"type":"object","required":["passengers_included","bags_included","description","faq","booking_url"],"properties":{"passengers_included":{"type":["number","null"]},"bags_included":{"type":["number","null"]},"description":{"type":"string"},"faq":{"type":"array","items":{"type":"object","required":["question","answer"],"properties":{"question":{"type":"string"},"answer":{"type":"string"}}}},"booking_url":{"type":"string","format":"uri"}}}]},"BookingInfo":{"type":"object","required":["brand","booking_url","price_list_url","availability","languages","details_to_collect","can_this_server_book"],"properties":{"brand":{"type":"string"},"booking_url":{"type":"string","format":"uri"},"price_list_url":{"type":"string","format":"uri"},"phone_whatsapp":{"type":["string","null"]},"email":{"type":["string","null"]},"availability":{"type":"string"},"languages":{"type":"array","items":{"type":"string"}},"details_to_collect":{"type":"array","items":{"type":"string"}},"can_this_server_book":{"type":"boolean","const":false}}},"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message","hint","docs_url"],"properties":{"code":{"type":"string","enum":["invalid_parameter","not_found","method_not_allowed","rate_limited","unavailable"]},"message":{"type":"string"},"hint":{"type":"string","description":"How to fix the request."},"docs_url":{"type":"string","format":"uri"},"openapi_url":{"type":"string","format":"uri"}}}}}}},"tags":[{"name":"Transfers","description":"Published routes and fixed prices."},{"name":"Booking","description":"How a user books."}]}