In three lines

  • An AI agent built on Claude tells a Taiwanese food or lifestyle chain where its customers' taste travels in Japan: city, district, culture to borrow and audience.
  • A plain model also says "Tokyo", and guesses young women aged 15–29. Qloo's audience data points to 35–44, names the district (Taito, around Yifang Taiwan Fruit Tea) and the culture this audience likes (Mika Nakashima (中島美嘉), the film The Last 10 Years), scored on bubble tea venues only.
  • Every line cites the Qloo call behind it, code sets and caps the confidence level, and on thin data it refuses. Evaluation: 8 of 8 fictional brands pass.

Inspiration

Taiwanese bubble tea, tea and lifestyle brands keep opening stores in Japan. Most of them pick the city and the audience on gut feeling: open in Tokyo, target young women, post on Instagram. When I asked a chatbot the same question, it gave me that same answer with full confidence. A 20-store brand cannot pay for market research, and the first store is where it wins or loses. I wanted an advisor that answers from real taste data and says so when the data is too thin.

I am also moving from Taiwan to Osaka next year, which is where the second tab came from.

Who it is for, and who pays

Taiwanese F&B and lifestyle chains planning their first store in Japan, for whom a market research study is out of budget. The buyer is the founder or the expansion lead of a chain with tens of stores, not an enterprise with a research department.

Pricing (my assumption, not market data): a paid launch brief per brand, priced far below one research study, with a free first brief. The only cost figure here is measured, not assumed: Claude costs about US$0.06 per brand analysis in this app (US$0.051–0.059, average 0.056; US$0.047 average across all eight scenarios, Evaluation tab), so the AI cost does not set the price.

What it does

Brand Advisor. Enter a brand name and category, or click one of three fictional sample brands. The answer opens with a conclusion card and the page scrolls to it:

  • Entry city: Tokyo, Osaka, Kyoto, Fukuoka, Nagoya and Sapporo are scored on venues of the brand's own category (for the sample bubble tea chain, only bubble tea venues within 15 km of each centre count). Tokyo 0.82 and Osaka 0.79 differ by 0.024, so the app reports a close call and says to test both. If Qloo has no tag for the category, the score is labelled "overall taste affinity of the brand's audience, not category-specific".
  • Where in the city: the district where the matching venues cluster (Taito: Yifang Taiwan Fruit Tea, Asakusa Dòuhuā King), plus a Qloo taste heatmap on an OpenStreetMap map.
  • Culture to borrow: Japanese music, film and TV that people with the same taste tend to like, shown as "Mika Nakashima (中島美嘉)". Acts that Qloo describes as from another country (for example 東方神起, a South Korean duo that Qloo tags as Japanese music) are left out, and the evidence row names them.
  • Audience: age and gender affinity of the comparable audience.

Every recommendation carries clickable evidence IDs and a confidence level. Clicking an ID opens the exact Qloo call in the "What Qloo provided" panel: endpoint, parameters, result count, top results, and whether the agent chose the call or a coverage check added it.

Confidence is set by code, and capped. Counts, affinity and the number of independent endpoints give a level; then a close-call city recommendation is capped at medium, advice resting on little-known venues (mean Qloo popularity under 0.5) drops one level, and the level never exceeds what the text itself admits ("the evidence is moderate" cannot sit under HIGH). The reason is shown under the label.

LLM only vs. LLM + Qloo. The same model, with the same input and no tools, answers next to the agent. It also picks Tokyo, then says Harajuku and Shibuya and targets "Gen Z and young women aged 15-29", with nothing behind it. Qloo's audience data for the same taste points to 35–44. Both pick Tokyo; only the Qloo side knows which neighbourhood, which audience and which culture to borrow.

Thin data means no answer. For "holographic smart socks" Qloo has no matching venues, so the card says "Not enough Qloo data. No city, no audience." The plain model still names a Tokyo district.

Taste Bridge tab. The same engine for one person moving from Taiwan to Osaka. Type favourites in Chinese or English. People in Japan who like Jay Chou (周杰倫) also tend to like Mika Nakashima and the film Last Letter. Picks that share Qloo tags with the favourites come first, and Osaka places are ranked the same way: stations, hotels and venues themed on another country (an Australian pub) sink to the end. Brand links that share none (Louis Vuitton, Rolex, Starbucks for Jay Chou) are hidden and named in a note. Items Qloo does not know, like 夜市 (night market), are listed as not found. Results describe group tendencies; the app makes no prediction about the person.

