{
  "openapi": "3.0.1",
  "info": {
    "title": "GetYourGuide Price & Review Monitor – Competitor Tracker",
    "description": "Get alerts when GetYourGuide tours change price, sell out, gain reviews or ratings, and when new competitors launch in your city. Only changes, no duplicate rows. Built for tour operators: schedule daily and send to Slack, email or Sheets.",
    "version": "0.0",
    "x-build-id": "j7VGJO9eQJXltHw14"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/voranil~getyourguide-price-monitor/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-voranil-getyourguide-price-monitor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    },
    "/acts/voranil~getyourguide-price-monitor/runs": {
      "post": {
        "operationId": "runs-sync-voranil-getyourguide-price-monitor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor and returns information about the initiated run in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/runsResponseSchema"
                }
              }
            }
          }
        }
      }
    },
    "/acts/voranil~getyourguide-price-monitor/run-sync": {
      "post": {
        "operationId": "run-sync-voranil-getyourguide-price-monitor",
        "x-openai-isConsequential": false,
        "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
        "tags": [
          "Run Actor"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/inputSchema"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "token",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "Enter your Apify token here"
          }
        ],
        "responses": {
          "200": {
            "description": "OK"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "inputSchema": {
        "type": "object",
        "properties": {
          "tourUrls": {
            "title": "Tour URLs",
            "type": "array",
            "description": "GetYourGuide tour pages to watch, e.g. https://www.getyourguide.com/antalya-l172/antalya-suluada-island-boat-trip-with-lunch-hotel-pickup-t468561/. Required unless you give search queries.",
            "items": {
              "type": "string"
            }
          },
          "searchQueries": {
            "title": "Listings to watch for new competitors",
            "type": "array",
            "description": "GetYourGuide listing pages (recommended), e.g. https://www.getyourguide.com/antalya-l172/, or free-text searches such as \"antalya boat tour\". New tours appearing here are reported as NEW_COMPETITOR. Free-text search results on GetYourGuide can be unrelated to the query, so prefer listing URLs.",
            "items": {
              "type": "string"
            }
          },
          "trackPrice": {
            "title": "Track price",
            "type": "boolean",
            "description": "Report changes of the \"From\" price per person.",
            "default": true
          },
          "trackAvailability": {
            "title": "Track availability",
            "type": "boolean",
            "description": "Report dates that become available, sold out or unavailable. Needs each tour's own page, so it is billed as an extra availability-checked event per tour.",
            "default": false
          },
          "availabilityDays": {
            "title": "Availability window (days)",
            "minimum": 1,
            "maximum": 365,
            "type": "integer",
            "description": "How many days ahead to watch availability for, starting tomorrow. Today is skipped because same-day booking closes during the day, which would look like a change on every run.",
            "default": 14
          },
          "trackReviews": {
            "title": "Track new reviews",
            "type": "boolean",
            "description": "Report new reviews (rating, text, date, language). Reviewer names are never collected.",
            "default": true
          },
          "maxReviewsPerTour": {
            "title": "Max new reviews per tour per run",
            "minimum": 1,
            "maximum": 500,
            "type": "integer",
            "description": "Upper limit of newest reviews checked per tour in one run. Paging stops earlier once already-seen reviews are reached.",
            "default": 50
          },
          "minPriceChangePct": {
            "title": "Minimum price change (%)",
            "minimum": 0,
            "maximum": 100,
            "type": "integer",
            "description": "Only report price changes of at least this many percent. 0 reports every change of 0.01 or more. Smaller moves are not lost: they add up until they cross the threshold.",
            "default": 0
          },
          "minReviewCountChange": {
            "title": "Minimum new reviews for a rating change",
            "minimum": 1,
            "maximum": 100000,
            "type": "integer",
            "description": "Report a RATING_CHANGE when the review count grows by at least this many (a rating move of 0.05 or more is always reported). Each new review is already its own NEW_REVIEW item, so the default only flags bigger bursts. Set 1 to get a rating alert on every new review.",
            "default": 10
          },
          "minRankChange": {
            "title": "Minimum rank change (places)",
            "minimum": 1,
            "maximum": 1000,
            "type": "integer",
            "description": "Report a RANK_CHANGE when a tour moves at least this many places in its city ranking (fast mode), on two runs in a row in the same direction. GetYourGuide's ranking shuffles during the day, so a one-off jump is ignored. Small moves add up until they cross the threshold.",
            "default": 3
          },
          "currency": {
            "title": "Preferred currency",
            "type": "string",
            "description": "3-letter currency code you expect prices in. GetYourGuide chooses the currency by visitor location, so the actual currency is reported on every price, and prices are only compared within the same currency. A warning is logged when it differs.",
            "default": "EUR"
          },
          "language": {
            "title": "Language",
            "type": "string",
            "description": "Language code sent to GetYourGuide as the preferred page language. Reviews in all languages are reported, each with its language.",
            "default": "en"
          },
          "includeSnapshot": {
            "title": "Include full snapshot",
            "type": "boolean",
            "description": "Also output one SNAPSHOT item per tour with its full current state, even when nothing changed.",
            "default": false
          },
          "includeOperatorName": {
            "title": "Include operator name",
            "type": "boolean",
            "description": "Look up the company that runs each tour and add it to every alert. Needs one extra tour-page request per tour, once (it is remembered afterwards); tours read from their own page get it for free.",
            "default": false
          },
          "maxConcurrency": {
            "title": "Max concurrency",
            "minimum": 1,
            "maximum": 20,
            "type": "integer",
            "description": "Maximum parallel requests. Keep this low to avoid being blocked.",
            "default": 4
          },
          "useLocationFeed": {
            "title": "Fast mode: read tours from the city feed",
            "type": "boolean",
            "description": "Reads up to 24 tours per request from GetYourGuide's city feed (price in your currency, discount, rating, review count, \"booked yesterday\"), which makes runs much cheaper. Tours not found in the feed are checked on their own page automatically. When availability tracking is on, tours are read from their own pages, because per-date availability exists only there.",
            "default": true
          },
          "feedMaxPages": {
            "title": "Feed pages per city",
            "minimum": 1,
            "maximum": 50,
            "type": "integer",
            "description": "How many feed pages (24 tours each) to read per city: for your tours before checking any missing ones on their own page, and for each listing in \"Listings to watch\" when scanning for new competitors. Each listing page scanned is billed as one listing-page-checked event.",
            "default": 3
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Proxies used for requests. GetYourGuide blocks most automated requests; the UNBLOCKER group (Special tab) is the only option that worked reliably in testing. If you leave this empty, runs on Apify use UNBLOCKER automatically."
          }
        }
      },
      "runsResponseSchema": {
        "type": "object",
        "properties": {
          "data": {
            "type": "object",
            "properties": {
              "id": {
                "type": "string"
              },
              "actId": {
                "type": "string"
              },
              "userId": {
                "type": "string"
              },
              "startedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "finishedAt": {
                "type": "string",
                "format": "date-time",
                "example": "2025-01-08T00:00:00.000Z"
              },
              "status": {
                "type": "string",
                "example": "READY"
              },
              "meta": {
                "type": "object",
                "properties": {
                  "origin": {
                    "type": "string",
                    "example": "API"
                  },
                  "userAgent": {
                    "type": "string"
                  }
                }
              },
              "stats": {
                "type": "object",
                "properties": {
                  "inputBodyLen": {
                    "type": "integer",
                    "example": 2000
                  },
                  "rebootCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "restartCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "resurrectCount": {
                    "type": "integer",
                    "example": 0
                  },
                  "computeUnits": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "options": {
                "type": "object",
                "properties": {
                  "build": {
                    "type": "string",
                    "example": "latest"
                  },
                  "timeoutSecs": {
                    "type": "integer",
                    "example": 300
                  },
                  "memoryMbytes": {
                    "type": "integer",
                    "example": 1024
                  },
                  "diskMbytes": {
                    "type": "integer",
                    "example": 2048
                  }
                }
              },
              "buildId": {
                "type": "string"
              },
              "defaultKeyValueStoreId": {
                "type": "string"
              },
              "defaultDatasetId": {
                "type": "string"
              },
              "defaultRequestQueueId": {
                "type": "string"
              },
              "buildNumber": {
                "type": "string",
                "example": "1.0.0"
              },
              "containerUrl": {
                "type": "string"
              },
              "usage": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "integer",
                    "example": 1
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              },
              "usageTotalUsd": {
                "type": "number",
                "example": 0.00005
              },
              "usageUsd": {
                "type": "object",
                "properties": {
                  "ACTOR_COMPUTE_UNITS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATASET_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "KEY_VALUE_STORE_WRITES": {
                    "type": "number",
                    "example": 0.00005
                  },
                  "KEY_VALUE_STORE_LISTS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_READS": {
                    "type": "integer",
                    "example": 0
                  },
                  "REQUEST_QUEUE_WRITES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_INTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "DATA_TRANSFER_EXTERNAL_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_SERPS": {
                    "type": "integer",
                    "example": 0
                  },
                  "PROXY_UNBLOCKER_UNITS": {
                    "type": "integer",
                    "example": 0
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}