U3 · Core

Achado de Leilão

A single search across official Brazilian auctions (federal bank Caixa, other banks, tax authority, DMVs, labor courts, city halls and auctioneers). Live since Sept 28, 2026, with a Python collector, a Next.js site and an MCP server.

Engineering decisions

  • One module per source, all sharing the same `collect()` contract. Upserts never overwrite a field with an empty value, and a lot is only marked inactive after a full pass of its source.
  • Price and status history lives in the database: a trigger records every change to bid, appraisal, status and final sale in an events table, which powers each lot's timeline and the sell-through rate.
  • Accent-insensitive Portuguese full-text search inside PostgreSQL (`tsvector` + `unaccent`), with no separate search service.
  • MCP server with 7 tools, including guarded free-form SQL: read-only session, 15 s timeout, 200-row cap and a constant-time token check.
  • Magic-link sign-in and Stripe subscriptions through Better Auth, with no custom plans table. Email alerts fire at the end of each collection cycle.
  • Public pages per category, state and city, with sitemap, JSON-LD and `llms.txt`, for organic search and AI assistants.

Results

  • 53,997 active lots from 22 official sources, across 27,282 auctions (as of Oct 14, 2026).
  • Lots in all 27 Brazilian states; 30,123 properties and 17,333 vehicles.
  • Data refreshed every 6 hours.
  • 7 MCP tools: lot search, lot detail, upcoming auctions, summary, sale results, lot history and SQL.

Stack

Python 3.12httpxPostgreSQL 17Next.js 16React 19TypeScriptBetter AuthStripeMCP SDK (Python)Docker

What it shows

Shows I can take a data product from scraper to website to MCP server end to end, and run it in production.