Evaluation tab. Eight fictional brands run end to end with the real agent and live Qloo data, scored by code:

Check Result
Scenarios passing all checks 8 / 8
Recommendations citing existing Qloo evidence 100% (0 invented evidence IDs)
Thin-data cases that refuse 2 / 2
Recommended city matches Qloo's top-ranked city (or one tied with it) 6 / 6
Qloo calls chosen by the model 100%
Claude cost About US$0.06 per brand analysis (US$0.051–0.059, average 0.056); US$0.047 average across all eight scenarios

How I built it

  • Stack: Next.js (App Router), TypeScript, Tailwind, Leaflet with OpenStreetMap, lucide icons, zod, Vitest. Hosted on Vercel.
  • Agent loop: an AI agent built on Claude Sonnet 5.5, with tool use in a manual loop of at most 8 turns. It has seven Qloo-backed tools (search_entities, home_market_proxies, audience_profile, japan_taste_neighbors, score_japan_cities, city_places, compare_tastes) and a submit_report tool (Taste Bridge reuses search_entities and japan_taste_neighbors, adds osaka_places and finishes with submit_picks). Claude decides which tools to call and in what order. After each turn, code tells the model the data coverage it measured, and the model cannot overrule it. A coverage check fills any analysis step the model skipped and labels it "auto-filled". If there is no LLM key or the daily AI budget is used up, a rules-based agent runs the same tools on live Qloo data and the UI says so.
  • Confidence and citations are computed by code, with the caps above. Citations to evidence IDs that do not exist are dropped and counted. Taste Bridge explanations (Claude Haiku 5.5) are kept only if they mention a favourite, one of the pick's Qloo tags or its affinity, and make no individual prediction; otherwise a rule-built line is shown.
  • Qloo endpoints and why:
Need Qloo call Why
Is the brand itself in Qloo? GET /search (strict name match) Small Taiwanese brands are usually absent, so the agent needs to know before it uses proxies
Category to tag GET /v2/tags with filter.parents.types=urn:entity:place Turns "bubble tea" into a place tag ID
Home-market taste proxies GET /v2/insights place + filter.tags + filter.location (Taipei, 15 km) Same-category Taipei venues stand in for the brand's customers
Audience GET /v2/insights filter.type=urn:demographics Age and gender affinity of the proxy audience
Japanese culture neighbours GET /v2/insights artist / movie / tv_show / brand with a Japan filter per type Cross-domain taste, the part an LLM cannot measure
City fit GET /v2/insights place + the same category tag (filter.tags) + WKT point + 15 km radius, six cities Compares cities on venues of the brand's own category
Venues and heatmap GET /v2/insights place (6 km) and filter.type=urn:heatmap Where in the city
Shared themes GET /v2/analysis/compare Tags shared by home venues and the top venues in Japan

Parameter choices were checked against the live hackathon API, including what did not work (for example filter.release_country=Japan is ignored for movies, and place filters need WKT POINT(lon lat)). Details: docs/qloo-api-notes.md in the repo.

  • Caching and caps: about US$0.06 per brand analysis in Claude tokens (US$0.051–0.059, average 0.056: 6 Claude calls and about 21 Qloo calls), US$0.047 average across all eight scenarios because thin-data cases stop early. The sample brands and the evaluation set are pre-generated with the real agent. They contain Qloo-derived results, so they never go into the public repo: they ship inside the private Vercel deployment, uploaded from my machine with vercel deploy, and are read on the server only. Judges get full results instantly at no cost. Other inputs go through an answer cache and daily caps (2 LLM analyses per visitor, 8 in total, US$0.25 estimated spend); after a cap, the rules-based agent answers on live Qloo data. Qloo calls are throttled to about 4 per second with bounded retries and a private server-side cache.

Request to result (redacted)

Input: fictional brand "Formosa Pearl", category "Bubble tea chain".

  1. GET /search?query=Formosa Pearl&types=urn:entity:brand returns no name match, which is expected for a small brand.
  2. GET /v2/tags?filter.query=bubble tea&filter.parents.types=urn:entity:place returns a bubble tea place tag.
  3. GET /v2/insights?filter.type=urn:entity:place&filter.tags=<tag>&filter.location=POINT(121.5654 25.033)&filter.location.radius=15000&take=3 returns three Taipei venues, used as taste proxies.
  4. With the proxy IDs as signal.interests.entities: demographics, Japanese music / film / TV / brands, and bubble tea venues (same tag) around six city centres.
  5. Venues and heatmap for the top city and the runner-up, then compare between home venues and the top Tokyo venues.
  6. Claude writes 4 to 6 recommendations citing evidence IDs; code drops unknown IDs, sets confidence and applies the caps.

