Inspiration

What it does

How we built it

Challenges we ran into

Accomplishments that we're proud of

What we learned

What's next for Cold-Open

What it does

Cold-Open turns a brand name into ranked, evidence-cited partnership leads using Qloo's cross-category taste affinity data. Enter a brand and it:

  1. Resolves the subject to a Qloo entity (GET /search) and to a Qloo tag (GET /v2/tags), showing the pick, the type URN, the tag, and every alternative it considered — so the resolution is auditable instead of hidden.
  2. Scans three lead buckets across five Insights entity types: brand collaborations (urn:entity:brand), artist/podcast partnerships (urn:entity:artist, urn:entity:podcast), event/venue activations (urn:entity:place, urn:entity:destination). One GET /v2/insights request per bucket, parameters in the query string (a POST with a JSON body fails against this API).
  3. Ranks candidates by affinity, drops direct competitors (same category as your subject) and caps each bucket.
  4. Pitches one paragraph per lead citing the Qloo evidence, followed by an explicit "what this does not establish" block on every result set.

The same pipeline module runs in three places: the hosted browser demo, the local web demo, and the CLI. Two transports (fetch in the browser, qloo api / qloo exec on Node) and one shared shape module.

What is Qloo-powered

Entity resolution, every affinity score, the ranking inputs and the evidence all come from Qloo Insights output. the ranking and pitch layer is deliberately template-based (no LLM call) so each sentence traces back to a field in a Qloo response.

Two request decisions the judges should check

  • Entity signals, not tag signals. signal.interests.entities=<entity_id> returns subject-dependent results with varying affinity for every supported entity type (measured: Patagonia -> REI / The North Face / Moab / Rich Roll Podcast; Red Bull -> GoPro / Skrillex / Saas-Fee). Tag signals (signal.interests.tags) only move the needle for tag/type pairs that are graph-connected; for most pairs the API answers with the same default list at a constant affinity (0.7649962877984056), which makes every subject look identical. Tag-signalled requests against urn:entity:place additionally took 32-46 s (and 504s), against 1-2 s for entity signals.
  • Supported filter.type values only. urn:entity:music_artist and urn:entity:place:restaurant are rejected with HTTP 400. test/api_contract.test.mjs pins the whole category -> entity-type map to the developer guide's supported list, so that class of bug cannot come back.

Live demo

https://nicolasesanchez50.github.io/cold-open/

It runs keyless on responses recorded from the live hackathon API by scripts/record_fixtures.py (field selection only, nothing invented — the page labels the state RECORDED and lists the recorded subjects). Paste an event API key in the page to switch to live mode: every call then goes straight to https://hackathon.api.qloo.com from the browser (the endpoint answers access-control-allow-origin: *, so no backend proxy exists). The key is never committed, never embedded in the page and never written to a fixture — per the starter-kit rule, it stays on the visitor's machine.

Reproduce

git clone https://github.com/nicolasesanchez50/cold-open && cd cold-open
node --test                        # 10 tests, incl. the API-contract test
node src/agent/cli.mjs Patagonia   # recorded mode, no credential needed
node src/web/server.mjs 3737       # local web demo

Live CLI and fixture re-recording are documented in the README. No npm dependencies; Node 22+ only.

Responsible data handling and limits

  • No personal data is sent to Qloo — inputs are brand/product names only.
  • Affinities are aggregate group-level correlations, never claims about individuals and never causal; every result set carries the caveat block.
  • A wrong entity resolution would change the results, so the alternatives are printed next to the pick rather than hidden.
  • Scores describe taste affinity only — not budget, availability, exclusivity or brand safety. A human still qualifies the shortlist.

Built With

Share this project:

Updates

Submission history