diff --git a/MARKET_CONCEPT.md b/MARKET_CONCEPT.md index 01fd25e..4d05d0d 100644 --- a/MARKET_CONCEPT.md +++ b/MARKET_CONCEPT.md @@ -6,504 +6,342 @@ ## ๐ Executive Summary -Die **Market Page** ist das Herzstรผck von Pounce. Hier flieรen alle Datenquellen zusammen und werden dem User als **"Clean Feed"** prรคsentiert. +Die **Market Page** ist das Herzstรผck von Pounce. Hier flieรen alle Datenquellen zusammen: -### Vision (aus pounce_terminal.md) -> *"Die Market Page zeigt alle Domains die entweder:* -> 1. *Zu Verkauf stehen (Auktionen)* -> 2. *Bald frei werden (Drops)* -> 3. *รber Pounce direkt angeboten werden (Pounce Direct)"* +1. **Pounce Direct** โ User-Listings (unser USP, 0% Provision) +2. **Live Auktionen** โ Externe Plattformen (GoDaddy, Sedo, etc.) +3. **Drops Tomorrow** โ Domains bevor sie in Auktionen landen (Phase 3) -### Aktueller Stand: Phase 1 โ Intelligence +### Der Weg zum Unicorn (aus pounce_strategy.md) + +> *"Der Weg zum Unicorn fรผhrt nicht รผber besseres Scraping, sondern รผber einzigartigen Content."* + +**Aggregation kann jeder. Pounce Direct ist unser USP.** + +--- + +## ๐ง KRITISCHE FIXES (Implementiert am 11.12.2025) + +### Problem: Veraltete Daten wurden angezeigt + +``` +VORHER: Abgelaufene Auktionen wurden im Feed angezeigt + โ Schlechte User Experience + โ Vertrauensverlust +``` + +### Lรถsung: Multi-Layer Data Freshness + +```python +# 1. API-Filter: Nur laufende Auktionen +query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > datetime.utcnow() # โ NEU! + ) +) + +# 2. Scheduler: Cleanup alle 15 Minuten +scheduler.add_job( + cleanup_expired_auctions, + CronTrigger(minute='*/15'), # Alle 15 Minuten + id="auction_cleanup" +) + +# 3. Scraper: Alle 2 Stunden frische Daten +scheduler.add_job( + scrape_auctions, + CronTrigger(hour='*/2', minute=30), # Alle 2 Stunden + id="auction_scrape" +) +``` + +--- + +## ๐ Die 3 Sรคulen des Market + +### Sรคule 1: POUNCE DIRECT (Unser USP!) + +> *"Das sind die Domains, die es NUR bei Pounce gibt."* ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ -โ POUNCE MARKET โ Aktueller Datenfluss โ +โ ๐ POUNCE DIRECT โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ โ -โ DATENQUELLEN: โ +โ Warum es genial ist: โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โ Unique Content (nur bei uns!) โ +โ โ 0% Provision (vs. 15-20% bei Sedo) โ +โ โ DNS-Verifizierung = Trust โ +โ โ Instant Buy (kein Bieten) โ +โ โ SEO: Jedes Listing = eigene Landing Page โ โ โ -โ ๐ฆ WEB SCRAPING (Hauptquelle) โ -โ โโโ ExpiredDomains.net (325 Auktionen) โ โ -โ โโโ GoDaddy RSS Feed (10 Auktionen) โ โ -โ โโโ Sedo Public (7 Auktionen) โ โ -โ โโโ NameJet Public (6 Auktionen) โ โ -โ โโโ DropCatch Public (7 Auktionen) โ โ -โ โ -โ ๐ OFFIZIELLE APIs (Konfiguriert) โ -โ โโโ DropCatch Partner API โ ๏ธ (Nur eigene Aktivitรคten) โ -โ โโโ Sedo Partner API โณ (Credentials fehlen) โ -โ โ -โ ๐ POUNCE DIRECT (User-Listings) โ -โ โโโ DNS-verifizierte Verkaufsangebote โ (0 Listings) โ -โ โ -โ ๐ฎ ZONE FILES (Phase 3 โ Zukunft) โ -โ โโโ Verisign .com/.net ๐ โ -โ โโโ PIR .org ๐ โ -โ โ +โ Der Flow: โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ -โ TOTAL: 355 Domains im Feed | 0 Pounce Direct โ +โ 1. User listet Domain (Trader/Tycoon Abo) โ +โ 2. DNS-Verifizierung (TXT Record) โ +โ 3. Listing erscheint im Market Feed โ +โ 4. Kรคufer kontaktiert Verkรคufer (nach Login) โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` ---- - -## ๐ TEIL 1: Bestandsaufnahme โ Was haben wir? - -### A. Backend-Komponenten โ - -| Komponente | Status | Beschreibung | -|------------|--------|--------------| -| **Unified Feed API** `/auctions/feed` | โ Live | Kombiniert Pounce Direct + External | -| **Pounce Score v2.0** | โ Live | Length, TLD, Bids, Time Pressure | -| **Vanity Filter** | โ Live | Premium-Domains fรผr Public Users | -| **Auction Scraper** | โ Lรคuft | 5 Plattformen, Scheduler aktiv | -| **Listings API** | โ Fertig | DNS-Verifizierung, Inquiry-System | -| **Sniper Alerts** | โ Fertig | Keyword-Matching, Notifications | - -### B. Frontend-Komponenten โ - -| Seite | Status | Beschreibung | -|-------|--------|--------------| -| `/terminal/market` | โ Live | Vollstรคndiger Market Feed fรผr Auth Users | -| `/auctions` | โ Live | Public Market mit Vanity Filter | -| `/buy` | โ Live | Pounce Direct Marketplace Browse | -| `/buy/[slug]` | โ Live | Listing-Detailseite | -| `/terminal/listing` | โ Live | Seller Dashboard | - -### C. Datenquellen โ Realitรคtscheck - -#### Offizielle APIs โ Die Ernรผchterung - -**DropCatch API:** -``` -Status: โ Authentifiziert -Problem: Zeigt nur EIGENE Aktivitรคten (Bids, Backorders) - NICHT das รถffentliche Auktionsinventar -Nutzen: User-Integration (verbinde dein DropCatch-Konto) -``` - -**Sedo API:** -``` -Status: โณ Client bereit, Credentials fehlen -Wo finden: Sedo.com โ Mein Sedo โ API-Zugang -Benรถtigt: Partner ID + SignKey -``` - -#### Web Scraping โ Unsere Hauptquelle - -```python -# Aktuelle Scraper-Architektur -TIER_1_APIS = [ - ("DropCatch", _fetch_dropcatch_api), # Fรผr eigene Aktivitรคten - ("Sedo", _fetch_sedo_api), # Wenn konfiguriert -] - -TIER_2_SCRAPING = [ - ("ExpiredDomains", _scrape_expireddomains), # 325 Domains - ("GoDaddy", _scrape_godaddy_rss), # 10 Domains - ("Sedo", _scrape_sedo_public), # 7 Domains (Fallback) - ("NameJet", _scrape_namejet_public), # 6 Domains - ("DropCatch", _scrape_dropcatch_public), # 7 Domains (Fallback) -] -``` +**Status:** โณ 0 Listings โ Muss aktiviert werden! --- -## ๐ฏ TEIL 2: Das Konzept โ Die 3 Sรคulen des Market - -### Sรคule 1: AUKTIONEN (Externe Plattformen) +### Sรคule 2: LIVE AUKTIONEN (Content Filler) > *"Zeige alle relevanten Auktionen von GoDaddy, Sedo, NameJet, etc."* -**Datenquellen:** -- Web Scraping (primรคr) -- Partner APIs (wenn verfรผgbar) - -**Filter-Strategie:** -```python -# Vanity Filter fรผr Public Users (aus pounce_features.md) -def is_premium_domain(domain: str) -> bool: - name, tld = domain.rsplit('.', 1) - - # Premium TLDs only - if tld not in ['com', 'io', 'ai', 'co', 'ch', 'de', 'net', 'org', 'app', 'dev']: - return False - - # Keine Spam-Muster - if len(name) > 12: return False - if '-' in name: return False - if sum(c.isdigit() for c in name) > 1: return False - - return True -``` - -**UI-Darstellung:** -| Domain | Source | Price | Status | Action | -|--------|--------|-------|--------|--------| -| **crypto-bank.io** | ๐ข GoDaddy | $2,500 | โฑ๏ธ 2h left | [Bid โ] | -| **meta-shop.com** | ๐ข Sedo | $5,000 | ๐ค Offer | [View โ] | - ---- - -### Sรคule 2: POUNCE DIRECT (User-Listings) - -> *"Das sind die Domains, die es NUR bei Pounce gibt. Unser USP."* - -**Das Konzept (aus pounce_terminal.md):** ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ -โ POUNCE DIRECT โ Der Listing-Wizard โ +โ ๐ข LIVE AUKTIONEN โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ โ -โ STEP 1: DOMAIN EINGEBEN โ -โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ -โ Domain: [zurich-immo.ch___________] โ -โ Preis: [$950_______] โ Fixpreis โ Verhandlungsbasis โ +โ Datenquellen: โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ ๐ฆ Web Scraping (Hauptquelle) โ +โ โโโ ExpiredDomains.net (~350 Domains) โ +โ โโโ GoDaddy RSS โ +โ โโโ Sedo Public โ +โ โโโ NameJet Public โ +โ โโโ DropCatch Public โ โ โ -โ STEP 2: DNS VERIFICATION (Trust-Check) โ -โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ -โ Fรผge diesen TXT-Record bei deinem Registrar hinzu: โ +โ Data Freshness: โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โฑ๏ธ Scraping: Alle 2 Stunden โ +โ ๐งน Cleanup: Alle 15 Minuten โ +โ โ Filter: Nur end_time > now() โ โ โ -โ Name: _pounce-verify โ -โ Value: pounce-verify-8a3f7b9c2e1d โ -โ โ -โ [๐ VERIFY DNS] โ -โ โ -โ STEP 3: LIVE! โ -โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ -โ โ Domain verifiziert! โ -โ Dein Listing erscheint jetzt im Market Feed. โ +โ Qualitรคtsfilter: โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โข Vanity Filter fรผr Public (nur Premium-Domains) โ +โ โข Pounce Score (0-100) โ +โ โข TLD Filter (com, io, ai, etc.) โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` -**Warum das genial ist:** - -| Vorteil | Erklรคrung | -|---------|-----------| -| **Unique Content** | Domains, die es NUR bei Pounce gibt | -| **Hรถhere Conversion** | "Instant Buy" statt "Bid on external site" | -| **Vendor Lock-in** | Verkรคufer listen bei uns (0% Provision!) | -| **SEO Power** | Jede Listing = eigene Landing Page | -| **Trust Signal** | DNS-Verifizierung = Qualitรคtsgarantie | - -**UI-Darstellung:** -| Domain | Source | Price | Status | Action | -|--------|--------|-------|--------|--------| -| **zurich-immo.ch** | ๐ **Pounce** | **$950** | โก **Instant** | **[Buy Now]** | +**Status:** โ ~361 aktive Auktionen --- -### Sรคule 3: DROPS (Domains die bald frei werden) +### Sรคule 3: DROPS TOMORROW (Tycoon Exclusive) > *"Zeige Domains BEVOR sie in Auktionen landen."* -**Phase 1 (Jetzt): Deleted Domains via Scraping** -``` -ExpiredDomains.net โ Deleted Domains Liste โ Pounce Filter โ Feed -``` - -**Phase 3 (Zukunft): Zone File Analysis** ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ -โ ZONE FILE PIPELINE โ Die Unicorn-Strategie โ +โ ๐ฎ DROPS TOMORROW โ Phase 3 โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ โ -โ 1. DAILY DOWNLOAD (4:00 UTC) โ -โ โโโ Zone Files von Verisign, PIR, etc. โ +โ Das Konzept: โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ 1. Zone Files von Verisign (.com/.net) beziehen โ +โ 2. Tรคgliche Diff-Analyse (was war gestern da, ist heute weg) โ +โ 3. Diese Domains droppen in 1-5 Tagen! โ +โ 4. Pounce Algorithm filtert nur Premium-Domains โ โ โ -โ 2. DIFF ANALYSIS โ -โ โโโ Was war gestern da, ist heute weg? โ -โ โโโ Diese Domains DROPPEN in 1-5 Tagen! โ -โ โ -โ 3. POUNCE ALGORITHM โ -โ โโโ Nur Premium-Domains durchlassen (Score > 70) โ -โ โ -โ 4. OUTPUT: "Drops Tomorrow" (Tycoon Exclusive) โ -โ โโโ Domains BEVOR sie in Auktionen erscheinen โ +โ Warum das ein MONOPOL schafft: โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โข ExpiredDomains zeigt ALLES (Spam-Hรถlle) โ +โ โข Pounce zeigt nur die TOP 100 (kuratiert) โ +โ โข = Zeitersparnis = Premium Feature = $29/Monat โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` ---- - -## ๐ง TEIL 3: Technische Architektur - -### Der Unified Feed API Endpoint - -```python -# backend/app/api/auctions.py - -@router.get("/feed") -async def get_market_feed( - source: str = Query("all", enum=["all", "pounce", "external"]), - keyword: Optional[str] = None, - tld: Optional[str] = None, - min_price: Optional[float] = None, - max_price: Optional[float] = None, - min_score: int = Query(0, ge=0, le=100), - ending_within: Optional[int] = None, # Stunden - verified_only: bool = False, - sort_by: str = Query("score", enum=["score", "price_asc", "price_desc", "time", "newest"]), - limit: int = Query(50, le=200), - offset: int = Query(0), - current_user: Optional[User] = Depends(get_current_user_optional), -): - """ - ๐ UNIFIED MARKET FEED โ Das Herz von Pounce - - Kombiniert: - - ๐ Pounce Direct: DNS-verifizierte User-Listings (Instant Buy) - - ๐ข External Auctions: Scraped von GoDaddy, Sedo, etc. - - ๐ฎ Drops: Domains die bald frei werden (Phase 3) - - Fรผr nicht-authentifizierte User: - - Vanity Filter aktiv (nur Premium-Domains) - - Pounce Score sichtbar, aber limited Details - - Fรผr authentifizierte User (Trader/Tycoon): - - Vollzugriff auf alle Domains - - Advanced Filtering - - Valuation Data - """ -``` - -### Pounce Score v2.0 - -```python -def calculate_pounce_score_v2(domain: str, auction_data: dict) -> int: - """ - Der Pounce Score โ Qualitรคts- und Opportunity-Bewertung - - A) INTRINSIC VALUE (Domain selbst) - - Lรคnge (kurz = wertvoll) - - TLD Premium (com > io > xyz) - - Dictionary Word Bonus - - B) MARKET SIGNALS (Aktivitรคt) - - Bid Activity (mehr Bids = mehr Interesse) - - Time Pressure (endet bald = Opportunity) - - Price-to-Value Ratio (unterbewertet = ๐ฅ) - - C) PENALTIES - - Bindestriche (-30) - - Zahlen wenn >3 Zeichen (-20) - - Zu lang >15 Zeichen (-25) - """ - score = 50 # Baseline - name = domain.rsplit('.', 1)[0] - tld = domain.rsplit('.', 1)[1] - - # Lรคnge - if len(name) <= 3: score += 30 - elif len(name) == 4: score += 25 - elif len(name) == 5: score += 20 - elif len(name) <= 7: score += 10 - - # TLD - tld_scores = {'com': 20, 'ai': 25, 'io': 18, 'co': 12, 'ch': 15} - score += tld_scores.get(tld, 0) - - # Market Signals - bids = auction_data.get('num_bids', 0) - if bids >= 20: score += 15 - elif bids >= 10: score += 10 - elif bids >= 5: score += 5 - - # Penalties - if '-' in name: score -= 30 - if any(c.isdigit() for c in name) and len(name) > 3: score -= 20 - - return max(0, min(100, score)) -``` +**Status:** ๐ Geplant (6-12 Monate) --- -## ๐ TEIL 4: Roadmap - -### โ ERLEDIGT (Stand: 11. Dezember 2025) - -- [x] Unified Feed API `/auctions/feed` -- [x] Pounce Score v2.0 mit Market Signals -- [x] Vanity Filter fรผr Public Users -- [x] Pounce Direct Listing-System (DNS-Verifizierung) -- [x] Sniper Alerts mit Keyword-Matching -- [x] Web Scraping fรผr 5 Plattformen -- [x] DropCatch API Client (fรผr User-Integration) -- [x] Sedo API Client (bereit fรผr Credentials) - -### ๐ฏ NรCHSTE SCHRITTE (Diese Woche) - -1. **Sedo API Credentials eingeben** - - Sedo.com โ Mein Sedo โ API-Zugang - - Partner ID + SignKey in `.env` - -2. **Erste Pounce Direct Listings erstellen** - - Test-Domains zum Verifizieren des Flows - - Zeigt "Unique Content" im Feed - -3. **Scraper-Stabilitรคt verbessern** - - Fallback-Logik testen - - Error-Handling optimieren - -### ๐ฎ PHASE 3 (6-12 Monate) - -1. **Zone File Access beantragen** - - Verisign (.com/.net) - - PIR (.org) - - Kosten: $0-$10,000/Jahr - -2. **"Drops Tomorrow" Feature** - - Zone File Diff-Analyse - - Tycoon Exclusive ($29/mo) - -3. **Pounce Instant Exchange** - - Integrierter Escrow-Service - - 5% Gebรผhr (statt 15-20% bei Konkurrenz) - ---- - -## ๐จ TEIL 5: UI/UX Design - -### Die Master-Tabelle (aus pounce_terminal.md) - -| Spalte | Inhalt | Visualisierung | -|--------|--------|----------------| -| **Domain** | Name der Domain | Fettgedruckt. Bei "Pounce Direct" โ ๐ Icon | -| **Pounce Score** | Qualitรคts-Algorithmus | 0-100 (Grรผn > 80, Gelb 50-80, Rot < 50) | -| **Price / Bid** | Preis oder aktuelles Gebot | `$500` oder `$50 (Bid)` | -| **Status / Time** | Countdown oder Verfรผgbarkeit | โฑ๏ธ `4h left` oder โก `Instant` | -| **Source** | Herkunft | ๐ข GoDaddy, ๐ Pounce | -| **Action** | Der Button | `[Bid โ]` oder `[Buy Now]` | +## ๐จ UI/UX: Die Market Page ### Filter Bar ``` -[Toggle] Hide Spam (Standard: AN) -[Toggle] Pounce Direct Only -[Dropdown] TLD: .com, .ai, .io, .ch -[Dropdown] Price: < $100, < $1k, High Roller -[Dropdown] Ending: 1h, 4h, 24h, 7d +[โ] Hide Spam [โ] Pounce Only [TLD โพ] [Price โพ] [Ending โพ] ``` +### Die Master-Tabelle + +| Spalte | Inhalt | Visualisierung | +|--------|--------|----------------| +| **Domain** | Name | Fettgedruckt. ๐ Icon fรผr Pounce Direct | +| **Score** | Pounce Score | 0-100 (Grรผn > 80, Gelb 50-80, Rot < 50) | +| **Price** | Preis/Gebot | `$500` oder `$50 (Bid)` | +| **Status** | Zeit/Verfรผgbarkeit | โฑ๏ธ `4h left` oder โก `Instant` | +| **Source** | Herkunft | ๐ข GoDaddy, ๐ Pounce | +| **Action** | Button | `[Bid โ]` oder `[Buy Now]` | + ### Visuelle Hierarchie -```tsx -// Pounce Direct Items werden prominent angezeigt -{pounceDirectItems.length > 0 && ( - - - - Pounce Exclusive โ Verified Instant Buy - - {pounceDirectItems.map(item => )} - -)} - -// External Auctions darunter - - Active Auctions - {externalItems.map(item => )} - -``` - ---- - -## ๐ฐ TEIL 6: Monetarisierung - -### Tier-basierte Features (aus pounce_pricing.md) - -| Feature | Scout ($0) | Trader ($9) | Tycoon ($29) | -|---------|------------|-------------|--------------| -| **Market Feed** | ๐ช๏ธ Raw (Vanity Filter) | โจ Curated (Clean) | โจ Curated + Priority | -| **Alert Speed** | ๐ข Daily | ๐ Hourly | โก Real-Time (10m) | -| **Watchlist** | 5 Domains | 50 Domains | 500 Domains | -| **Sell Domains** | โ | โ 5 Listings | โ 50 Listings + Featured | -| **Pounce Score** | โ Locked | โ Basic | โ + SEO Data | -| **Drops Tomorrow** | โ | โ | โ Exclusive | - -### Die "Conversion-Falle" (aus pounce_features.md) - -Wenn ein nicht-eingeloggter User auf "Buy Now" bei einem Pounce Direct Listing klickt: - ``` โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ -โ ๐ Secure Transaction โ +โ MARKET FEED โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค โ โ -โ Du bist dabei, ein verifiziertes Direct-Listing anzusehen. โ +โ ๐ POUNCE EXCLUSIVE โ Verified Instant Buy โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โ zurich-immo.ch $950 โก Instant โ Verified [Buy] โ โ +โ โ crypto-hub.io $2.5k โก Instant โ Verified [Buy] โ โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ โ -โ Um den Verkรคufer zu kontaktieren und Kรคuferschutz zu โ -โ genieรen, logge dich bitte ein. โ +โ ๐ข LIVE AUCTIONS โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โ techflow.io $250 โฑ๏ธ 4h left GoDaddy [Bid โ] โ โ +โ โ datalab.com $1.2k โฑ๏ธ 23h left Sedo [Bid โ] โ โ +โ โ nexus.ai $5k โฑ๏ธ 2d left NameJet [Bid โ] โ โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ โ -โ [Login] [Create Free Scout Account] โ +โ ๐ฎ DROPS TOMORROW (Tycoon Only) โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ +โ โ ๐ Upgrade to Tycoon to see domains dropping tomorrow โ โ +โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ โ โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ ``` --- -## ๐ TEIL 7: Kritische Erkenntnisse +## ๐ฐ Monetarisierung (aus pounce_pricing.md) -### API-Realitรคt vs. Erwartung - -| API | Erwartung | Realitรคt | -|-----|-----------|----------| -| **DropCatch** | Alle รถffentlichen Auktionen | โ Nur eigene Bids/Backorders | -| **Sedo** | TBD | โณ Credentials fehlen noch | - -**Konsequenz:** -- Web Scraping bleibt unsere **Hauptquelle** fรผr รถffentliche Daten -- APIs sind nรผtzlich fรผr **User-Integration** (verbinde dein DropCatch-Konto) -- **Zone Files** sind der langfristige Weg zur Datenhoheit - -### Der echte USP: Pounce Direct - -> *"Domains die es NUR bei Pounce gibt."* - -Das ist der Schlรผssel. Nicht die Aggregation (das kann jeder), sondern der **Unique Content** durch User-Listings. - -**Prioritรคt:** Erste Pounce Direct Listings aktivieren! +| Feature | Scout ($0) | Trader ($9) | Tycoon ($29) | +|---------|------------|-------------|--------------| +| **Market Feed** | ๐ช๏ธ Vanity Filter | โจ Clean | โจ Clean + Priority | +| **Alert Speed** | ๐ข Daily | ๐ Hourly | โก Real-Time (10m) | +| **Watchlist** | 5 Domains | 50 Domains | 500 Domains | +| **Sell Domains** | โ | โ 5 Listings | โ 50 + Featured | +| **Pounce Score** | โ Locked | โ Basic | โ + SEO Data | +| **Drops Tomorrow** | โ | โ | โ Exclusive | --- -## ๐ Checkliste fรผr den Launch +## โ๏ธ Technische Architektur -### Backend -- [x] Unified Feed API +### Scheduler Jobs + +```python +# Aktive Jobs (Scheduler) +# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ + +# 1. Auction Scrape โ Alle 2 Stunden +scheduler.add_job(scrape_auctions, CronTrigger(hour='*/2', minute=30)) + +# 2. Expired Cleanup โ Alle 15 Minuten (KRITISCH!) +scheduler.add_job(cleanup_expired_auctions, CronTrigger(minute='*/15')) + +# 3. Sniper Matching โ Alle 30 Minuten +scheduler.add_job(match_sniper_alerts, CronTrigger(minute='*/30')) + +# 4. TLD Prices โ Tรคglich 03:00 UTC +scheduler.add_job(scrape_tld_prices, CronTrigger(hour=3)) +``` + +### API Endpoints + +```python +# Market Feed Endpoints +# โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ + +GET /api/v1/auctions/feed # Unified Feed (Pounce + External) +GET /api/v1/auctions # External Auctions only +GET /api/v1/auctions/ending-soon +GET /api/v1/auctions/hot +GET /api/v1/listings # Pounce Direct Listings +``` + +### Data Freshness Garantie + +```python +# Jede Query filtert automatisch auf aktive Auktionen: +query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > datetime.utcnow() # โ IMMER! + ) +) +``` + +--- + +## ๐ Roadmap + +### โ ERLEDIGT (11. Dezember 2025) + +- [x] Unified Feed API `/auctions/feed` - [x] Pounce Score v2.0 - [x] Vanity Filter -- [x] Scraper aktiv -- [ ] Sedo API Credentials eingeben -- [ ] Scheduler-Intervall optimieren +- [x] Web Scraping (5 Plattformen) +- [x] **FIX: end_time Filter** (nur laufende Auktionen) +- [x] **FIX: Cleanup alle 15 Minuten** +- [x] **FIX: Scraper alle 2 Stunden** +- [x] Sniper Alerts -### Frontend -- [x] Terminal Market Page -- [x] Public Auctions Page -- [x] Pounce Direct Highlighting -- [x] Filter (Source, TLD, Price) -- [ ] "Hot Right Now" Section -- [ ] Better Empty States +### ๐ฏ NรCHSTE SCHRITTE (Diese Woche) -### Content -- [ ] Erste 5 Test-Listings erstellen -- [ ] DNS-Verifizierung testen -- [ ] Listing-to-Feed Flow validieren +1. **Erste Pounce Direct Listings erstellen** + - Test-Domains zum Verifizieren des Flows + - USP aktivieren! + +2. **Sedo API Credentials eingeben** + - Sedo.com โ Mein Sedo โ API-Zugang + - Partner ID + SignKey in `.env` + +3. **Frontend: "Live" Indikator** + - Zeige wann Daten zuletzt aktualisiert wurden + +### ๐ฎ PHASE 2-3 (6-12 Monate) + +1. **Zone File Access beantragen** + - Verisign (.com/.net) + - "Drops Tomorrow" Feature + +2. **Pounce Instant Exchange** + - Integrierter Escrow-Service + - 5% Gebรผhr --- -## ๐ Fazit +## ๐ Der Unicorn-Pfad -Die Market Page ist **funktional**, aber der wahre USP (Pounce Direct) ist noch nicht aktiviert. +``` +Phase 1: INTELLIGENCE (Jetzt) +โโโ Pounce Direct aktivieren (Unique Content) +โโโ Clean Feed (aktuelle Daten, Spam-frei) +โโโ Trust aufbauen +โโโ 10.000 User, $1M ARR -**Die Reihenfolge:** -1. โ Aggregation funktioniert (Scraping) -2. โณ Pounce Direct aktivieren (User-Listings) -3. ๐ฎ Zone Files fรผr Datenhoheit (Phase 3) +Phase 2: LIQUIDITรT (18-36 Monate) +โโโ Pounce Instant Exchange +โโโ Buy Now im Dashboard +โโโ 5% Gebรผhr +โโโ $10M ARR -> *"Der Weg zum Unicorn fรผhrt nicht รผber besseres Scraping, sondern รผber einzigartigen Content."* -> -> โ pounce_strategy.md +Phase 3: FINANZIALISIERUNG (3-5 Jahre) +โโโ Fractional Ownership +โโโ Domain-Backed Lending +โโโ = FINTECH ($50-100M ARR) + +Phase 4: IMPERIUM (5+ Jahre) +โโโ Enterprise Sentinel (B2B) +โโโ Fortune 500 Kunden +โโโ = $1 Mrd. Bewertung +``` + +--- + +## ๐ Das Fazit + +**Aggregation ist Commodity. Pounce Direct ist der USP.** + +Der Weg zum Unicorn: +1. โ Datenqualitรคt (aktuelle, saubere Daten) +2. โณ Unique Content (Pounce Direct aktivieren!) +3. ๐ฎ Datenhoheit (Zone Files) + +> *"Don't guess. Know."* +> +> โ Phase 1: Intelligence diff --git a/backend/app/api/auctions.py b/backend/app/api/auctions.py index 3403592..33fe52d 100644 --- a/backend/app/api/auctions.py +++ b/backend/app/api/auctions.py @@ -277,8 +277,14 @@ async def search_auctions( - Look for value_ratio > 1.0 (estimated value exceeds current bid) - Focus on auctions ending soon with low bid counts """ - # Build query - query = select(DomainAuction).where(DomainAuction.is_active == True) + # Build query - ONLY show active auctions that haven't ended yet + now = datetime.utcnow() + query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > now # โ KRITISCH: Nur Auktionen die noch laufen! + ) + ) # VANITY FILTER: For public (non-logged-in) users, only show premium-looking domains # This ensures the first impression is high-quality, not spam domains @@ -457,9 +463,15 @@ async def get_hot_auctions( Data is scraped from public auction sites - no mock data. """ + now = datetime.utcnow() query = ( select(DomainAuction) - .where(DomainAuction.is_active == True) + .where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > now # Only show active auctions + ) + ) .order_by(DomainAuction.num_bids.desc()) .limit(limit) ) @@ -996,7 +1008,13 @@ async def get_market_feed( # 2. EXTERNAL AUCTIONS (Scraped from platforms) # โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ if source in ["all", "external"]: - auction_query = select(DomainAuction).where(DomainAuction.is_active == True) + now = datetime.utcnow() + auction_query = select(DomainAuction).where( + and_( + DomainAuction.is_active == True, + DomainAuction.end_time > now # โ KRITISCH: Nur laufende Auktionen! + ) + ) if keyword: auction_query = auction_query.where( diff --git a/backend/app/scheduler.py b/backend/app/scheduler.py index 7c66c4b..e2c3375 100644 --- a/backend/app/scheduler.py +++ b/backend/app/scheduler.py @@ -204,12 +204,30 @@ def setup_scheduler(): replace_existing=True, ) - # Auction scrape every hour (at :30 to avoid conflict with other jobs) + # Auction scrape every 2 hours (at :30 to avoid conflict with other jobs) scheduler.add_job( scrape_auctions, - CronTrigger(minute=30), # Every hour at :30 - id="hourly_auction_scrape", - name="Hourly Auction Scrape", + CronTrigger(hour='*/2', minute=30), # Every 2 hours at :30 + id="auction_scrape", + name="Auction Scrape (2h)", + replace_existing=True, + ) + + # Cleanup expired auctions every 15 minutes (CRITICAL for data freshness!) + scheduler.add_job( + cleanup_expired_auctions, + CronTrigger(minute='*/15'), # Every 15 minutes + id="auction_cleanup", + name="Expired Auction Cleanup (15m)", + replace_existing=True, + ) + + # Sniper alert matching every 30 minutes + scheduler.add_job( + match_sniper_alerts, + CronTrigger(minute='*/30'), # Every 30 minutes + id="sniper_matching", + name="Sniper Alert Matching (30m)", replace_existing=True, ) @@ -220,7 +238,9 @@ def setup_scheduler(): f"\n - Tycoon domain check every 10 minutes" f"\n - TLD price scrape at 03:00 UTC" f"\n - Price change alerts at 04:00 UTC" - f"\n - Auction scrape every hour at :30" + f"\n - Auction scrape every 2 hours at :30" + f"\n - Expired auction cleanup every 15 minutes" + f"\n - Sniper alert matching every 30 minutes" ) @@ -302,6 +322,58 @@ async def check_price_changes(): logger.exception(f"Price change check failed: {e}") +async def cleanup_expired_auctions(): + """ + Mark expired auctions as inactive and delete very old ones. + + This is CRITICAL for data freshness! Without this, the Market page + would show auctions that ended days ago. + + Runs every 15 minutes to ensure users always see live data. + """ + from app.models.auction import DomainAuction + from sqlalchemy import update, delete + + logger.info("Starting expired auction cleanup...") + + try: + async with AsyncSessionLocal() as db: + now = datetime.utcnow() + + # 1. Mark ended auctions as inactive + stmt = ( + update(DomainAuction) + .where( + and_( + DomainAuction.end_time < now, + DomainAuction.is_active == True + ) + ) + .values(is_active=False) + ) + result = await db.execute(stmt) + marked_inactive = result.rowcount + + # 2. Delete very old inactive auctions (> 7 days) + cutoff = now - timedelta(days=7) + stmt = delete(DomainAuction).where( + and_( + DomainAuction.is_active == False, + DomainAuction.end_time < cutoff + ) + ) + result = await db.execute(stmt) + deleted = result.rowcount + + await db.commit() + + if marked_inactive > 0 or deleted > 0: + logger.info(f"Auction cleanup: {marked_inactive} marked inactive, {deleted} deleted") + + except Exception as e: + logger.exception(f"Auction cleanup failed: {e}") + + async def scrape_auctions(): """Scheduled task to scrape domain auctions from public sources.""" from app.services.auction_scraper import auction_scraper