Inspiration

Shoppers buy alone while pricing algorithms see millions of us. Coupon apps only find discounts that already exist. We wanted ordinary people to bargain together, and AI agents finally make that cheap to organise.

What it does

  • Scan: a screenshot of any cart or product page gets a Money Score and one smartest move, with the cheaper offers it found linked to their pages.
  • Blocs: when many people want the same product, they join a Bloc. Each member commits a private maximum. A Nemotron 3 Ultra negotiator runs a multi-round, sealed-bid negotiation against seller agents on Nemotron 3 Super. Everyone pays the price they were allocated, never more than their maximum, and nothing if no deal closes.
  • Sellers: a console with their own bounded AI agent, orders, shipping with tracking, and payout on delivery.

How we built it

FastAPI, Next.js and Postgres. Every model runs on Nebius Token Factory:

Job Model
Read the screenshot Nemotron 3.5 Super VL
Normalise the product; pull prices out of the pages Tavily finds Nemotron 3.5 Lightning
Write the verdict; run each seller agent Nemotron 3 Super (120B-A12B)
Negotiate for the group, with tool calls Nemotron 3 Ultra (550B-A55B)
Match a screenshot to an existing Bloc Qwen3-Embedding-8B

Models never set money. A deterministic clearing engine allocates units and sets every price. Seller floors and stock are enforced in code, and the money ledger is hash-chained in Postgres.

Strict contracts. Each model role has a JSON schema, sent in the prompt and as a strict response_format. Code checks every answer, and each role gets only a bounded set of tools.

Spending caps. A Postgres ledger caps AI spend in total, per day, per person, per address and per negotiation. If a cap is hit or Token Factory is down, the negotiation runs a labelled replay instead of failing.

Transparency. Every call is logged with model id, tokens, latency and cost, and shown on the app's Under the hood page.

Hosted on free plans: Vercel (web), Render (API), Neon (Postgres), Brevo (email).

How Maxx uses Tavily

  • Search: one search per scan returns full page text for 1 credit. It prefers US retailers and makers' own stores (include_domains_mode: prefer) and excludes news, review, video and deal sites.
  • Second search: only stores whose pages can be read can confirm stock and shipping. When fewer than two stores confirm an offer, a second search asks only those stores (restrict). At most two pages are read in full with Extract.
  • Code decides which offers count, not the model:
    • product pages only, with the price quoted from the page
    • same brand, model, colour and pack size
    • new, not refurbished or open box
    • no card-signup or coupon prices, and not on backorder
  • Scoring: a score needs two such stores, or the maker's own store with a warning. Otherwise the verdict still names the lowest price it saw and says the evidence is thin.
  • Cost: a scan costs 1–4 credits. Results are cached for six hours, and daily and monthly credit caps stop runaway spend.

Challenges we ran into

  • Prices as text. Lightning sometimes returned prices as text like "$39.95". Our wire schema had left a string branch open for Decimal fields; we closed it so money crosses the model boundary as numbers only.
  • A schema keyword Token Factory rejected. Pydantic adds a regex pattern to Decimal fields, and Token Factory answered HTTP 500 to it in strict response_format. We strip it from the wire schema and re-check the value in code.
  • A negotiator that re-read its tools. With thinking off, Nemotron 3 Ultra sometimes called the same read tool again and again, or ended a tool turn in prose. Each read tool is now offered only until it has been answered, and a prose turn gets one fixed reminder.
  • Store pages that can't be read. Full-page reads of the largest US retailers come back empty or blocked, so they can never confirm stock or shipping. That drove the second, readable-stores-only search and the maker's-own-store rule.
  • Free hosting. The free API sleeps after 15 idle minutes, and Render's free plan blocks outbound email ports. Pages wake the API in the background and show a banner while it starts; email goes through a relay on port 2525.

Accomplishments that we're proud of

  • A live negotiation on the hosted demo (30 Oct): 601 buyers against eight seller agents, settled in 5 rounds and 34 seconds.
    • It took 49 Nemotron calls (9 Ultra, 40 Super) and cost $0.0186.
    • 451 buyers were served at $135–$142, against a $200 typical price.
    • 150 holds were released, and nobody paid above their maximum.
  • Tests: 0 invariant violations in 200 random auctions (188 of them partial fills), and 555 passing API tests.
  • Judge access: one access code reaches live Nemotron. There is no email, each scenario is a private copy, and every model call shows its cost on screen.

What we learned

Let the model choose, and let code decide money. Strict schemas on every call made four different Nemotron models dependable enough to put real prices behind. Measuring Tavily's credit counter directly changed the design more than any doc did.

What's next for Maxx

  • Run PayPal's real sandbox (the PayPal AI Hackathon entry).
  • A 40-image accuracy benchmark of screenshot reading on real carts.
  • Measure negotiation quality over many live runs.
  • Onboard real sellers.

Try it

Live at https://maxx.souravamseekar.com. Judges start at https://maxx.souravamseekar.com/judge with the access code from the submission's private notes.

The free API sleeps when idle, so the first visit takes about a minute while a banner shows it waking.

Disclosure

New project, started 5 October 2026; no prior code.

  • Simulated participants: in the demo scenarios the eight seller agents and the crowd of buyers (600 in the successful deal, 100 in each of the others) are simulated and labelled. They place no holds, and nobody is charged for them.
  • Simulated payments: PayPal runs in a labelled simulator.
  • Other entry: Maxx is also entered in the PayPal AI Hackathon, with the PayPal money layer.

Built With

Share this project:

Updates

Submission history