{"ok":true,"module":"cheapest-listing","version":"1.0.0","spec":"defici-cheapest-listing-module-v1","description":"Keyword search across the Defici classifieds catalogue. Returns listings matching a search term from the stored snapshot. Results are ordered by recency (listed_at desc) — NOT by price. Price ranking is currently unavailable because price units are not captured at ingest and cannot be compared in value across listings. Every search response includes freshness metadata (is_stale, result_max_listed_at, market_max_listed_at) so consumers can evaluate data recency before acting on results.","price_ranking_available":false,"price_ranking_note":"Price units are not captured at ingest. Prices shown are raw numbers with no confirmed currency unit and are NOT comparable in value across listings. Results are ordered by recency, not price. Ascending price ranking will be restored once currency is captured at ingest.","endpoints":{"search":"GET  /api/modules/cheapest-listing?q={term}     [public, no auth required]","manifest":"GET  /api/modules/cheapest-listing/manifest     [public] — you are here"},"auth":{"required":false,"note":"This module requires no authentication. All requests are public."},"query_params":{"q":{"required":true,"type":"string","description":"Search term. Matched against listing title (pass 1, higher relevance) then description (pass 2, fills remaining slots). Blank or missing → 400."}},"response_fields":{"results":"Confirmed-priced listings (price > 0). Up to 10 per call. Title matches first, then description-only matches. Ordered by recency.","unconfirmed_price_listings":"Listings where price=0 (scraper write-time normalisation bug — true price unknown). Surfaced separately with price_status:\"not_stated\" and no currency field. These are NOT included in results.","unconfirmed_count":"Integer count of entries in unconfirmed_price_listings.","ordered_by":"String describing the sort order applied (recency, not price).","price_ranking_available":"Boolean. Currently always false. See price_ranking_note.","is_stale":"True if the newest organic result is older than 7 days.","result_max_listed_at":"ISO timestamp of the most-recent organic listing in this result set.","result_min_listed_at":"ISO timestamp of the oldest organic listing in this result set.","market_max_listed_at":"Object: per-market freshness map for organic listings in result set.","catalogue_max_listed_at":"Background context only — newest non-house organic row in the full catalogue. Do NOT key freshness decisions off this field; use result_max_listed_at instead.","catalogue_age_days":"Age in days of catalogue_max_listed_at.","freshness_caveat":"Human-readable summary of result-set freshness."},"limits":{"results_per_search":10,"unconfirmed_listings_per_search":10},"result_placement_labels":{"organic":"Real scraped/user-submitted inventory (market field is non-null).","partner":"Genuine listing with non-null seller contact but market=null. Excluded from freshness figures."},"data_source":"ads table (Defici classifieds catalogue — scraped and user-submitted listings)","caveats":["This is a catalogue snapshot, not a live feed — check is_stale and result_max_listed_at.","Price units are not captured at ingest — prices are raw numbers not comparable across listings.","House/self-promo listings (seller contact @defici.com) are excluded from all results.","Partner listings (market=null) are included but labelled placement:\"partner\" and excluded from freshness figures."]}