{
  "openapi": "3.0.1",
  "info": {
    "title": "Package Holiday Price Comparison - Pauschalreise, TUI, DERTOUR",
    "description": "Compare Pauschalreise offers & package holiday prices across five German travel sources - TUI, DERTOUR, weg.de, ab-in-den-urlaub.de and alltours - in one normalized dataset. GIATA hotel matching, departure airport comparison, 90-day price history & buy-or-wait signals. Pauschalreisen price API.",
    "version": "1.0",
    "x-build-id": "i1gS5FETa8RhJv4Vr"
  },
  "servers": [
    {
      "url": "https://api.apify.com/v2"
    }
  ],
  "paths": {
    "/acts/kamerozkan~dach-package-holiday-price-api/run-sync-get-dataset-items": {
      "post": {
        "operationId": "run-sync-get-dataset-items-kamerozkan-dach-package-holiday-price-api",
        "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/kamerozkan~dach-package-holiday-price-api/runs": {
      "post": {
        "operationId": "runs-sync-kamerozkan-dach-package-holiday-price-api",
        "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/kamerozkan~dach-package-holiday-price-api/run-sync": {
      "post": {
        "operationId": "run-sync-kamerozkan-dach-package-holiday-price-api",
        "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",
        "required": [
          "destination",
          "startDate",
          "endDate",
          "departureAirports"
        ],
        "properties": {
          "destination": {
            "title": "Destination",
            "minLength": 2,
            "maxLength": 120,
            "type": "string",
            "description": "Country, region, or city, for example Antalya, Türkische Riviera, Mallorca, or Hurghada.",
            "default": "Antalya"
          },
          "startDate": {
            "title": "Earliest departure",
            "pattern": "^(?:\\d{4}-\\d{2}-\\d{2}|\\d+\\s*(?:day|week|month|year)s?)$",
            "type": "string",
            "description": "Beginning of the departure search window. Use YYYY-MM-DD or a relative value such as 8 weeks."
          },
          "endDate": {
            "title": "Latest departure",
            "pattern": "^(?:\\d{4}-\\d{2}-\\d{2}|\\d+\\s*(?:day|week|month|year)s?)$",
            "type": "string",
            "description": "End of the departure search window. Use YYYY-MM-DD or a relative value such as 10 weeks."
          },
          "nights": {
            "title": "Nights",
            "minimum": 1,
            "maximum": 42,
            "type": "integer",
            "description": "Requested trip duration.",
            "default": 7
          },
          "adults": {
            "title": "Adults",
            "minimum": 1,
            "maximum": 10,
            "type": "integer",
            "description": "Number of adult travellers.",
            "default": 2
          },
          "childAges": {
            "title": "Children's ages",
            "maxItems": 8,
            "type": "array",
            "description": "Age of each child on departure. Leave empty when travelling without children.",
            "items": {
              "type": "integer",
              "minimum": 0,
              "maximum": 17
            },
            "default": []
          },
          "departureAirports": {
            "title": "Departure airports",
            "minItems": 1,
            "maxItems": 20,
            "uniqueItems": true,
            "type": "array",
            "description": "Three-letter IATA codes, for example DUS, MUC, FRA. Offers that explicitly return a different airport are discarded and reported as a source-contract error.",
            "items": {
              "type": "string",
              "pattern": "^[A-Za-z]{3}$"
            },
            "default": [
              "DUS"
            ]
          },
          "operators": {
            "title": "Operators",
            "minItems": 1,
            "maxItems": 5,
            "uniqueItems": true,
            "type": "array",
            "description": "Sources to query. Each selected source that completes a search bills one successful-source-search event ($0.015), so a five-source run can charge up to five of them plus $0.001 per normalized offer row; failed source searches are not charged.",
            "items": {
              "type": "string",
              "enum": [
                "tui",
                "dertour",
                "weg",
                "aidu",
                "alltours"
              ],
              "enumTitles": [
                "TUI Germany",
                "DERTOUR Germany",
                "weg.de",
                "ab-in-den-urlaub.de",
                "alltours"
              ]
            },
            "default": [
              "tui",
              "dertour",
              "weg",
              "aidu",
              "alltours"
            ]
          },
          "outputMode": {
            "title": "Output mode",
            "enum": [
              "offers",
              "comparisons"
            ],
            "type": "string",
            "description": "Offers returns one row per source offer. Comparisons returns one row per GIATA hotel with the cheapest offer of every source side by side, including matchQuality that declares per dimension what was matched exactly and what was normalized.",
            "default": "offers"
          },
          "comparisonMode": {
            "title": "Comparison basis",
            "enum": [
              "lowest_offer_in_search_window",
              "like_for_like_package"
            ],
            "type": "string",
            "description": "Compare each source's cheapest offer for a hotel, or only packages with matching dates, duration, occupancy, airport, room class, and board class.",
            "default": "lowest_offer_in_search_window"
          },
          "maxResultsPerOperator": {
            "title": "Maximum results per operator",
            "minimum": 1,
            "maximum": 100,
            "type": "integer",
            "description": "Caps the number of normalized offers emitted by each selected operator.",
            "default": 20
          },
          "sort": {
            "title": "Sort",
            "enum": [
              "priceAsc",
              "recommended"
            ],
            "type": "string",
            "description": "Requests price ordering or the source's recommendation ordering.",
            "default": "priceAsc"
          },
          "includeRaw": {
            "title": "Include raw source records",
            "type": "boolean",
            "description": "Useful for debugging but increases dataset size.",
            "default": false
          },
          "history": {
            "title": "Price history",
            "type": "object",
            "description": "Persist deduplicated observations and optionally emit 90-day price series.",
            "properties": {
              "enabled": {
                "title": "Enable history",
                "description": "Persist deduplicated observations in the selected store.",
                "type": "boolean",
                "default": false
              },
              "storeName": {
                "title": "Key-value store name",
                "description": "Named store containing sharded history and derived state.",
                "type": "string",
                "default": "package-price-history",
                "pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$",
                "minLength": 3,
                "maxLength": 63
              },
              "retentionDays": {
                "title": "Retention days",
                "description": "Delete observations older than this rolling window.",
                "type": "integer",
                "default": 90,
                "minimum": 7,
                "maximum": 365
              },
              "observationIntervalHours": {
                "title": "Deduplication interval (hours)",
                "description": "Keep at most one observation per exact offer and time bucket.",
                "type": "integer",
                "default": 24,
                "minimum": 1,
                "maximum": 24
              },
              "emitSeries": {
                "title": "Emit price series",
                "description": "Write updated series records to the default dataset.",
                "type": "boolean",
                "default": true
              }
            },
            "default": {
              "enabled": false,
              "storeName": "package-price-history",
              "retentionDays": 90,
              "observationIntervalHours": 24,
              "emitSeries": true
            },
            "additionalProperties": false
          },
          "enrichment": {
            "title": "Offer detail enrichment",
            "type": "object",
            "description": "Optionally visit a bounded number of source offer pages to fill evidence-backed baggage, transfer, and flexible-cancellation fields. Successful lookups are cached.",
            "properties": {
              "enabled": {
                "title": "Enable enrichment",
                "description": "Visit detail pages when list responses omit useful package inclusions.",
                "type": "boolean",
                "default": false
              },
              "storeName": {
                "title": "Enrichment cache store",
                "description": "Named key-value store used for bounded detail-response caching.",
                "type": "string",
                "default": "package-offer-enrichment",
                "pattern": "^[a-z0-9][a-z0-9-]*[a-z0-9]$",
                "minLength": 3,
                "maxLength": 63
              },
              "ttlHours": {
                "title": "Cache lifetime (hours)",
                "description": "How long verified detail evidence may be reused.",
                "type": "integer",
                "default": 6,
                "minimum": 1,
                "maximum": 72
              },
              "maxOffersPerSource": {
                "title": "Maximum enriched offers per source",
                "description": "Hard per-search cap on detail-page lookups.",
                "type": "integer",
                "default": 3,
                "minimum": 1,
                "maximum": 10
              }
            },
            "default": {
              "enabled": false,
              "storeName": "package-offer-enrichment",
              "ttlHours": 6,
              "maxOffersPerSource": 3
            },
            "additionalProperties": false
          },
          "airportMatrix": {
            "title": "Departure-airport matrix",
            "type": "object",
            "description": "Fan out one search per airport and emit comparable package prices by departure point.",
            "properties": {
              "enabled": {
                "title": "Enable airport matrix",
                "description": "Run one isolated search per requested departure airport.",
                "type": "boolean",
                "default": false
              },
              "maxAirports": {
                "title": "Maximum airports",
                "description": "Reject matrix inputs exceeding this number of airports.",
                "type": "integer",
                "default": 8,
                "minimum": 1,
                "maximum": 20
              },
              "concurrency": {
                "title": "Concurrent searches",
                "description": "Maximum parallel source searches; capped for browser memory safety.",
                "type": "integer",
                "default": 3,
                "minimum": 1,
                "maximum": 4
              },
              "requestBudget": {
                "title": "Maximum source searches",
                "description": "Hard limit on operator and airport search combinations.",
                "type": "integer",
                "default": 50,
                "minimum": 1,
                "maximum": 500
              },
              "emitRows": {
                "title": "Emit matrix records",
                "description": "Write airport-matrix records to the default dataset.",
                "type": "boolean",
                "default": true
              }
            },
            "default": {
              "enabled": false,
              "maxAirports": 8,
              "concurrency": 3,
              "requestBudget": 50,
              "emitRows": true
            },
            "additionalProperties": false
          },
          "signals": {
            "title": "Capacity and price signals",
            "type": "object",
            "description": "Calculate explainable availability-narrowing and price-jump signals from stored observations.",
            "properties": {
              "enabled": {
                "title": "Enable signals",
                "description": "Calculate price and availability-narrowing signals from history.",
                "type": "boolean",
                "default": false
              },
              "minimumSnapshots": {
                "title": "Minimum snapshots",
                "description": "Minimum distinct time buckets required before scoring.",
                "type": "integer",
                "default": 3,
                "minimum": 3,
                "maximum": 30
              },
              "evidenceWindowDays": {
                "title": "Evidence window (days)",
                "description": "Rolling observation window used to calculate signals.",
                "type": "integer",
                "default": 14,
                "minimum": 3,
                "maximum": 90
              },
              "emitRows": {
                "title": "Emit signal records",
                "description": "Write market-signal records to the default dataset.",
                "type": "boolean",
                "default": true
              }
            },
            "default": {
              "enabled": false,
              "minimumSnapshots": 3,
              "evidenceWindowDays": 14,
              "emitRows": true
            },
            "additionalProperties": false
          },
          "forecast": {
            "title": "Buy/wait forecast",
            "type": "object",
            "description": "Generate an explainable informational recommendation from price trend, volatility, departure timing, and capacity signals.",
            "properties": {
              "enabled": {
                "title": "Enable forecast",
                "description": "Generate informational buy, wait, or neutral recommendations.",
                "type": "boolean",
                "default": false
              },
              "minimumObservations": {
                "title": "Minimum observations",
                "description": "Minimum series length required for a directional forecast.",
                "type": "integer",
                "default": 7,
                "minimum": 3,
                "maximum": 60
              },
              "horizonDays": {
                "title": "Forecast horizon (days)",
                "description": "Number of future days covered by the trend estimate.",
                "type": "integer",
                "default": 7,
                "minimum": 1,
                "maximum": 30
              },
              "emitRows": {
                "title": "Emit forecast records",
                "description": "Write forecast records to the default dataset.",
                "type": "boolean",
                "default": true
              }
            },
            "default": {
              "enabled": false,
              "minimumObservations": 7,
              "horizonDays": 7,
              "emitRows": true
            },
            "additionalProperties": false
          },
          "reliability": {
            "title": "Reliability controls",
            "type": "object",
            "description": "Per-source circuit breaker settings for repeated failures.",
            "properties": {
              "circuitFailureThreshold": {
                "title": "Failures before opening circuit",
                "description": "Consecutive failures required to pause one source.",
                "type": "integer",
                "default": 3,
                "minimum": 1,
                "maximum": 20
              },
              "circuitCooldownSeconds": {
                "title": "Circuit cooldown (seconds)",
                "description": "Wait time before a paused source may be tried again.",
                "type": "integer",
                "default": 120,
                "minimum": 10,
                "maximum": 3600
              }
            },
            "default": {
              "circuitFailureThreshold": 3,
              "circuitCooldownSeconds": 120
            },
            "additionalProperties": false
          },
          "alerts": {
            "title": "Webhook alerts",
            "type": "object",
            "description": "Send idempotent, cooldown-controlled price, capacity, and source-recovery notifications.",
            "properties": {
              "enabled": {
                "title": "Enable alerts",
                "description": "Send selected events to the configured webhook targets.",
                "type": "boolean",
                "default": false
              },
              "webhookUrls": {
                "title": "Webhook URLs",
                "description": "Up to five HTTPS endpoints that receive signed JSON payloads.",
                "type": "array",
                "editor": "stringList",
                "default": [],
                "maxItems": 5,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "pattern": "^https://"
                }
              },
              "types": {
                "title": "Alert types",
                "description": "Events eligible for webhook delivery.",
                "type": "array",
                "editor": "select",
                "default": [
                  "price_drop",
                  "price_rise",
                  "availability_narrowing",
                  "source_recovery"
                ],
                "maxItems": 4,
                "uniqueItems": true,
                "items": {
                  "type": "string",
                  "enum": [
                    "price_drop",
                    "price_rise",
                    "availability_narrowing",
                    "source_recovery"
                  ],
                  "enumTitles": [
                    "Price drop",
                    "Price rise",
                    "Availability narrowing",
                    "Source recovery"
                  ]
                }
              },
              "priceChangePercent": {
                "title": "Price-change threshold (%)",
                "description": "Minimum absolute price movement required for an alert.",
                "type": "number",
                "default": 5,
                "minimum": 0.1,
                "maximum": 100
              },
              "capacityScore": {
                "title": "Capacity-score threshold",
                "description": "Minimum availability-narrowing score required for an alert.",
                "type": "number",
                "default": 50,
                "minimum": 1,
                "maximum": 100
              },
              "cooldownHours": {
                "title": "Alert cooldown (hours)",
                "description": "Suppress repeated alerts for the same subject and target.",
                "type": "integer",
                "default": 24,
                "minimum": 1,
                "maximum": 720
              },
              "maxAlertsPerRun": {
                "title": "Maximum alert candidates per run",
                "description": "Hard safety cap before multiplying candidates by webhook targets.",
                "type": "integer",
                "default": 20,
                "minimum": 1,
                "maximum": 100
              },
              "emitRows": {
                "title": "Emit alert delivery rows",
                "description": "Write redacted delivery outcomes to the default dataset.",
                "type": "boolean",
                "default": true
              }
            },
            "default": {
              "enabled": false,
              "webhookUrls": [],
              "types": [
                "price_drop",
                "price_rise",
                "availability_narrowing",
                "source_recovery"
              ],
              "priceChangePercent": 5,
              "capacityScore": 50,
              "cooldownHours": 24,
              "maxAlertsPerRun": 20,
              "emitRows": true
            },
            "additionalProperties": false
          },
          "alertSigningSecret": {
            "title": "Alert signing secret",
            "type": "string",
            "description": "Optional encrypted HMAC secret used to sign every webhook payload with SHA-256."
          },
          "destinationOverrides": {
            "title": "Advanced destination IDs",
            "type": "object",
            "description": "Optional source-specific IDs. Use only when automatic destination resolution is ambiguous.",
            "properties": {
              "tuiId": {
                "title": "TUI destination ID",
                "type": "integer",
                "description": "Numeric TUI GIATA city or region ID."
              },
              "tuiType": {
                "title": "TUI destination type",
                "type": "string",
                "description": "Whether the TUI ID represents a city or region.",
                "enum": [
                  "city",
                  "region"
                ]
              },
              "dertourId": {
                "title": "DERTOUR destination ID",
                "type": "string",
                "description": "DERTOUR geo ID returned by its destination service."
              },
              "wegId": {
                "title": "weg.de destination ID",
                "type": "string",
                "description": "weg.de city, region, or country ID returned by its destination service."
              },
              "wegType": {
                "title": "weg.de destination type",
                "type": "string",
                "description": "Whether the weg.de ID represents a city, region, or country.",
                "enum": [
                  "city",
                  "region",
                  "country"
                ]
              },
              "aiduId": {
                "title": "ab-in-den-urlaub.de destination ID",
                "type": "string",
                "description": "Destination ID returned by the ab-in-den-urlaub.de autocomplete service."
              },
              "aiduType": {
                "title": "ab-in-den-urlaub.de destination type",
                "type": "string",
                "description": "Whether the destination ID represents a city, region, or country.",
                "enum": [
                  "city",
                  "region",
                  "country"
                ]
              },
              "alltoursId": {
                "title": "alltours destination ID",
                "type": "string",
                "description": "Node ID returned by the alltours destination tree."
              },
              "alltoursType": {
                "title": "alltours destination type",
                "type": "string",
                "description": "Whether the alltours node represents a city, region, or country.",
                "enum": [
                  "city",
                  "region",
                  "country"
                ]
              }
            },
            "additionalProperties": false
          },
          "proxyConfiguration": {
            "title": "Proxy configuration",
            "type": "object",
            "description": "Optional Apify Proxy configuration for higher-volume runs.",
            "default": {
              "useApifyProxy": true,
              "apifyProxyGroups": [
                "RESIDENTIAL"
              ],
              "countryCode": "DE"
            }
          }
        }
      },
      "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
                  }
                }
              },
              "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
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}