./wiki

the manual

Public knowledge base. Built for users. The technical version (architecture, scaling, alt APIs) lives in the GitHub /docs folder.

01 // how it works

You give us a slack window. We translate that into search URLs across multiple flight aggregators, scrape them in parallel, normalize the results into a single schema, and rank by deal score.

the pipeline

  1. You submit a search — origin (IATA), optional destination, date window (this week / 60d / etc).
  2. We check the cache. Identical searches within 6h return instantly from our database.
  3. We scrape Google Flights first using Firecrawl with a structured JSON extraction schema.
  4. If Google blocks or returns empty, we fall back to Skyscanner — same schema, different URL.
  5. If both fail and you set a destination, we hit Duffel's test-mode API for real airline inventory at sandbox prices (clearly tagged so you don't book by mistake).
  6. Results are normalized into a single shape (origin → dest, date, price in cents, airline, stops, source) and a relative deal score is computed against the result set.
  7. We cache the search for 6h and render the deal grid.

deal score

Within any result set we normalize price linearly: the cheapest deal scores 1.0, the most expensive scores 0.0. This is intentionally simple — we want relative ranking inside a search, not a global "good deal" oracle.

what we don't do (yet)

  • Book the flight for you — we always link out to the airline / OTA.
  • Track your card. We never see payment data.
  • Multi-stop loop optimization (in v1.1).
  • AI dossiers on every deal (Phase 3 — coming).
▎ noteLive scrapes take 10–25 seconds. If you see "cache hit" you got an instant return; if "live scrape" you waited the full pipeline.