Result: start in Tokyo, reported as a close call with Osaka (0.82 vs 0.79, medium confidence), around Taito; culture references such as Mika Nakashima (中島美嘉) and The Last 10 Years; an audience leaning 35 to 44 (the plain model guessed 15–29); pop-up notes whose confidence drops one level because the matched venues are little known in Qloo. Each line has evidence IDs.

Reproduce it

See "Run it" in the README: npm install, copy .env.example to .env.local and add QLOO_API_KEY and ANTHROPIC_API_KEY, then npm run dev. Without keys the app runs on clearly labelled mock data. npm run showcase:build re-runs the presets and the evaluation with Claude and live Qloo (about US$0.5); npm run eval:live runs the evaluation with the rules-based agent and no LLM cost.

Challenges I ran into

  • Small Taiwanese brands are not in Qloo. Using same-category Taipei venues as proxies worked, and the app says it is a proxy every time.
  • City fit was first measured on all places, so a city's score rested on hotels and kimono rental. Adding the brand's category tag to the city query (checked on the live API) made the score category-specific, and the cities now spread out instead of sitting within 0.05 of each other.
  • A judge found a HIGH label next to text that said the evidence was moderate. Confidence now has code caps and can never exceed what the recommendation's own wording admits.
  • My first live evaluation failed 4 of 8 scenarios. The agent stopped too early when code reported "insufficient" before anything was measured; I added explicit early coverage states. On "millet wine" the model broadened the keyword to "bar" and turned a thin case into a confident answer; now category keywords must name the product.
  • Several filters fail silently in the API. I tested each parameter against the live API and wrote down what works.

Accomplishments that I'm proud of

  • Every recommendation traces back to a specific Qloo call that a judge can open, and every confidence level can be explained by a rule.
  • The agent refuses on thin data in both test cases, and the side-by-side column shows what a plain model says instead.
  • The evaluation is scored by code from the finished report, and it passes 8 of 8.

What I learned

  • Qloo is most useful for the cross-domain question: which Japanese music, film and venues go with a Taiwanese drink shop's audience. An LLM cannot measure that.
  • The model is good at choosing tools. Honesty about data coverage and confidence had to come from code.
  • Cached, pre-generated demos make a public AI app cheap and predictable for judges.

What's next

  • Run it with real brands that can share comparable brands or artists their customers like, so Qloo can be seeded directly.
  • More target markets (Korea, Hong Kong, Southeast Asia) and the reverse direction for Japanese brands entering Taiwan.
  • Export the brief as a PDF for partners and investors.

Limits (what the results cannot prove)

  • The demo brands are fictional. Taipei venues stand in for customers; they do not measure the brand itself.
  • City fit is category-specific only when Qloo has a place tag for the category; otherwise it is the audience's overall taste and the app says so. The top two cities are often within 0.03, which the app reports as a close call.
  • Japanese culture neighbours lean toward popular names that recur across inputs. Qloo's "Japanese music" tags also cover Korean and Taiwanese acts popular in Japan; the app drops entities whose Qloo description names another country, which depends on that description being there.
  • "Brands with Japan as a key market" are brands Qloo lists for Japan, not Japanese-owned brands.
  • Affinity is a taste correlation for groups. It does not predict sales, demand or any one person's choices.
  • Qloo coverage of Japanese venues and Taiwanese entities is uneven in the hackathon environment, which is why data coverage and confidence are shown on every result.

Try it out

Testing instructions for judges

No login needed. On Brand Advisor, click "Formosa Pearl · Bubble tea chain": the conclusion card opens first, then recommendations with confidence and the reason for any cap, city fit for bubble tea venues, audience, map, Japanese taste neighbours, "LLM only vs. LLM + Qloo", and "What Qloo provided". Click any evidence ID (E1, E2...) to jump to the Qloo call. The Evaluation tab links every scenario's full report, including the two thin-data cases. The Taste Bridge tab accepts Chinese or English; try "周杰倫". Sample inputs are pre-generated, so they load instantly and cost nothing.

Built With

Share this project:

Updates

Submission history