{"service":"competivor-api","ok":true,"app_env":"production","public_base_url":"https:\/\/api.competivor.com","dashboard":"\/dashboard","login":"\/login","api_auth":"JWT (Bearer \/ cookie) ή X-Api-Key: <key> (ή Bearer με μη-JWT τιμή) — το κλειδί δημιουργείται από Profile στο dashboard· POST\/DELETE \/api\/me\/api-key με JWT.","jobs_enqueue":["POST \/api\/jobs με JSON· πεδίο mode: week | week_all | week_gaps | hotel_calendar_all | hotels_calendar_all | season | season_all — ή χωρίς mode μονό job. (season*, hotel*_calendar_all, week_gaps: μόνο κενά + σεβασμός ουράς.)","Προαιρετικά (ίδιοι handlers, αν το WAF\/nginx τα επιτρέπει): \/api\/scrape-enqueue\/*, \/api\/jobs\/week-gaps."],"seasons":"GET \/api\/seasons — ορισμοί περιόδων από πίνακα pricing_seasons.","hotel_context":"GET \/api\/hotels\/context-bulk (ίδιο: \/api\/context-bulk, \/api\/hctx) ?check_in=&stay_nights=7&hotel_ids=1,2 — snapshot, δωμάτια, κριτικές από booking_run_* πίνακες.","ferry_admin":"Admin JWT: GET \/api\/ferry-completeness (πληρότητα· για Πειραιάς↔Μύκονος πάντα δύο γραμμές PIR→JMK και JMK→PIR), POST \/api\/ferry-jobs\/enqueue-gaps JSON {dep_code, arr_code} — σε PIR\/JMK ή JMK\/PIR μπαίνουν jobs και για τις δύο κατευθύνσεις ανά ημερομηνία season, GET \/api\/ferry-jobs\/summary. Worker: node ferry-worker.mjs (Docker: ferry-worker).","completeness_cache":"Admin JWT: GET \/api\/scrape-completeness, \/api\/ferry-completeness, \/api\/event-completeness — ανάγνωση από πίνακα completeness_cache όταν υπάρχει snapshot (γρήγορο άνοιγμα Ρυθμίσεων)· πρώτο αίτημα ή κενό cache: πλήρης υπολογισμός + αποθήκευση. POST \/api\/completeness-cache\/refresh JSON { kind: scrape_hotels|ferry|events, hotel_ids?: number[] } — επανυπολογισμός· hotel_ids κενό = όλα τα ξενοδοχεία (ίδιο με GET scrape χωρίς query).","daily_snapshot":"JWT: GET \/api\/daily-snapshot?date=YYYY-MM-DD&stay_nights=7&force=0 — ημερήσιο JSON (ξενοδοχεία, contexts, OTA, ferry, tickets, events, καιρός, ουρά scrape) + content_hash & dependency_fingerprint· cache πίνακας daily_snapshots (on-demand). Admin: GET \/api\/daily-snapshots\/completeness?stay_nights=7 — πληρότητα % ανά **ημερολογιακό μήνα** (συνένωση ημερών seasons). POST \/api\/daily-snapshots\/rebuild JSON { mode: one|season|month|purge, date?, season_id?, year_month?, stay_nights?, force? } — ένα \/ όλες οι ημέρες season ή **μήνα (YYYY-MM)** \/ διαγραφή cache (force=false = μόνο κενά\/λήξαντα fingerprint). Αλλαγές στις πηγές διαγράφουν σχετικά snapshots (triggers).","tickets_completeness":"Admin JWT: GET \/api\/tickets-completeness — πληρότητα Kayak calendar (tickets_prices) ανά ATH→JMK \/ JMK→ATH × ημερολογιακό μήνα (6 μήνες από τρέχοντα, Europe\/Athens), ίδιο JSON σχήμα με ferry-completeness. GET \/api\/tickets-jobs\/summary — αν υπάρχει πίνακας tickets_jobs, μετρήσεις + λίστα ενεργών jobs· αλλιώς table_exists: false.","ferry_season_series":"GET \/api\/ferry\/season-series?sel=<season_id> — μέσος όρος τιμών ακτοπλοϊκής διαδρομής (PIR→JMK \/ JMK→PIR) ανά εβδομάδα season, ίδιο ημερολόγιο με GET \/api\/tickets\/season-series. GET \/api\/ferry\/daily-series?sel=&dep_code=&arr_code= — ημερήσιοι μέσοι όροι scraped προσφορών ανά travel_date. JWT. Αν λείπουν πίνακες ferry: 503.","eventbrite_worker":"Ουρά event_jobs → Eventbrite (source\/booking-scrapper\/event-scraper\/, Docker: Dockerfile.event-scraper). Daemon: node event-worker.mjs. CLI: --scrape [id|url|τόπος] — χωρίς όρισμα: Μύκονος (place 101848363). Docker: EVENT_SCRAPER_DB_WRITE=1 χωρίς LOCATION → ίδια προεπιλογή· αλλιώς EVENT_SCRAPER_LOCATION. EVENTBRITE_CLI_SEARCH_DATES_JSON. local_events_settings: ίδιο place για dashboard + POST \/api\/event-jobs\/enqueue-gaps, POST \/api\/event-jobs\/retry-failed (admin).","docker_admin":"Admin JWT: GET \/api\/admin\/docker\/containers — τρέχοντα containers (docker ps). Ενεργό μόνο με COMPETIVOR_DOCKER_PS=1 στο host του API + docker CLI. Προεπιλογή: όλα τα running στο host· για μόνο compose project: COMPETIVOR_DOCKER_ALL=0 και COMPETIVOR_DOCKER_PROJECT=competivor."}