| Signal | oRTB field(s) | Notes |
|---|---|---|
| Publisher org | site.publisher.id, site.publisher.name, site.publisher.domain | All lowercased. name / domain omitted on empty. |
| Publisher slot | site.id, imp[].tagid | Always present. site.id resolves: DSP override → chatbot public_id → legacy int id |
| Surface (web) | site.domain, site.page | Per-request URL; lowercased domain. site.privacypolicy=1 always. |
| Surface (in-app) | app.bundle, app.storeurl, app.domain | Only when publisher inventory is ios_app / android_app |
| Conversational query | site.search | LLM-rephrased — keys off like a search query |
| Keywords | site.keywords, user.keywords | Comma-separated; LLM-extracted |
| IAB category | site.cat[] + site.cattax: 7 | Tax 3.0 Tier 1 Unique IDs only. Mostly numeric (e.g. "483"); six are short alphanumeric extension IDs (e.g. "JLBCU7"). Sub-tiers not signalled. |
| Geo | device.geo.{country,region,city}, device.geo.type=2 | ISO-3 country. type=2 declares IP-based provenance — Thrad does not collect GPS. |
| Conversation language | device.language | Auto-detected from the conversation, falls back to Accept-Language. Omitted when undetermined. |
| Device | device.{ua,ip,ipv6,devicetype,os,js} | js=1 always (chatbot widget is JS-rendered). IPv6 sent as device.ipv6 when applicable. |
| Mobile ad id | device.ifa | In-app traffic only |
| GDPR | regs.gdpr | Currently always 0 (stub). Full consent block + user.ext.consent ships in Wave 4. |
| CCPA / GPP / COPPA | regs.us_privacy / regs.gpp / regs.coppa | Not yet wired — Wave 4. |
| Supply chain | source.ext.schain | Not yet wired — Wave 4 (depends on the publisher public_id work). |
| Publisher blocks | bcat, badv | Only when publisher has set them. Today not stored per-publisher — effectively never present. |
Guides
Targeting Signals
Targeting signals available in the Thrad SSP BidRequest.
Everything Thrad supplies and where to find it in the BidRequest:

