Appearance
Verticals
The platform is organized around verticals. Each vertical is a self-contained slice of the framework: its own crawlers, its own SQLite tables, its own MCP tools.
Vertical 1: DMCs (Spike Complete)
What: Destination Management Companies — the on-the-ground operators who arrange luxury travel experiences.
Sources (spike):
- Inside.travel (~192 DMCs)
- Traveller Made (~39 DMCs)
- DMC.travel (parsing issues, needs work)
Crawl results (spike):
- 231 DMCs indexed
- 95% email coverage
- 80% phone coverage
- 150+ destinations, 13 service categories, 52 specialties
MCP tools (spike):
search_dmc— full-text + filtered searchget_dmc_details— full record by IDlist_destinations— all indexed destinationsfind_dmc_by_destination— DMCs in a destinationcatalog_stats— database statistics
What's left (post-spike):
- DMC Finder crawler (10,000+ DMCs, 120+ countries)
- Traveller Made enrichment
- Virtuoso advisor network (20,000+ luxury advisors)
- Cross-source deduplication
- Email validation (MX record check)
- Phone normalization (E.164)
- Confidence scoring
- JS-rendered contact pages
- PDF brochure parsing
- Cookie consent handling
- Department-specific email extraction
- Docker containerization
- Incremental crawl
- Rate limit per source
- Error alerting
DMC LOE: ~50–70 hours
Vertical 2: Dining (Planned)
What: Restaurants and dining experiences in luxury destinations.
Sources: Resy, OpenTable, Yelp, Tock.
Why: Core need for any luxury trip — high-end dining is part of the experience. Complements DMC data (a DMC might recommend a restaurant; we want to know it independently).
LOE: ~40–56 hours
Vertical 3: Experiences (Planned)
What: Bookable experiences and activities (tours, private guides, excursions, classes).
Sources: Viator, GetYourGuide, Klook.
Why: Experiences are a major spend category and a key differentiator for luxury. Partner APIs available — likely the cleanest data acquisition path.
LOE: ~68–98 hours
Vertical 4: Transportation (Planned)
What: Ground transportation — black car services, private drivers, car rentals, helicopter transfers.
Sources: Uber, Lyft, Blacklane, car rental APIs.
Why: Luxury travel often requires premium transport. OAuth required for some sources. Highest complexity of any vertical.
LOE: ~76–100 hours
Vertical 5: Hotels (Planned)
What: Luxury hotel inventory and property data.
Sources: Booking.com, Expedia, Virtuoso.
Why: Hotels are table stakes for travel. Well-documented APIs. Virtuoso integration gives us luxury-specific inventory.
LOE: ~40–60 hours
Vertical 6: Flights (Planned)
What: Flight options, schedules, and pricing.
Sources: Amadeus, Skyscanner, Google Flights.
Why: Flight data is a foundational input. GDS-dependent — partner relationships required. Less critical for our concierge use case (we focus on-ground, not in-air).
LOE: ~30–50 hours
Vertical 7: Spa & Wellness (Planned)
What: Spa and wellness facilities and services.
Sources: Mindbody, SpaFinder.
Why: Growing luxury segment. Lower data complexity. Easy vertical to add.
LOE: ~16–24 hours
Vertical 8: Event Tickets (Planned)
What: Concerts, theater, sporting events, special events.
Sources: Ticketmaster, Eventbrite.
Why: Last-mile enrichment for trips. Good API availability.
LOE: ~16–24 hours
Platform Core (Planned)
Shared infrastructure that supports all verticals:
- Unified data models across verticals
- Cross-vertical search (find DMC + hotel + restaurant in one destination)
- Booking engine (reservation creation, not just search)
- Payment processing (Stripe)
- User authentication (JWT)
- Notification system (email/SMS/webhooks)
- Caching layer (Redis)
- Docker + CI/CD + monitoring
LOE: ~40–60 hours
Total
| Component | Hours |
|---|---|
| DMCs (spike complete, post-spike work) | 50–70 |
| Dining | 40–56 |
| Experiences | 68–98 |
| Transportation | 76–100 |
| Hotels | 40–60 |
| Flights | 30–50 |
| Spa & Wellness | 16–24 |
| Event Tickets | 16–24 |
| Platform Core | 40–60 |
| Total | 376–542 (~460 hrs, ~13 weeks) |
Adding a New Vertical
The pattern is consistent:
- Create
crawlers/<vertical>/with one crawler per source - Add tables to
storage/sqlite_store.py(one set per vertical) - Add Pydantic models in
models.py - Add tools to
mcp_server/server.py - Add the vertical to
config/sources.yaml - Add a CLI subcommand in
crawler.py
The shared components (BaseCrawler, extractors/contact.py, extractors/website.py, JSONStore) are reused as-is.