Package Holiday Price Comparison - Pauschalreise, TUI, DERTOUR
Pricing
from $0.70 / 1,000 package offers
Package Holiday Price Comparison - Pauschalreise, TUI, DERTOUR
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.
Pricing
from $0.70 / 1,000 package offers
Rating
0.0
(0)
Developer
Kamer Ozkan
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
5 hours ago
Last modified
Categories
Share
Package Holiday Price Comparison - TUI, DERTOUR, weg.de
Unofficial, independent price-monitoring tool. Not affiliated with, endorsed by, or sponsored by TUI, DERTOUR, weg.de, ab-in-den-urlaub.de, alltours, or any other travel provider.
Compare package-holiday prices from five German travel sources in one normalized dataset. Enter a destination, travel window, occupancy, duration, and departure airports to receive hotel + flight offers, same-hotel comparisons, airport matrices, price histories, capacity signals, and transparent buy/wait forecasts.
Why use it?
- Find the cheapest source for the same GIATA hotel with
dachEntityId. - Compare Düsseldorf, Munich, Frankfurt, or other departure airports.
- Build a deduplicated 90-day price curve for each stable package.
- Detect narrowing market availability from repeated observations.
- Create explainable buy/wait signals from price trend, volatility, days to departure, and availability evidence.
- Send optional signed webhook alerts with cooldown and retry protection.
- Keep partial results when one source is temporarily unavailable.
The Actor is built for tour-operator pricing teams, OTAs, travel agencies, and travel-market analysts. It collects observations, not bookings. A provider may revalidate price or availability at checkout.
Quick start
Use this minimum input:
{"destination": "Antalya","startDate": "8 weeks","endDate": "10 weeks","nights": 7,"adults": 2,"childAges": [],"departureAirports": ["DUS", "MUC"],"operators": ["tui", "dertour", "weg", "aidu", "alltours"],"outputMode": "comparisons","maxResultsPerOperator": 20}
Dates accept either an absolute YYYY-MM-DD value or a rolling relative value
such as 8 weeks. The Store form is prefilled with a valid rolling window so a
new user can run the example without repairing stale calendar dates.
Results are written to the default dataset. OUTPUT in the default key-value
store contains run status, record counts, source health, quality indicators,
errors, feature summaries, cost telemetry, and billing operations.
Live sources and evidence
| Source | Transport | Hotel identity | Notable evidence |
|---|---|---|---|
| TUI Germany | Direct JSON | GIATA | Price, date, duration, room, board, discount |
| DERTOUR Germany | Direct JSON | GIATA | Flight legs, transfer, availability, flex marker |
| weg.de | Browser + intercepted JSON | GIATA | Flight, transfer, deal/flex markers, old price |
| ab-in-den-urlaub.de | Direct JSON | GIATA | Price, room/board, flex text; cashback is separate |
| alltours | Persisted GraphQL | GIATA | Flight, package operator, free cancellation, old price |
Missing flight, baggage, transfer, cancellation, tax, or fee data remains explicit. The Actor does not invent unavailable fields. Optional, bounded weg.de detail enrichment can fill evidence-backed baggage, transfer, and flexible-cancellation fields and uses a persistent positive/negative TTL cache.
Comparison modes
lowest_offer_in_search_windowcompares the cheapest hotel offer returned by every selected source.like_for_like_packageadditionally matches departure date, nights, occupancy, airport, normalized room class, and normalized board class.
Match-quality fields label exact, normalized, requested, mixed, and missing dimensions so downstream systems can decide what is comparable.
Dataset record types
offercomparisonairport_matrixprice_seriesmarket_signalbuy_wait_forecastalert_deliveryrun_diagnostic- emitted without a result charge when no primary rows can be written, so an empty search, partial source outage, and spending limit are immediately distinguishable.
Real records from live runs
The two records below are unedited engine output from live runs on 2026-07-28; only image lists and one very long source ID are shortened.
A real cross-operator comparison: the same GIATA-identified hotel, like-for-like
window, three portals, and a real 27 EUR spread. matchQuality declares per dimension
what was matched exactly and what was normalized, so a like-for-like claim is auditable
instead of asserted:
{"recordType": "comparison","dachEntityId": "giata:631077","comparisonKey": "cce446e2b76518acd0ef51ca","comparisonBasis": "lowest_offer_in_search_window","hotel": {"giataId": 631077,"operatorHotelId": "146711","name": "Ersoy Aga Otel","category": 2,"location": {"city": "Antalya","region": "Türkische Riviera","country": "Türkei","countryCode": "TR","latitude": 36.89492416381836,"longitude": 30.703243255615234},"recommendationPercent": 0,"reviewCount": 1,"images": "(10 hotel images, shortened here)"},"travel": {"searchWindowStart": "2026-09-22","searchWindowEnd": "2026-10-06"},"offers": [{"operator": "weg","operatorLabel": "weg.de","tourOperator": "TUI Deutschland XTUI","price": {"total": {"amount": 593,"currency": "EUR"},"perPerson": {"amount": 296.5,"currency": "EUR"},"originalTotal": null,"originalPerPerson": null,"savingPercent": null,"taxesIncluded": null,"mandatoryFees": [],"completeness": "unknown"},"room": "Doppelzimmer MIT GEMEINSCHAFTSBAD","board": "nur Übernachtung","departureDate": "2026-09-22","note": "full offer record embedded, shortened here"},{"operator": "aidu","operatorLabel": "ab-in-den-urlaub.de","tourOperator": null,"price": {"total": {"amount": 593,"currency": "EUR"},"perPerson": null,"originalTotal": {"amount": 874,"currency": "EUR"},"originalPerPerson": null,"savingPercent": 32.2,"taxesIncluded": null,"mandatoryFees": [],"completeness": "unknown"},"room": "Doppelzimmer MIT GEMEINSCHAFTSBAD","board": "Ohne Verpflegung","departureDate": "2026-09-22","note": "full offer record embedded, shortened here"},{"operator": "tui","operatorLabel": "TUI Germany","tourOperator": null,"price": {"total": {"amount": 620,"currency": "EUR"},"perPerson": {"amount": 310,"currency": "EUR"},"originalTotal": {"amount": 1028,"currency": "EUR"},"originalPerPerson": {"amount": 514,"currency": "EUR"},"savingPercent": 39.7,"taxesIncluded": null,"mandatoryFees": [],"completeness": "unknown"},"room": "Doppelzimmer MIT GEMEINSCHAFTSBAD","board": "Ohne Verpflegung","departureDate": "2026-09-22","note": "full offer record embedded, shortened here"}],"cheapestOperator": "weg","cheapestTotalPrice": 593,"currency": "EUR","priceSpread": 27,"matchQuality": {"score": 0.92,"likeForLike": true,"dimensions": {"hotel": "exact","departureDate": "exact","nights": "exact","occupancy": "exact","departureAirport": "requested","room": "normalized","board": "normalized"},"unavailableDimensions": [],"mixedDimensions": []},"observedAt": "2026-07-28T21:01:00.765Z"}
A full offer record, including both flight legs as sold. Price honesty is structural:
originalTotal, savingPercent, and taxesIncluded stay null when the portal does
not publish them, and price.completeness says so explicitly. Hotel reputation fields
are passed through as the source states them, even when they are unflattering (this
2-star property shows its single review and 0 percent recommendation as-is):
{"recordType": "offer","operator": "weg","operatorLabel": "weg.de","tourOperator": "TUI Deutschland","dachEntityId": "giata:631077","comparisonKey": "f163d8be2fe4ca58b775f695","offerKey": "b810135dc704cd25e66d3f91","operatorOfferId": "C1M5AUCQKBIFAUCQKBIFBDQV2CHBZEKMSWIVVXIX... (shortened here)","hotel": {"giataId": 631077,"operatorHotelId": "146711","name": "Ersoy Aga Otel","category": 2,"location": {"city": "Antalya","region": "Türkische Riviera","country": "Türkei","countryCode": "TR","latitude": 36.89492416381836,"longitude": 30.703243255615234},"recommendationPercent": 0,"reviewCount": 1,"images": "(10 hotel images, shortened here)"},"travel": {"searchWindowStart": "2026-09-22","searchWindowEnd": "2026-10-06","departureDate": "2026-09-22","returnDate": "2026-09-29","nights": 7},"occupancy": {"adults": 2,"childAges": [8]},"departureAirport": {"iata": "MUC","requested": ["MUC"],"source": "offer"},"room": {"name": "Familienzimmer KAPAZITÄT 3","type": "FZ","codes": ["FZ"]},"board": {"name": "nur Übernachtung","type": "Ü","codes": ["Ü"]},"flight": {"outbound": {"departureAirport": "MUC","arrivalAirport": "AYT","departureAt": "2026-09-22T18:50","arrivalAt": "2026-09-22T22:55","carrier": "SunExpress","carrierCode": "XQ","durationMinutes": 185,"direct": true},"inbound": {"departureAirport": "AYT","arrivalAirport": "MUC","departureAt": "2026-09-29T07:00","arrivalAt": "2026-09-29T09:25","carrier": "SunExpress","carrierCode": "XQ","durationMinutes": 205,"direct": true},"baggage": null},"transfer": {"included": true,"optionalPrice": null,"evidence": "source"},"availability": {"status": "unknown"},"cancellation": {"refundable": null,"description": "FLEXIBEL","deadline": null,"deadlineDaysBeforeDeparture": null,"feeBands": [],"flexProduct": "flexibleOfferData","evidence": "source"},"discounts": [{"type": "deal","label": "weg.de special deal","amount": null,"percent": null}],"price": {"total": {"amount": 919,"currency": "EUR"},"perPerson": {"amount": 306.33,"currency": "EUR"},"originalTotal": null,"originalPerPerson": null,"savingPercent": null,"taxesIncluded": null,"mandatoryFees": [],"completeness": "unknown"},"source": {"url": "https://www.weg.de/hotel/ersoy-aga-otel-cid_146711?from=2026-09-22&to=2026-10-06&rooms=25%2C25%2C8&duration=7&sort=price&departureAirport=MUC&city=930","observedAt": "2026-07-28T10:17:05.574Z","destination": {"id": "930","name": "Antalya","type": "city","parentName": "Türkische Riviera"}},"matching": {"departureDate": "exact","nights": "exact","occupancy": "exact","departureAirport": "exact","room": "normalized","board": "normalized","roomClass": "family","boardClass": "room_only"}}
The full input is in examples/INPUT.json, a recurring watch is in
examples/SCHEDULED_WATCH.json, and a normalized output sample is in
examples/OUTPUT_OFFER.json.
Reliability and limits
- Each source has typed errors, bounded retries, health summaries, and circuit breaking.
- Airport matrix fan-out has explicit airport, concurrency, and request limits.
- Explicit source-airport fallbacks are discarded when they do not match any requested IATA code, and the mismatch is reported in run diagnostics.
- Price history is sharded, deduplicated, retained for 90 days by default, and stable across transient offer or flight identifiers.
- Capacity scoring requires repeated observations and is suppressed when source coverage drops. It estimates market availability, not hotel occupancy.
- Forecasts are informational signals, not price or booking guarantees.
- HTTPS webhooks support HMAC signatures, idempotency keys, cooldowns, bounded retries, redirect blocking, and target-URL redaction.
alertSigningSecretis a top-level encrypted input and is mapped into the webhook runtime configuration without being emitted.- Pay-per-event guardrails stop work and output before the caller's maximum charge is exceeded.
The Store input defaults to one stable German residential Apify Proxy session because several sources bind browser cookies, CSRF tokens, or availability to one network identity. Browser-backed fallbacks activate only when a direct source response is blocked or empty. Source APIs and persisted-query hashes can change; source-specific schema drift is reported without discarding successful sources.
Pricing
This Actor uses pay per event. The primary event is one normalized package offer. Separate named events transparently account for successful source searches and optional comparisons, history, matrices, signals, forecasts, enrichment, and alert delivery. Failed source searches, failed webhooks, cooldown-suppressed alerts, and duplicate history observations are not charged as successful events.
The Store headline shows the primary package-offer price; a five-source run can
also charge up to five successful-source-search events. Review the full Pricing
tab, set a maximum cost per run, and inspect OUTPUT.billing before increasing
result or airport-matrix limits. Platform usage is currently included in the
Store price, as shown on the public Pricing tab.
This Actor is also exposed to AI agents through Apify's MCP server (mcp.apify.com): an agent can discover it by search and run it with the same pay-per-event billing, with no separate integration.
Privacy and lawful use
The Actor does not require traveller names, email addresses, payment details, or booking personal data. Child ages are optional search parameters. Webhook URLs and signing secrets remain within the caller's input and storage.
Users are responsible for lawful, proportionate use and compliance with applicable website terms, robots policies, database rights, privacy law, and contractual restrictions. Do not use the Actor to bypass access controls or overload source systems.
Support and versioning
For reproducible schema drift or source failures, include the run ID, redacted input, affected source, and first error code. Target initial response is within two business days. Upstream website changes are supported on a best-effort basis unless a separate SLA exists.
Breaking output changes use a major version; additive fields use a minor
version; source fixes use a patch version. See CHANGELOG.md for release
history.
Local development
Node.js 22.19 or newer is required.
npm installnpm run release:preflightnpm run release:live
For a local Apify run, place input at
storage/key_value_stores/default/INPUT.json, then run:
$CRAWLEE_STORAGE_DIR="$PWD/storage" npm start