Inspiration

People sell thrift, vintage, sneakers and plants on live video, and in the US those shows sold about $14.6 billion of goods in 2025 (eMarketer). The sale is a comment. Someone types "mine" or "sold 14", the seller tries to work out who typed first, and payment requests go out by hand after the show. Some buyers never pay, and by the time the seller notices, the next person who wanted the item has left. Sellers write their own rules for this. One live crystal seller tells buyers that 15 to 20% of its orders each week go unpaid, and cancels and blocks after the deadline (forgottenrarities.com, live sale rules). Others give the item to whoever shows up first on the host's screen, invoice through PayPal within a day, and offer released items to the next person in line. Dibs does those steps during the show instead of the next day.

What it does

Sellers can run the show from Dibs or keep streaming on YouTube Live: paste the link and Dibs reads that chat too, giving each YouTube buyer a 4-digit code to pay with. The seller holds an item up and says what it is ("lot three, leather bag, thirty five"). Dibs hears the price, looks at the camera and writes the listing. Buyers claim however they talk: slang, emoji, Spanish, Hindi, Japanese. Keyword rules settle the clear claims instantly; Gemini reads the rest (on 40 real live-chat messages, 8 of the 13 claims and questions were ones only Gemini caught), writes listings and translates every reply, which is only sent if its prices, handles and numbers match. The first claimer gets a clock and a PayPal checkout on their phone. If the clock runs out, the item moves to the next person in line, who is told in their own language. When PayPal confirms the payment, the board turns green. During the show a co-host watches the clocks: it can send pay reminders on its own and suggests relisting what nobody paid for. After the show the seller asks it things ("wrap up the show", "refund lot 1", tracking numbers); anything that moves money waits for the seller's Confirm and is sent with an idempotency key.

The show in the video and in judge mode is staged by us, with scripted viewers; no seller has used Dibs yet. The PayPal sandbox payments, webhooks and refunds in it are real.

How we built it

  • PayPal Orders v2 through the PayPal TypeScript Server SDK: one order per buyer with a line per lot, the seller's own PayPal account as payee, idempotent create and capture.
  • The claim clock gates capture: a late approval gets a 409 and no charge, and the hold is locked while PayPal captures so a lot can't sell twice.
  • Webhooks register themselves, are checked with verify-webhook-signature, and are applied once per event (capture completed, denied, refunded).
  • PayPal Agent Toolkit behind a Gemini function-calling loop for the co-host. The model only sees read tools. When the seller confirms a refund, the server sends it, capped by what was captured for that lot. The first refund (shown in the video) went through the Toolkit's create_refund; refunds now go to the captures refund endpoint with a PayPal-Request-Id so a repeated Confirm can't refund twice.
  • A buyer who opens PayPal checkout gets one clock extension, to 3 minutes, so a slow sign-in doesn't hand their item to the next person.
  • Gemini reads unclear chat lines, writes listings from the seller's words and a camera frame, and translates replies. A translation is used only if every price, handle, time and number in it matches the English.
  • Keyword rules decide clear claims in milliseconds and keep the show running when the model is slow or out of quota.
  • YouTube Data API for live chat; we pointed it at real live sales on 11 Nov 2026. Those sellers were in India, where PayPal can't take domestic payments, so they only tested how Dibs reads real mixed-language chat; their Hinglish lines became test cases.
  • PayPal JS SDK (v5 buttons) on the buyer's phone. Fastify and WebSockets on the server, React on the web, TypeScript strict, 75 tests, CI.

Challenges

Our default sandbox accounts were in India, and PayPal doesn't allow domestic India payments, so the first checkout failed until we moved to US sandbox accounts. Gemini's free tier was too slow to sit in the claim path, which is why clear claims go through rules in server order and the model only reads the messy lines. A first translation turned "$28" into "¥4,200", and a later one swapped a lot number with a place in line. Now a translation is used only if every price, handle, time and number in it matches the English; otherwise the buyer gets the English.

What we're proud of

It ran for real in the PayPal sandbox. A two-lot order (19Y34583SB393764D, $65.00) was captured as 55L4149684291294L. In a separate run, the co-host proposed a $15.00 refund on capture 2UY924655E8922244 and, after the seller confirmed, PayPal returned refund 38E52394V7107161L; asked next to refund $100 on that $40 lot, it was refused in code. In a judge-mode run, every lot rolled past buyers who didn't pay and sold to the next person in line: $103 in two PayPal orders (3AL0533008814173K and 06300522MV939094K). An earlier run's capture, 4LL559102D3980315, had its PAYMENT.CAPTURE.COMPLETED webhook (WH-98S25606W97563605-50G69523LK7423726) delivered to the hosted site, which answered 200 only after verify-webhook-signature passed. On 40 real live-chat messages there were 13 claims and questions; Gemini caught 8 that the keyword rules missed (all questions).

What's next

Read Instagram's live comments too, move video to WebRTC, store shows in a database, and onboard sellers with PayPal Partner Referrals, sending orders with PayPal-Partner-Attribution-Id instead of naming the payee by email as the sandbox demo does.

AI tools used

Google Gemini (gemini-3.5-flash-lite and gemini-3.5-flash) reads unclear chat messages, writes item listings from the seller's speech and a camera frame, translates replies to buyers, and runs the seller's co-host with the PayPal Agent Toolkit. The demo video voiceover was made with ElevenLabs.

Links

Built With

Share this project:

Updates

Submission history