type Query { """ Get activities with optional filters. Sorted by ranking score (or distance if near filter is used). """ activities( "Search query (fuzzy match on title)" q: String "Language locale" locale: String = "de-CH" "Filter by type ID" typeId: String "Filter by location ID" locationId: String "Filter by supplier ID" supplierId: String "Filter by attribute value (e.g., 'Familien', 'Berge & Natur')" attributeValue: String "Latitude for near-me filter" nearLat: Float "Longitude for near-me filter" nearLng: Float "Radius in km for near-me filter (default: 50)" radiusKm: Float = 50 "Max items (default: 20, max: 100)" limit: Int = 20 "Offset for pagination" offset: Int = 0 ): ActivitiesResult! """ Get a single activity by ID """ activity( id: String! locale: String = "de-CH" ): Activity """ Get all locations """ locations( locale: String = "de-CH" limit: Int = 200 ): [Location!]! """ Get all activity types """ types( locale: String = "de-CH" ): [ActivityType!]! """ Get ski resorts with live snow data """ wispoStations( locale: String = "de-CH" q: String limit: Int = 50 offset: Int = 0 ): WispoResult! """ Get a single ski resort by ID """ wispoStation( id: Int! locale: String = "de-CH" ): WispoStation """ Get tours (hiking, biking, snowshoe, sledging, etc.) from MySwitzerland """ tours( "Search query (searches name and abstract)" q: String "Filter by route type: hike, mountainbike, bicycle, snowshoe, winterhiking, crosscountryskiing, sledging, skating, canoe" routeType: String "Filter by season: summer, winter" season: String "Filter by difficulty: easy, medium, difficult" difficulty: String "Latitude for near-me filter" nearLat: Float "Longitude for near-me filter" nearLng: Float "Radius in km for near-me filter (default: 50)" radiusKm: Float = 50 limit: Int = 50 offset: Int = 0 ): ToursResult! """ Get a single tour by ID """ tour( id: String! ): Tour """ Get tourist attractions from MySwitzerland """ attractions( "Search query (searches name and abstract)" q: String "Filter by season: summer, winter, spring, autumn" season: String "Filter by sport type: hike, toboggan, bathingandswimming, etc." sportType: String "Filter by experience type: adventure, nature, active, culture, etc." experienceType: String "Filter by needed time: lessthan1hour, between12hours, 2to4hourshalfday, 4to8hoursfullday, severaldays" neededTime: String "Filter by children age: 0to5years, 6to9years, 10to13years, 14plus" childrenAge: String "Filter by is outdoor" isOutdoor: Boolean "Filter by is indoor" isIndoor: Boolean "Filter by wheelchair accessible" isWheelchairAccessible: Boolean "Filter by free entry" isAccessibleForFree: Boolean "Latitude for near-me filter" nearLat: Float "Longitude for near-me filter" nearLng: Float "Radius in km for near-me filter (default: 50)" radiusKm: Float = 50 limit: Int = 50 offset: Int = 0 ): AttractionsResult! """ Get a single attraction by ID """ attraction( id: String! ): Attraction } # ============================================================================ # Activities # ============================================================================ type ActivitiesResult { data: [Activity!]! total: Int! hasMore: Boolean! } type Activity { id: String! bookingId: Int! locale: String! title: String teaserImage: Image supplier: Supplier location: Location type: ActivityType info: Info summary: Summary! isBookable: Boolean! nextAvailableDate: String lat: String lng: String "Distance in km (only present when using nearLat/nearLng filter)" distance: Float } type Summary { startingPrice: Price rankingScoreValue: Float! popularity: Int! isActive: Boolean! } type Price { amount: String! currency: String! formatted: String } type Image { url: String! alternativeText: String } type Supplier { id: String name: String slug: String } type Location { id: String! title: String! slug: String! activityCount: Int } type ActivityType { id: String! title: String! slug: String! } type Info { title: String! teaser: String slug: String! } """JSON scalar for raw data access""" scalar JSON # ============================================================================ # Wispo (Ski Resorts) - Complete Data # ============================================================================ type WispoResult { data: [WispoStation!]! total: Int! hasMore: Boolean! "Pagination info" pagination: WispoPagination "Meta info" meta: WispoMeta } type WispoPagination { total: Int! limit: Int! offset: Int! hasMore: Boolean! page: Int! totalPages: Int! } type WispoMeta { locale: String! lastSync: String expiresAt: String source: String! responseTimeMs: Int } type WispoStation { id: Int! name: String! "Coordinates (from webcam if available)" latitude: Float longitude: Float "Resort & Address" resort: WispoResort address: WispoAddress "General Info" info: WispoInfo "Snow Conditions" snow: WispoSnow "Ski/Piste Info" ski: WispoSki "Snowboard Parks" snowboard: WispoSnowboard "Cross-country Skiing" crosscountry: WispoCrosscountry "Hiking & Snowshoe" hiking: WispoHiking "Tobogganing/Sledging" tobogganing: WispoTobogganing "Sledging (alias for tobogganing)" sledge: WispoSledge "Snowshoe trails" snowshoe: WispoSnowshoe "Ticket Prices" prices: WispoPrices "Weather (simple format)" weather: WispoWeather "Weather Forecast (7 days detailed)" weatherForecast: [WispoWeatherForecast!] "Images (Logo, Piste Map, etc.)" images: [WispoImage!] "Webcams with live feeds" webcams: [WispoWebcam!] "Links (Ticketshop, Ski School, Interactive Map)" links: [WispoLink!] "MySwitzerland detail links" detailLinks: [WispoDetailLink!] "Last update timestamp" lastUpdate: String "Raw API data (for advanced use)" raw: JSON } type WispoResort { id: Int! name: String! regionId: Int } type WispoAddress { name: String street: String place: String zip: Int phone: String email: String website: String } type WispoInfo { "Altitude in meters" altitude: Int seasonStart: String seasonEnd: String "Total lift facilities" totalFacilities: Int "Gondolas/Cable cars" cableCars: Int "Chairlifts" chairlifts: Int "Ski lifts (T-bar, etc.)" skilifts: Int "Baby/Beginner lifts" babyLifts: Int "Conveyor belts" conveyorBelts: Int "Shuttle bus available" hasShuttlebus: Boolean "Facility report" report: String "Lift details (nested)" lifts: WispoLifts } type WispoLifts { cableCar: Int chairlift: Int skilift: Int babyLift: Int } type WispoSnow { "Fresh snow in cm" freshSnow: Int "Fresh snow on piste top in cm" freshSnowPisteTop: Int "Snow depth at resort in cm" depthResort: Int "Snow depth on piste in cm" depthPiste: Int "Last snowfall date" lastSnowfall: String "Avalanche risk level URL" avalancheRiskUrl: String "Snow report" report: String } type WispoSki { "Ski area name" areaName: String "Total number of slopes" slopesTotal: Int "Total slopes length in meters" slopesLength: Int "Open slopes length in meters" slopesOpenLength: Int "Number of valley runs" valleyRuns: Int "Open facilities count" openFacilities: Int "Opening time" openingTime: String "Closing time" closingTime: String "Piste condition" condition: String "Snow condition" snowCondition: String "Valley runs condition" valleyRunsCondition: String "Piste report" report: String } type WispoSnowboard { "Fun park name" funparkName: String "Number of snowparks" snowparksTotal: Int "Open snowparks" snowparksOpen: Int "Open halfpipes" halfpipesOpen: Int "Open snowtubes" snowtubesOpen: Int "Has artificial snow" hasArtificialSnow: Boolean "Has floodlight" hasFloodlight: Boolean "Condition" condition: String "Detailed snowparks" snowparks: [WispoSnowpark!] } type WispoSnowpark { name: String type: String status: String lastUpdated: String } type WispoCrosscountry { "Area name" areaName: String "Phone number" phone: String "Total classic track length in meters" classicLength: Int "Prepared classic track length" classicPrepared: Int "Total skating track length in meters" skatingLength: Int "Prepared skating track length" skatingPrepared: Int "Dog trail total length" dogTrailLength: Int "Dog trail open length" dogTrailOpen: Int "Floodlight track length" floodlightLength: Int "Floodlight till time" floodlightTill: String "Classic track condition" classicCondition: String "Skating track condition" skatingCondition: String "Report" report: String "SchweizMobil routes" routes: [WispoSchweizMobilRoute!] } type WispoHiking { "Area name" areaName: String "Total walking trail length in meters" walkingTrailLength: Int "Prepared walking trail length" walkingTrailPrepared: Int "Snowshoe trail count" snowshoeTrailsTotal: Int "Snowshoe trail length in meters" snowshoeTrailsLength: Int "Trail condition" condition: String "Opening time" openingTime: String "Closing time" closingTime: String "Report" report: String "SchweizMobil routes" routes: [WispoSchweizMobilRoute!] } type WispoTobogganing { "Area name" areaName: String "Total tracks" tracksTotal: Int "Total track length in meters" tracksLength: Int "Open tracks" tracksOpen: Int "Open track length" tracksOpenLength: Int "Has artificial snow" hasArtificialSnow: Boolean "Has public transport" hasPublicTransport: Boolean "Has rental possibility" hasRental: Boolean "Skill level" skillLevel: String "Condition" condition: String "Report" report: String } type WispoSchweizMobilRoute { title: String status: String } type WispoPrices { "Day ticket prices" dayTicket: WispoPriceCategory "Half-day ticket prices" halfDayTicket: WispoPriceCategory "Half-day available from time" halfDayFrom: String "Week ticket prices" weekTicket: WispoPriceCategory "Season ticket prices" seasonTicket: WispoPriceCategory "Family reduction available" familyReduction: Boolean "Hour cards available" hourCardsAvailable: Boolean "Dynamic pricing" dynamicPrices: Boolean "Description" description: String } type WispoPriceCategory { adult: String child: String teenager: String senior: String currency: String } "Simple weather format" type WispoWeather { condition: String temperatureResort: Int temperaturePiste: Int forecast: String } type WispoWeatherForecast { "BERG (mountain) or TAL (valley)" type: String! date: String! "Temperature in Celsius" temperature: Int "Weather icon code" iconCode: Int "Weather URL" url: String } "Sledge/Toboggan info (alias)" type WispoSledge { runsTotal: Int runsLength: Int runsOpenLength: Int condition: String } "Snowshoe trails" type WispoSnowshoe { trailsTotal: Int trailsLength: Int trailsOpenLength: Int condition: String } type WispoImage { "Image type: LOGO, SKIMAP, SKIMAP_MOBILE, APP_SKIMAP, STATION_PICTURE_1/2/3, etc." type: String! url: String! created: String updated: String } type WispoWebcam { url: String! sourceUrl: String place: String latitude: Float longitude: Float } type WispoLink { "Link type: INTERACTIVE_PISTE_MAP, TICKETSHOP, SKI_SCHOOL" type: String! title: String url: String! } type WispoDetailLink { lang: String! url: String! } # ============================================================================ # Tours (MySwitzerland OpenData) # ============================================================================ type ToursResult { data: [Tour!]! total: Int! hasMore: Boolean! pagination: ToursPagination meta: ToursMeta } type ToursPagination { total: Int! limit: Int! offset: Int! hasMore: Boolean! page: Int! totalPages: Int! } type ToursMeta { locale: String! lastSync: String expiresAt: String source: String! responseTimeMs: Int } type Tour { "Tour UUID" id: String! "Tour name" name: String! "Tour description/abstract" abstract: String "MySwitzerland URL" url: String "Route type: hike, mountainbike, bicycle, snowshoe, winterhiking, crosscountryskiing, sledging, skating, canoe" routeType: String "Route category: National, Regional, Local, Handicap" routeCategory: String "Difficulty: easy, medium, difficult" difficulty: String "Season: summer, winter" season: String "GPS coordinates" latitude: Float longitude: Float "Start point name" startPoint: String "End point name" endPoint: String "Distance in km" distance: Float "Duration in minutes" duration: Int "Ascent in meters" ascent: Int "Descent in meters" descent: Int "Minimum altitude in meters" minAltitude: Int "Maximum altitude in meters" maxAltitude: Int "Is this a roundtrip?" isRoundtrip: Boolean! "Is this barrier-free?" isBarrierFree: Boolean! "SchweizMobil route number" switzerlandMobilityRoute: Int "SchweizMobil URL" switzerlandMobilityUrl: String "GeoJSON URL for route coordinates" geodataUrl: String "Provider/Tourism office name" providerName: String "Provider email" providerEmail: String "Provider phone" providerPhone: String "Provider website" providerUrl: String "Main image URL" imageUrl: String "Logo URL" logoUrl: String "Landscape types: alongwater, withpanoramicview, onmountainpeak, etc." landscapes: [String!]! "View types: mountainview, flatlandview, panorama" views: [String!]! "Data origin (e.g., Schweiz Mobil)" origin: String "Last updated timestamp" lastUpdated: String "Distance from search point (only when using nearLat/nearLng)" distance_km: Float } # ============================================================================ # Attractions (MySwitzerland OpenData) # ============================================================================ type AttractionsResult { data: [Attraction!]! total: Int! hasMore: Boolean! pagination: AttractionsPagination meta: AttractionsMeta } type AttractionsPagination { total: Int! limit: Int! offset: Int! hasMore: Boolean! page: Int! totalPages: Int! } type AttractionsMeta { locale: String! lastSync: String expiresAt: String source: String! responseTimeMs: Int } type Attraction { "Attraction UUID" id: String! "Attraction name" name: String! "Short description" abstract: String "Full description (may contain HTML)" description: String "MySwitzerland URL" url: String "GPS coordinates" latitude: Float longitude: Float "City/Town" locality: String "Postal code" postalCode: String "Contact name (tourism office)" contactName: String "Contact phone" contactPhone: String "Contact email" contactEmail: String "Contact website" contactUrl: String "Tourist types: Adventure Tourism, etc." touristType: [String!]! "Seasons: summer, winter, spring, autumn" seasons: [String!]! "Sport types: hike, toboggan, bathingandswimming, etc." sportTypes: [String!]! "Needed time: lessthan1hour, between12hours, 2to4hourshalfday, etc." neededTime: String "Suitable for children ages: 0to5years, 6to9years, 10to13years, 14plus" childrenAges: [String!]! "Difficulty: low, medium, high" difficulty: String "Nature types: parks, waterfall, caves, etc." natureTypes: [String!]! "Experience types: adventure, nature, active, culture" experienceTypes: [String!]! "Views: mountainview, panorama, flatlandview" views: [String!]! "Is entry free?" isAccessibleForFree: Boolean! "Is wheelchair accessible?" isWheelchairAccessible: Boolean! "Is indoor attraction?" isIndoor: Boolean! "Is outdoor attraction?" isOutdoor: Boolean! "Suitable for: children, family, group, individual, couples" suitableFor: [String!]! "Recommended season start" seasonStart: String "Recommended season end" seasonEnd: String "Main image URL" imageUrl: String "All image URLs" images: [String!]! "Parent destination ID" destinationId: String "Last updated timestamp" lastUpdated: String "Distance from search point (only when using nearLat/nearLng)" distance_km: Float }