{
  "data": {
    "id": "XLZTaKeRScGfc7ZN4",
    "actId": "c08sr78ZtOfaIbfvw",
    "userId": "NL4ThgItAwaoBlffQ",
    "startedAt": "2026-11-12T09:19:42.592Z",
    "finishedAt": "2026-11-12T09:20:48.833Z",
    "status": "SUCCEEDED",
    "meta": {
      "origin": "CLI"
    },
    "stats": {
      "durationMillis": 66177,
      "runTimeSecs": 66.177,
      "computeUnits": 0.07353,
      "imageSizeBytes": 4041519616
    },
    "options": {
      "useCache": true,
      "betaPackages": false,
      "memoryMbytes": 4096,
      "diskMbytes": 8192
    },
    "createdByOrganizationMemberUserId": "6GwdnIcc2aWR7LzCS",
    "exitCode": 0,
    "inputSchema": "{\n  \"title\": \"GetYourGuide Activity Pricing & Highlights Extractor Input\",\n  \"type\": \"object\",\n  \"schemaVersion\": 1,\n  \"properties\": {\n    \"searchQueries\": {\n      \"title\": \"Search queries\",\n      \"type\": \"array\",\n      \"description\": \"Cities, landmarks, or activity keywords to search on GetYourGuide. One search per item, e.g. 'rome', 'eiffel tower', 'food tour paris'. Used for the keyword-search mode.\",\n      \"editor\": \"stringList\",\n      \"prefill\": [\n        \"rome\"\n      ],\n      \"sectionCaption\": \"Search\"\n    },\n    \"startUrls\": {\n      \"title\": \"Start URLs (optional)\",\n      \"type\": \"array\",\n      \"description\": \"GetYourGuide URLs or activity IDs. Accepts search pages (/s/?q=...), destination/attraction pages (…-l<id>/), category pages (…-tc<id>/), activity pages (…-t<id>/), and bare IDs such as 631866 or t631866. URL query filters are preserved.\",\n      \"editor\": \"stringList\"\n    },\n    \"activityIds\": {\n      \"title\": \"Activity IDs (optional)\",\n      \"type\": \"array\",\n      \"description\": \"Direct GetYourGuide activity IDs. Each ID opens its activity page and returns full detail fields.\",\n      \"editor\": \"stringList\"\n    },\n    \"maxItems\": {\n      \"title\": \"Max items\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum activities to return across all queries, URLs, and IDs.\",\n      \"default\": 30,\n      \"prefill\": 1,\n      \"minimum\": 1,\n      \"maximum\": 2000,\n      \"editor\": \"number\"\n    },\n    \"includeDetails\": {\n      \"title\": \"Fetch activity detail pages\",\n      \"type\": \"boolean\",\n      \"description\": \"Open each activity page to add full descriptions, highlights, inclusions, exclusions, meeting point, cancellation policy, supplier, and review fields. Turn off for the fastest search-card-only runs.\",\n      \"default\": true,\n      \"prefill\": false\n    },\n    \"maxReviews\": {\n      \"title\": \"Reviews per activity\",\n      \"type\": \"integer\",\n      \"description\": \"How many recent reviews to attach to each activity (0 disables reviews). Only used when detail pages are fetched.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 50,\n      \"editor\": \"number\"\n    },\n    \"currency\": {\n      \"title\": \"Currency\",\n      \"type\": \"string\",\n      \"description\": \"Currency for all prices.\",\n      \"editor\": \"select\",\n      \"default\": \"USD\",\n      \"prefill\": \"USD\",\n      \"enum\": [\n        \"USD\",\n        \"EUR\",\n        \"GBP\",\n        \"AUD\",\n        \"CAD\",\n        \"CHF\",\n        \"JPY\",\n        \"INR\",\n        \"BRL\",\n        \"MXN\",\n        \"NZD\",\n        \"SEK\",\n        \"NOK\",\n        \"DKK\",\n        \"PLN\",\n        \"CZK\",\n        \"HUF\",\n        \"RON\",\n        \"TRY\",\n        \"ZAR\",\n        \"AED\",\n        \"SAR\",\n        \"ILS\",\n        \"SGD\",\n        \"HKD\",\n        \"TWD\",\n        \"KRW\",\n        \"THB\",\n        \"MYR\",\n        \"IDR\",\n        \"PHP\",\n        \"VND\",\n        \"CNY\",\n        \"ARS\",\n        \"CLP\",\n        \"COP\",\n        \"PEN\",\n        \"RUB\",\n        \"UAH\",\n        \"EGP\"\n      ],\n      \"enumTitles\": [\n        \"US Dollar\",\n        \"Euro\",\n        \"British Pound\",\n        \"Australian Dollar\",\n        \"Canadian Dollar\",\n        \"Swiss Franc\",\n        \"Japanese Yen\",\n        \"Indian Rupee\",\n        \"Brazilian Real\",\n        \"Mexican Peso\",\n        \"New Zealand Dollar\",\n        \"Swedish Krona\",\n        \"Norwegian Krone\",\n        \"Danish Krone\",\n        \"Polish Zloty\",\n        \"Czech Koruna\",\n        \"Hungarian Forint\",\n        \"Romanian Leu\",\n        \"Turkish Lira\",\n        \"South African Rand\",\n        \"UAE Dirham\",\n        \"Saudi Riyal\",\n        \"Israeli Shekel\",\n        \"Singapore Dollar\",\n        \"Hong Kong Dollar\",\n        \"Taiwan Dollar\",\n        \"South Korean Won\",\n        \"Thai Baht\",\n        \"Malaysian Ringgit\",\n        \"Indonesian Rupiah\",\n        \"Philippine Peso\",\n        \"Vietnamese Dong\",\n        \"Chinese Yuan\",\n        \"Argentine Peso\",\n        \"Chilean Peso\",\n        \"Colombian Peso\",\n        \"Peruvian Sol\",\n        \"Russian Ruble\",\n        \"Ukrainian Hryvnia\",\n        \"Egyptian Pound\"\n      ],\n      \"sectionCaption\": \"Display\"\n    },\n    \"language\": {\n      \"title\": \"Content language\",\n      \"type\": \"string\",\n      \"description\": \"Language for titles, descriptions, highlights, and policies.\",\n      \"editor\": \"select\",\n      \"default\": \"en\",\n      \"prefill\": \"en\",\n      \"enum\": [\n        \"en\",\n        \"de\",\n        \"fr\",\n        \"es\",\n        \"it\",\n        \"pt\",\n        \"nl\",\n        \"pl\",\n        \"ru\",\n        \"tr\",\n        \"ja\",\n        \"ko\",\n        \"zh\",\n        \"ar\",\n        \"da\",\n        \"sv\",\n        \"no\",\n        \"fi\",\n        \"cs\",\n        \"el\",\n        \"he\",\n        \"hu\",\n        \"id\",\n        \"ms\",\n        \"ro\",\n        \"sk\",\n        \"sl\",\n        \"sr\",\n        \"th\",\n        \"uk\",\n        \"vi\"\n      ],\n      \"enumTitles\": [\n        \"English\",\n        \"German\",\n        \"French\",\n        \"Spanish\",\n        \"Italian\",\n        \"Portuguese\",\n        \"Dutch\",\n        \"Polish\",\n        \"Russian\",\n        \"Turkish\",\n        \"Japanese\",\n        \"Korean\",\n        \"Chinese\",\n        \"Arabic\",\n        \"Danish\",\n        \"Swedish\",\n        \"Norwegian\",\n        \"Finnish\",\n        \"Czech\",\n        \"Greek\",\n        \"Hebrew\",\n        \"Hungarian\",\n        \"Indonesian\",\n        \"Malay\",\n        \"Romanian\",\n        \"Slovak\",\n        \"Slovenian\",\n        \"Serbian\",\n        \"Thai\",\n        \"Ukrainian\",\n        \"Vietnamese\"\n      ]\n    },\n    \"sortBy\": {\n      \"title\": \"Sort results\",\n      \"type\": \"string\",\n      \"description\": \"Order of search and listing results.\",\n      \"editor\": \"select\",\n      \"default\": \"popularity\",\n      \"prefill\": \"popularity\",\n      \"enum\": [\n        \"popularity\",\n        \"rating\",\n        \"price_asc\",\n        \"price_desc\"\n      ],\n      \"enumTitles\": [\n        \"Most popular (GetYourGuide ranking)\",\n        \"Highest rated\",\n        \"Price: low to high\",\n        \"Price: high to low\"\n      ]\n    },\n    \"minRating\": {\n      \"title\": \"Minimum rating\",\n      \"type\": \"string\",\n      \"description\": \"Only return activities with at least this star rating.\",\n      \"editor\": \"select\",\n      \"default\": \"any\",\n      \"prefill\": \"any\",\n      \"enum\": [\n        \"any\",\n        \"3.0\",\n        \"3.5\",\n        \"4.0\",\n        \"4.5\"\n      ],\n      \"enumTitles\": [\n        \"Any rating\",\n        \"3.0+\",\n        \"3.5+\",\n        \"4.0+\",\n        \"4.5+\"\n      ],\n      \"sectionCaption\": \"Filters\"\n    },\n    \"priceMin\": {\n      \"title\": \"Minimum price\",\n      \"type\": \"integer\",\n      \"description\": \"Minimum starting price in the selected currency. 0 means no minimum.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 100000,\n      \"editor\": \"number\"\n    },\n    \"priceMax\": {\n      \"title\": \"Maximum price\",\n      \"type\": \"integer\",\n      \"description\": \"Maximum starting price in the selected currency. 0 means no maximum.\",\n      \"default\": 0,\n      \"prefill\": 0,\n      \"minimum\": 0,\n      \"maximum\": 100000,\n      \"editor\": \"number\"\n    },\n    \"dateFrom\": {\n      \"title\": \"Available from\",\n      \"type\": \"string\",\n      \"description\": \"Only activities available on or after this date (YYYY-MM-DD). Leave empty for any date.\",\n      \"editor\": \"datepicker\"\n    },\n    \"dateTo\": {\n      \"title\": \"Available to\",\n      \"type\": \"string\",\n      \"description\": \"Only activities available on or before this date (YYYY-MM-DD). Leave empty for any date.\",\n      \"editor\": \"datepicker\"\n    },\n    \"startTime\": {\n      \"title\": \"Start time of day\",\n      \"type\": \"array\",\n      \"description\": \"Filter by start time. Any of: morning, afternoon, evening.\",\n      \"editor\": \"stringList\"\n    },\n    \"durations\": {\n      \"title\": \"Duration buckets\",\n      \"type\": \"array\",\n      \"description\": \"Filter by duration. Any of: up_to_3_hours, 3_to_5_hours, 5_to_7_hours, full_day, 2_days, 3_days, 4_days, 5_days_plus.\",\n      \"editor\": \"stringList\"\n    },\n    \"features\": {\n      \"title\": \"Activity features\",\n      \"type\": \"array\",\n      \"description\": \"Filter by features. Any of: private_tour, skip_the_line, small_group, wheelchair_accessible, hotel_pickup, gyg_originals.\",\n      \"editor\": \"stringList\"\n    },\n    \"guideLanguages\": {\n      \"title\": \"Guide languages\",\n      \"type\": \"array\",\n      \"description\": \"Only activities offered in these guide languages, using two-letter codes (en, de, fr, es, it, pt, …).\",\n      \"editor\": \"stringList\",\n      \"sectionCaption\": \"Advanced filters\"\n    },\n    \"interests\": {\n      \"title\": \"Interest IDs\",\n      \"type\": \"array\",\n      \"description\": \"GetYourGuide interest IDs such as tc-27 (culture & history) or tc-103 (food & drink). Copy them from a search page URL or the available filters.\",\n      \"editor\": \"stringList\"\n    },\n    \"places\": {\n      \"title\": \"Place IDs\",\n      \"type\": \"array\",\n      \"description\": \"Numeric GetYourGuide place/attraction IDs (e.g. 2619 for the Colosseum). Copy them from a search page URL.\",\n      \"editor\": \"stringList\"\n    },\n    \"departsFrom\": {\n      \"title\": \"Departure city IDs\",\n      \"type\": \"array\",\n      \"description\": \"Numeric departure-city IDs. Copy them from a search page URL.\",\n      \"editor\": \"stringList\"\n    }\n  },\n  \"required\": []\n}",
    "readme": "# GetYourGuide Activity Pricing & Highlights Extractor\n\nTurn GetYourGuide into a structured activity feed. Search a city, landmark, or activity phrase, or point the actor at GetYourGuide search, destination, category, or activity URLs, and receive pricing, ratings, highlights, inclusions, meeting points, cancellation terms, and supplier details for every tour you collect.\n\n## What it does\n\n- **Keyword search** — one query per item (`rome`, `eiffel tower`, `food tour paris`) with the site's own filters and sort orders.\n- **URL and ID mode** — accepts search pages, destination/attraction pages, category pages, activity pages, and bare activity IDs (`631866` / `t631866`).\n- **Pagination** — follows the listing's \"show more\" data until the source stops returning activities (up to 50 pages, 24 per page, per query).\n- **Optional detail enrichment** — opens each activity for full descriptions, highlights, includes/excludes, meeting point + coordinates, cancellation policy, supplier, guides, itinerary, and reviews.\n- **Cookieless** — no login, cookies, or API key required. Requests use GetYourGuide's public SDUI JSON and page data directly.\n\n## Output per activity\n\nIdentity and place: `type`, `id`, `url`, `title`, `shortDescription`, `description`, `city`, `citySlug`, `region`, `country`, `latitude`, `longitude`, `meetingPoint`.\n\nCommercial: `price`, `originalPrice`, `currency`, `discountPercent`, `pricingType`, `rating`, `reviewCount`, `cancellationPolicy`, `freeCancellation`, `supplierName`.\n\nPractical detail: `duration`, `category`, `activityType`, `guideLanguages`, `images`, `highlights`, `whatIncluded`, `whatExcluded`, `goodToKnow`, `whatToBring`, `notAllowed`, `notSuitableFor`, `itinerary`, `bookingOptions`, `maxGroupSize`, `minAge`, `badges`, `availability`, `nextAvailable`, `recentBookings`, `reviewSummary`, `reviews`, `breadcrumbs`.\n\nBooking flags: `skipTheLine`, `mobileTicket`, `instantConfirmation`, `pickupIncluded`, `wheelchairAccessible`, `smallGroup`, `privateTour`, `liveGuide`.\n\nRun metadata: `searchQuery`, `sourceUrl`, `rank`, `scrapedAt`.\n\nA field GetYourGuide does not publish for an activity is omitted, never returned as `null` or an empty string.\n\n## Input\n\n| Field | Type | Default | Purpose |\n|---|---|---|---|\n| `searchQueries` | array | `[\"rome\"]` | Cities, landmarks, or activity keywords. |\n| `startUrls` | array | – | GetYourGuide search, destination, category, or activity URLs, or bare IDs. |\n| `activityIds` | array | – | Direct activity IDs. |\n| `maxItems` | integer | 30 | Global cap across all inputs (1–2000). |\n| `includeDetails` | boolean | true | Open detail pages for the full field set. |\n| `maxReviews` | integer | 0 | Recent reviews per activity (0–50). |\n| `currency` | select | USD | Currency for prices. |\n| `language` | select | English | Language of titles and descriptions. |\n| `sortBy` | select | popularity | Popularity, rating, price ascending, or price descending. |\n| `minRating` | select | any | 3.0+, 3.5+, 4.0+, or 4.5+. |\n| `priceMin` / `priceMax` | integer | 0 | Price range; 0 means unbounded. |\n| `dateFrom` / `dateTo` | date | – | Only activities available in the date range. |\n| `startTime` | array | – | Morning, afternoon, or evening. |\n| `durations` | array | – | Up to 3h, 3–5h, 5–7h, full day, or 2–5+ days. |\n| `features` | array | – | Private, skip the line, small group, wheelchair, pickup, or GetYourGuide Originals. |\n| `guideLanguages` | array | – | Two-letter guide-language codes. |\n| `interests` / `places` / `departsFrom` | array | – | Advanced GetYourGuide filter IDs copied from a search URL. |\n\n### Example: search with filters\n\n```json\n{\n    \"searchQueries\": [\"rome\"],\n    \"maxItems\": 20,\n    \"includeDetails\": true,\n    \"sortBy\": \"rating\",\n    \"minRating\": \"4.5\",\n    \"features\": [\"skip_the_line\"],\n    \"currency\": \"EUR\",\n    \"language\": \"en\"\n}\n```\n\n### Example: URLs and an ID\n\n```json\n{\n    \"startUrls\": [\n        \"https://www.getyourguide.com/rome-l33/\",\n        \"https://www.getyourguide.com/s/?q=eiffel+tower&services=stl\"\n    ],\n    \"activityIds\": [\"631866\"],\n    \"maxItems\": 15,\n    \"includeDetails\": true\n}\n```\n\n## Modes and pagination\n\n1. **Direct IDs / activity URLs** — one detail-page fetch per activity.\n2. **Search queries** — the actor calls GetYourGuide's search-result blocks endpoint, reads `activity_card` objects, and follows the returned `loadMore` payload page after page.\n3. **Destination / attraction URLs** — same pagination against the destination's main activities section.\n4. **Category URLs** — same pagination scoped to the category ID in the URL.\n\nEach result page contains 24 activities. The actor stops at `maxItems`, after 50 pages, or when the source returns no new activities — whichever comes first. The source's own reported result count is logged, so a page cap is visible rather than silent.\n\n## Legacy inputs\n\nSaved tasks that send the old `query` key still work: the actor maps `query` onto `searchQueries` in code. `startUrls`, `maxItems`, and bare activity IDs keep their original meaning. The old `proxyConfiguration` field is accepted but ignored — no proxy setup is needed.\n\n## Limits and honest notes\n\n- GetYourGuide caps listing pagination at 50 pages (24 rows each) per query/listing. For deeper coverage, partition by category, date range, price bucket, or sub-destination.\n- Some activities do not publish a discount, supplier rating, group size, age limit, or meeting point. Those fields are omitted for that row.\n- Detail enrichment costs one page fetch per activity; turn `includeDetails` off for the cheapest, fastest listing-only runs.\n- Filters are applied by GetYourGuide's own search backend. Filter values that the site does not recognize are ignored rather than guessed.\n\n## Sentinels\n\nIf a run returns no real activities, the dataset gets one explanatory record instead of an empty dataset:\n\n- `gyg_no_results` — the inputs produced no matching activities.\n- `gyg_blocked` — GetYourGuide rejected every request path (direct, browser-cookied, and last-resort proxy).\n\nSentinels include the attempted queries/URLs, a reason, and `scrapedAt`.\n\n## FAQ\n\n**Do I need cookies, a login, or an API key?** No. The actor reads publicly visible GetYourGuide data.\n\n**Do I need to configure a proxy?** No. Direct requests are tried first. If a container IP is challenged, the actor handles the fallback internally.\n\n**Why is a field missing on one activity but present on another?** GetYourGuide only publishes some fields for some activities. Omit-empty output keeps the dataset honest.\n\n**Can I mix searches, URLs, and IDs?** Yes. All inputs are processed in order and deduplicated by activity ID.\n\n**Is this affiliated with GetYourGuide?** No. This is an independent actor that reads publicly available pages; it is not operated by or affiliated with GetYourGuide.\n",
    "actorDefinition": {
      "actorSpecification": 1,
      "name": "getyourguide-activity-pricing-and-highlights",
      "title": "GetYourGuide Activity Pricing & Highlights Extractor",
      "description": "Search GetYourGuide by destination, landmark, or activity keyword, or supply listing and activity URLs, and get pricing, ratings, highlights, inclusions, meeting points, cancellation policies, and supplier details for every tour or activity.",
      "version": "1.1",
      "buildTag": "latest",
      "minMemoryMbytes": 1024,
      "meta": {
        "templateId": "python-start"
      },
      "input": {
        "title": "GetYourGuide Activity Pricing & Highlights Extractor Input",
        "type": "object",
        "schemaVersion": 1,
        "properties": {
          "searchQueries": {
            "title": "Search queries",
            "type": "array",
            "description": "Cities, landmarks, or activity keywords to search on GetYourGuide. One search per item, e.g. 'rome', 'eiffel tower', 'food tour paris'. Used for the keyword-search mode.",
            "editor": "stringList",
            "prefill": [
              "rome"
            ],
            "sectionCaption": "Search"
          },
          "startUrls": {
            "title": "Start URLs (optional)",
            "type": "array",
            "description": "GetYourGuide URLs or activity IDs. Accepts search pages (/s/?q=...), destination/attraction pages (…-l<id>/), category pages (…-tc<id>/), activity pages (…-t<id>/), and bare IDs such as 631866 or t631866. URL query filters are preserved.",
            "editor": "stringList"
          },
          "activityIds": {
            "title": "Activity IDs (optional)",
            "type": "array",
            "description": "Direct GetYourGuide activity IDs. Each ID opens its activity page and returns full detail fields.",
            "editor": "stringList"
          },
          "maxItems": {
            "title": "Max items",
            "type": "integer",
            "description": "Maximum activities to return across all queries, URLs, and IDs.",
            "default": 30,
            "prefill": 1,
            "minimum": 1,
            "maximum": 2000,
            "editor": "number"
          },
          "includeDetails": {
            "title": "Fetch activity detail pages",
            "type": "boolean",
            "description": "Open each activity page to add full descriptions, highlights, inclusions, exclusions, meeting point, cancellation policy, supplier, and review fields. Turn off for the fastest search-card-only runs.",
            "default": true,
            "prefill": false
          },
          "maxReviews": {
            "title": "Reviews per activity",
            "type": "integer",
            "description": "How many recent reviews to attach to each activity (0 disables reviews). Only used when detail pages are fetched.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 50,
            "editor": "number"
          },
          "currency": {
            "title": "Currency",
            "type": "string",
            "description": "Currency for all prices.",
            "editor": "select",
            "default": "USD",
            "prefill": "USD",
            "enum": [
              "USD",
              "EUR",
              "GBP",
              "AUD",
              "CAD",
              "CHF",
              "JPY",
              "INR",
              "BRL",
              "MXN",
              "NZD",
              "SEK",
              "NOK",
              "DKK",
              "PLN",
              "CZK",
              "HUF",
              "RON",
              "TRY",
              "ZAR",
              "AED",
              "SAR",
              "ILS",
              "SGD",
              "HKD",
              "TWD",
              "KRW",
              "THB",
              "MYR",
              "IDR",
              "PHP",
              "VND",
              "CNY",
              "ARS",
              "CLP",
              "COP",
              "PEN",
              "RUB",
              "UAH",
              "EGP"
            ],
            "enumTitles": [
              "US Dollar",
              "Euro",
              "British Pound",
              "Australian Dollar",
              "Canadian Dollar",
              "Swiss Franc",
              "Japanese Yen",
              "Indian Rupee",
              "Brazilian Real",
              "Mexican Peso",
              "New Zealand Dollar",
              "Swedish Krona",
              "Norwegian Krone",
              "Danish Krone",
              "Polish Zloty",
              "Czech Koruna",
              "Hungarian Forint",
              "Romanian Leu",
              "Turkish Lira",
              "South African Rand",
              "UAE Dirham",
              "Saudi Riyal",
              "Israeli Shekel",
              "Singapore Dollar",
              "Hong Kong Dollar",
              "Taiwan Dollar",
              "South Korean Won",
              "Thai Baht",
              "Malaysian Ringgit",
              "Indonesian Rupiah",
              "Philippine Peso",
              "Vietnamese Dong",
              "Chinese Yuan",
              "Argentine Peso",
              "Chilean Peso",
              "Colombian Peso",
              "Peruvian Sol",
              "Russian Ruble",
              "Ukrainian Hryvnia",
              "Egyptian Pound"
            ],
            "sectionCaption": "Display"
          },
          "language": {
            "title": "Content language",
            "type": "string",
            "description": "Language for titles, descriptions, highlights, and policies.",
            "editor": "select",
            "default": "en",
            "prefill": "en",
            "enum": [
              "en",
              "de",
              "fr",
              "es",
              "it",
              "pt",
              "nl",
              "pl",
              "ru",
              "tr",
              "ja",
              "ko",
              "zh",
              "ar",
              "da",
              "sv",
              "no",
              "fi",
              "cs",
              "el",
              "he",
              "hu",
              "id",
              "ms",
              "ro",
              "sk",
              "sl",
              "sr",
              "th",
              "uk",
              "vi"
            ],
            "enumTitles": [
              "English",
              "German",
              "French",
              "Spanish",
              "Italian",
              "Portuguese",
              "Dutch",
              "Polish",
              "Russian",
              "Turkish",
              "Japanese",
              "Korean",
              "Chinese",
              "Arabic",
              "Danish",
              "Swedish",
              "Norwegian",
              "Finnish",
              "Czech",
              "Greek",
              "Hebrew",
              "Hungarian",
              "Indonesian",
              "Malay",
              "Romanian",
              "Slovak",
              "Slovenian",
              "Serbian",
              "Thai",
              "Ukrainian",
              "Vietnamese"
            ]
          },
          "sortBy": {
            "title": "Sort results",
            "type": "string",
            "description": "Order of search and listing results.",
            "editor": "select",
            "default": "popularity",
            "prefill": "popularity",
            "enum": [
              "popularity",
              "rating",
              "price_asc",
              "price_desc"
            ],
            "enumTitles": [
              "Most popular (GetYourGuide ranking)",
              "Highest rated",
              "Price: low to high",
              "Price: high to low"
            ]
          },
          "minRating": {
            "title": "Minimum rating",
            "type": "string",
            "description": "Only return activities with at least this star rating.",
            "editor": "select",
            "default": "any",
            "prefill": "any",
            "enum": [
              "any",
              "3.0",
              "3.5",
              "4.0",
              "4.5"
            ],
            "enumTitles": [
              "Any rating",
              "3.0+",
              "3.5+",
              "4.0+",
              "4.5+"
            ],
            "sectionCaption": "Filters"
          },
          "priceMin": {
            "title": "Minimum price",
            "type": "integer",
            "description": "Minimum starting price in the selected currency. 0 means no minimum.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 100000,
            "editor": "number"
          },
          "priceMax": {
            "title": "Maximum price",
            "type": "integer",
            "description": "Maximum starting price in the selected currency. 0 means no maximum.",
            "default": 0,
            "prefill": 0,
            "minimum": 0,
            "maximum": 100000,
            "editor": "number"
          },
          "dateFrom": {
            "title": "Available from",
            "type": "string",
            "description": "Only activities available on or after this date (YYYY-MM-DD). Leave empty for any date.",
            "editor": "datepicker"
          },
          "dateTo": {
            "title": "Available to",
            "type": "string",
            "description": "Only activities available on or before this date (YYYY-MM-DD). Leave empty for any date.",
            "editor": "datepicker"
          },
          "startTime": {
            "title": "Start time of day",
            "type": "array",
            "description": "Filter by start time. Any of: morning, afternoon, evening.",
            "editor": "stringList"
          },
          "durations": {
            "title": "Duration buckets",
            "type": "array",
            "description": "Filter by duration. Any of: up_to_3_hours, 3_to_5_hours, 5_to_7_hours, full_day, 2_days, 3_days, 4_days, 5_days_plus.",
            "editor": "stringList"
          },
          "features": {
            "title": "Activity features",
            "type": "array",
            "description": "Filter by features. Any of: private_tour, skip_the_line, small_group, wheelchair_accessible, hotel_pickup, gyg_originals.",
            "editor": "stringList"
          },
          "guideLanguages": {
            "title": "Guide languages",
            "type": "array",
            "description": "Only activities offered in these guide languages, using two-letter codes (en, de, fr, es, it, pt, …).",
            "editor": "stringList",
            "sectionCaption": "Advanced filters"
          },
          "interests": {
            "title": "Interest IDs",
            "type": "array",
            "description": "GetYourGuide interest IDs such as tc-27 (culture & history) or tc-103 (food & drink). Copy them from a search page URL or the available filters.",
            "editor": "stringList"
          },
          "places": {
            "title": "Place IDs",
            "type": "array",
            "description": "Numeric GetYourGuide place/attraction IDs (e.g. 2619 for the Colosseum). Copy them from a search page URL.",
            "editor": "stringList"
          },
          "departsFrom": {
            "title": "Departure city IDs",
            "type": "array",
            "description": "Numeric departure-city IDs. Copy them from a search page URL.",
            "editor": "stringList"
          }
        },
        "required": []
      },
      "output": {
        "actorOutputSchemaVersion": 1,
        "title": "GetYourGuide Activity Pricing & Highlights Extractor Output",
        "description": "GetYourGuide tours and activities with pricing, ratings, highlights, inclusions, meeting points, cancellation policies, supplier details, and optional reviews.",
        "properties": {
          "activities": {
            "type": "string",
            "title": "GetYourGuide activities",
            "description": "Dataset containing every scraped GetYourGuide activity record (or one explanatory sentinel when no activity was returned).",
            "template": "{{links.apiDefaultDatasetUrl}}/items"
          }
        }
      },
      "dockerfile": "../Dockerfile",
      "storages": {
        "dataset": {
          "actorSpecification": 1,
          "title": "GetYourGuide Activities",
          "fields": {
            "type": "object",
            "properties": {
              "type": {
                "type": "string",
                "description": "Record type: gyg_activity for an activity, or gyg_no_results / gyg_blocked for an explanatory sentinel."
              },
              "id": {
                "type": "string",
                "description": "GetYourGuide activity (tour) ID."
              },
              "url": {
                "type": "string",
                "description": "Canonical activity URL on getyourguide.com."
              },
              "title": {
                "type": "string",
                "nullable": true,
                "description": "Activity title."
              },
              "shortDescription": {
                "type": "string",
                "nullable": true,
                "description": "Short marketing description shown on the activity card."
              },
              "description": {
                "type": "string",
                "nullable": true,
                "description": "Full activity description from the detail page."
              },
              "city": {
                "type": "string",
                "nullable": true,
                "description": "City where the activity takes place."
              },
              "citySlug": {
                "type": "string",
                "nullable": true,
                "description": "City slug from the activity URL (e.g. rome, new-york)."
              },
              "region": {
                "type": "string",
                "nullable": true,
                "description": "Region/area from the activity breadcrumb."
              },
              "country": {
                "type": "string",
                "nullable": true,
                "description": "Country where the activity takes place."
              },
              "latitude": {
                "type": "number",
                "nullable": true,
                "description": "Meeting-point latitude when published."
              },
              "longitude": {
                "type": "number",
                "nullable": true,
                "description": "Meeting-point longitude when published."
              },
              "meetingPoint": {
                "type": "string",
                "nullable": true,
                "description": "Meeting-point instructions when published."
              },
              "price": {
                "type": "number",
                "nullable": true,
                "description": "Starting price for the activity."
              },
              "originalPrice": {
                "type": "number",
                "nullable": true,
                "description": "Undiscounted price when a discount is active."
              },
              "currency": {
                "type": "string",
                "nullable": true,
                "description": "ISO currency code (e.g. USD, EUR)."
              },
              "discountPercent": {
                "type": "integer",
                "nullable": true,
                "description": "Active discount percentage when shown."
              },
              "pricingType": {
                "type": "string",
                "nullable": true,
                "description": "Price unit label, e.g. per person or per group."
              },
              "rating": {
                "type": "number",
                "nullable": true,
                "description": "Average star rating (0-5)."
              },
              "reviewCount": {
                "type": "integer",
                "nullable": true,
                "description": "Number of user reviews."
              },
              "duration": {
                "type": "string",
                "nullable": true,
                "description": "Activity duration (e.g. '2.5 hours', '1 day')."
              },
              "category": {
                "type": "string",
                "nullable": true,
                "description": "GetYourGuide activity category (e.g. guidedTour, entryTicket)."
              },
              "activityType": {
                "type": "string",
                "nullable": true,
                "description": "GetYourGuide activity type."
              },
              "language": {
                "type": "string",
                "nullable": true,
                "description": "Content language locale used for the record."
              },
              "guideLanguages": {
                "type": "array",
                "nullable": true,
                "description": "Languages the activity is offered in."
              },
              "images": {
                "type": "array",
                "nullable": true,
                "description": "Activity image URLs."
              },
              "highlights": {
                "type": "array",
                "nullable": true,
                "description": "Highlight bullet points."
              },
              "whatIncluded": {
                "type": "array",
                "nullable": true,
                "description": "Inclusions listed under Includes."
              },
              "whatExcluded": {
                "type": "array",
                "nullable": true,
                "description": "Exclusions listed under Includes."
              },
              "goodToKnow": {
                "type": "array",
                "nullable": true,
                "description": "Know-before-you-go notes."
              },
              "whatToBring": {
                "type": "array",
                "nullable": true,
                "description": "Items travelers should bring."
              },
              "notAllowed": {
                "type": "array",
                "nullable": true,
                "description": "Items or behaviors not allowed on the activity."
              },
              "notSuitableFor": {
                "type": "array",
                "nullable": true,
                "description": "Traveler groups the activity is not suitable for."
              },
              "itinerary": {
                "type": "array",
                "nullable": true,
                "description": "Stops from the structured itinerary, when published."
              },
              "cancellationPolicy": {
                "type": "string",
                "nullable": true,
                "description": "Cancellation policy summary."
              },
              "bookingOptions": {
                "type": "array",
                "nullable": true,
                "description": "Ticket or option titles when published."
              },
              "maxGroupSize": {
                "type": "integer",
                "nullable": true,
                "description": "Maximum group size when published."
              },
              "minAge": {
                "type": "integer",
                "nullable": true,
                "description": "Minimum age when published."
              },
              "supplierName": {
                "type": "string",
                "nullable": true,
                "description": "Activity provider name."
              },
              "supplierRating": {
                "type": "number",
                "nullable": true,
                "description": "Supplier rating when published."
              },
              "badges": {
                "type": "array",
                "nullable": true,
                "description": "Labels shown on the activity, e.g. Bestseller, Skip the line."
              },
              "availability": {
                "type": "string",
                "nullable": true,
                "description": "Availability message shown on the listing."
              },
              "nextAvailable": {
                "type": "string",
                "nullable": true,
                "description": "Next available date-time when the listing exposes it."
              },
              "recentBookings": {
                "type": "string",
                "nullable": true,
                "description": "Recent-bookings social-proof text (e.g. 'Booked 99 times yesterday')."
              },
              "reviewSummary": {
                "type": "string",
                "nullable": true,
                "description": "AI-generated review summary shown on the activity page."
              },
              "reviews": {
                "type": "array",
                "nullable": true,
                "description": "Recent reviews with author, date, rating, and text."
              },
              "breadcrumbs": {
                "type": "array",
                "nullable": true,
                "description": "Breadcrumb labels from the activity page."
              },
              "searchQuery": {
                "type": "string",
                "nullable": true,
                "description": "Search query that produced this record."
              },
              "sourceUrl": {
                "type": "string",
                "nullable": true,
                "description": "Listing/search URL that produced this record."
              },
              "rank": {
                "type": "integer",
                "nullable": true,
                "description": "Position in the search or listing result order."
              },
              "freeCancellation": {
                "type": "boolean",
                "nullable": true,
                "description": "True when free cancellation is offered."
              },
              "skipTheLine": {
                "type": "boolean",
                "nullable": true,
                "description": "True when skip-the-line entry is offered."
              },
              "mobileTicket": {
                "type": "boolean",
                "nullable": true,
                "description": "True when a mobile ticket is accepted."
              },
              "instantConfirmation": {
                "type": "boolean",
                "nullable": true,
                "description": "True when confirmation is instant."
              },
              "pickupIncluded": {
                "type": "boolean",
                "nullable": true,
                "description": "True when pickup is included."
              },
              "wheelchairAccessible": {
                "type": "boolean",
                "nullable": true,
                "description": "True when the activity is wheelchair accessible."
              },
              "smallGroup": {
                "type": "boolean",
                "nullable": true,
                "description": "True when a small-group option exists."
              },
              "privateTour": {
                "type": "boolean",
                "nullable": true,
                "description": "True when a private-tour option exists."
              },
              "liveGuide": {
                "type": "boolean",
                "nullable": true,
                "description": "True when a live guide is included."
              },
              "scrapedAt": {
                "type": "string",
                "description": "ISO-8601 UTC timestamp of when the record was scraped."
              }
            }
          },
          "views": {
            "overview": {
              "title": "Activities Overview",
              "transformation": {
                "fields": [
                  "title",
                  "city",
                  "country",
                  "price",
                  "currency",
                  "rating",
                  "reviewCount",
                  "duration",
                  "url"
                ]
              },
              "display": {
                "component": "table",
                "properties": {
                  "title": {
                    "label": "Title",
                    "format": "text"
                  },
                  "city": {
                    "label": "City",
                    "format": "text"
                  },
                  "country": {
                    "label": "Country",
                    "format": "text"
                  },
                  "price": {
                    "label": "Price",
                    "format": "number"
                  },
                  "currency": {
                    "label": "Currency",
                    "format": "text"
                  },
                  "rating": {
                    "label": "Rating",
                    "format": "number"
                  },
                  "reviewCount": {
                    "label": "Reviews",
                    "format": "number"
                  },
                  "duration": {
                    "label": "Duration",
                    "format": "text"
                  },
                  "url": {
                    "label": "URL",
                    "format": "link"
                  }
                }
              }
            }
          }
        }
      },
      "readme": "# GetYourGuide Activity Pricing & Highlights Extractor\n\nTurn GetYourGuide into a structured activity feed. Search a city, landmark, or activity phrase, or point the actor at GetYourGuide search, destination, category, or activity URLs, and receive pricing, ratings, highlights, inclusions, meeting points, cancellation terms, and supplier details for every tour you collect.\n\n## What it does\n\n- **Keyword search** — one query per item (`rome`, `eiffel tower`, `food tour paris`) with the site's own filters and sort orders.\n- **URL and ID mode** — accepts search pages, destination/attraction pages, category pages, activity pages, and bare activity IDs (`631866` / `t631866`).\n- **Pagination** — follows the listing's \"show more\" data until the source stops returning activities (up to 50 pages, 24 per page, per query).\n- **Optional detail enrichment** — opens each activity for full descriptions, highlights, includes/excludes, meeting point + coordinates, cancellation policy, supplier, guides, itinerary, and reviews.\n- **Cookieless** — no login, cookies, or API key required. Requests use GetYourGuide's public SDUI JSON and page data directly.\n\n## Output per activity\n\nIdentity and place: `type`, `id`, `url`, `title`, `shortDescription`, `description`, `city`, `citySlug`, `region`, `country`, `latitude`, `longitude`, `meetingPoint`.\n\nCommercial: `price`, `originalPrice`, `currency`, `discountPercent`, `pricingType`, `rating`, `reviewCount`, `cancellationPolicy`, `freeCancellation`, `supplierName`.\n\nPractical detail: `duration`, `category`, `activityType`, `guideLanguages`, `images`, `highlights`, `whatIncluded`, `whatExcluded`, `goodToKnow`, `whatToBring`, `notAllowed`, `notSuitableFor`, `itinerary`, `bookingOptions`, `maxGroupSize`, `minAge`, `badges`, `availability`, `nextAvailable`, `recentBookings`, `reviewSummary`, `reviews`, `breadcrumbs`.\n\nBooking flags: `skipTheLine`, `mobileTicket`, `instantConfirmation`, `pickupIncluded`, `wheelchairAccessible`, `smallGroup`, `privateTour`, `liveGuide`.\n\nRun metadata: `searchQuery`, `sourceUrl`, `rank`, `scrapedAt`.\n\nA field GetYourGuide does not publish for an activity is omitted, never returned as `null` or an empty string.\n\n## Input\n\n| Field | Type | Default | Purpose |\n|---|---|---|---|\n| `searchQueries` | array | `[\"rome\"]` | Cities, landmarks, or activity keywords. |\n| `startUrls` | array | – | GetYourGuide search, destination, category, or activity URLs, or bare IDs. |\n| `activityIds` | array | – | Direct activity IDs. |\n| `maxItems` | integer | 30 | Global cap across all inputs (1–2000). |\n| `includeDetails` | boolean | true | Open detail pages for the full field set. |\n| `maxReviews` | integer | 0 | Recent reviews per activity (0–50). |\n| `currency` | select | USD | Currency for prices. |\n| `language` | select | English | Language of titles and descriptions. |\n| `sortBy` | select | popularity | Popularity, rating, price ascending, or price descending. |\n| `minRating` | select | any | 3.0+, 3.5+, 4.0+, or 4.5+. |\n| `priceMin` / `priceMax` | integer | 0 | Price range; 0 means unbounded. |\n| `dateFrom` / `dateTo` | date | – | Only activities available in the date range. |\n| `startTime` | array | – | Morning, afternoon, or evening. |\n| `durations` | array | – | Up to 3h, 3–5h, 5–7h, full day, or 2–5+ days. |\n| `features` | array | – | Private, skip the line, small group, wheelchair, pickup, or GetYourGuide Originals. |\n| `guideLanguages` | array | – | Two-letter guide-language codes. |\n| `interests` / `places` / `departsFrom` | array | – | Advanced GetYourGuide filter IDs copied from a search URL. |\n\n### Example: search with filters\n\n```json\n{\n    \"searchQueries\": [\"rome\"],\n    \"maxItems\": 20,\n    \"includeDetails\": true,\n    \"sortBy\": \"rating\",\n    \"minRating\": \"4.5\",\n    \"features\": [\"skip_the_line\"],\n    \"currency\": \"EUR\",\n    \"language\": \"en\"\n}\n```\n\n### Example: URLs and an ID\n\n```json\n{\n    \"startUrls\": [\n        \"https://www.getyourguide.com/rome-l33/\",\n        \"https://www.getyourguide.com/s/?q=eiffel+tower&services=stl\"\n    ],\n    \"activityIds\": [\"631866\"],\n    \"maxItems\": 15,\n    \"includeDetails\": true\n}\n```\n\n## Modes and pagination\n\n1. **Direct IDs / activity URLs** — one detail-page fetch per activity.\n2. **Search queries** — the actor calls GetYourGuide's search-result blocks endpoint, reads `activity_card` objects, and follows the returned `loadMore` payload page after page.\n3. **Destination / attraction URLs** — same pagination against the destination's main activities section.\n4. **Category URLs** — same pagination scoped to the category ID in the URL.\n\nEach result page contains 24 activities. The actor stops at `maxItems`, after 50 pages, or when the source returns no new activities — whichever comes first. The source's own reported result count is logged, so a page cap is visible rather than silent.\n\n## Legacy inputs\n\nSaved tasks that send the old `query` key still work: the actor maps `query` onto `searchQueries` in code. `startUrls`, `maxItems`, and bare activity IDs keep their original meaning. The old `proxyConfiguration` field is accepted but ignored — no proxy setup is needed.\n\n## Limits and honest notes\n\n- GetYourGuide caps listing pagination at 50 pages (24 rows each) per query/listing. For deeper coverage, partition by category, date range, price bucket, or sub-destination.\n- Some activities do not publish a discount, supplier rating, group size, age limit, or meeting point. Those fields are omitted for that row.\n- Detail enrichment costs one page fetch per activity; turn `includeDetails` off for the cheapest, fastest listing-only runs.\n- Filters are applied by GetYourGuide's own search backend. Filter values that the site does not recognize are ignored rather than guessed.\n\n## Sentinels\n\nIf a run returns no real activities, the dataset gets one explanatory record instead of an empty dataset:\n\n- `gyg_no_results` — the inputs produced no matching activities.\n- `gyg_blocked` — GetYourGuide rejected every request path (direct, browser-cookied, and last-resort proxy).\n\nSentinels include the attempted queries/URLs, a reason, and `scrapedAt`.\n\n## FAQ\n\n**Do I need cookies, a login, or an API key?** No. The actor reads publicly visible GetYourGuide data.\n\n**Do I need to configure a proxy?** No. Direct requests are tried first. If a container IP is challenged, the actor handles the fallback internally.\n\n**Why is a field missing on one activity but present on another?** GetYourGuide only publishes some fields for some activities. Omit-empty output keeps the dataset honest.\n\n**Can I mix searches, URLs, and IDs?** Yes. All inputs are processed in order and deduplicated by activity ID.\n\n**Is this affiliated with GetYourGuide?** No. This is an independent actor that reads publicly available pages; it is not operated by or affiliated with GetYourGuide.\n"
    },
    "buildNumber": "1.1.1",
    "imageDigest": "e5e8c81745e18174c99c2c9ef0ba66d8f4ac6b5de25189dff07a2aa8e8de86f9",
    "actVersion": {
      "sourceType": "SOURCE_FILES",
      "buildTag": "latest",
      "versionNumber": "1.1"
    },
    "usage": {
      "ACTOR_COMPUTE_UNITS": 0.07353
    }
  }
}