Skip to content

Registry: list the brands a house has (house_domain filter on listBrands) #8747

Closed

Description

@bokelley

Problem

A buyer platform creating an advertiser for a house domain such as pg.com wants to offer the house's brands as choices: Tide, Gillette, Pampers and so on. The registry already knows many of these links. Each sub-brand's own record carries house_domain, so tide.com points at pg.com. But the public API cannot answer "which brands belong to this house?":

  • GET /api/brands/registry (listBrands) reads only search, limit, offset and source. A house_domain query parameter is ignored.
  • search=pg.com matches the house's own record, not its sub-brands, because search looks at the domain and the name.
  • The only way to get the list today is to page through the whole registry (about 12,800 records) and filter on the client.

The database layer already supports the filter: BrandDatabase.listDiscoveredBrands({ house_domain }). Nothing exposes it.

Evidence (live registry, 5 November 2026)

Records that name a house (house_domain) 422
Largest houses unilever.com 27, pg.com 27, nestle.com 23, pepsico.com 22, generalmills.com 21
Source of those records 338 enriched, 60 hosted, 23 community, 1 brand_json
Records with relationship_trust computed 0

pg.com is a hosted record whose manifest lists no brands, so a client reading the house's own document finds nothing to offer.

Proposal

  1. Add a house_domain filter to listBrands. GET /api/brands/registry?house_domain=pg.com returns the records whose house_domain is that domain, with the existing per-record fields, including relationship_trust and claimed_house_domain. Because the SDK builds ListBrandsOptions from the OpenAPI document, clients get listBrands({ house_domain }) with no new SDK method. stats should honour the filter, as it honours search.
  2. Compute relationship_trust for the existing links. None of the 422 has a verdict yet. Until it does, a client cannot tell a house-confirmed link (inline, mutual) from an enrichment guess, and the registry's own guidance says to treat everything else as a claim.

What a client does with it

The intended use stays within the trust rules: a listed sub-brand is offered as a suggestion by its own domain only, never as authority from the house and never with a house brand_id. Choosing tide.com creates an advertiser on tide.com's own identity. The client labels a link as confirmed only when relationship_trust is inline or mutual.

Activity

  1. added
    brandIssue concerns the brand protocol domain
    enhancementNew feature or request
    on Nov 5, 2026
  2. bokelley commented on Nov 5, 2026

    @bokelley
    ContributorAuthor

    Part 1, the house_domain filter on listBrands, shipped in #8748 and #8749. #8749 also matches claimed_house_domain, so brands whose claim is unconfirmed stay listed. Part 2, computing relationship_trust for these links, moves to #8755, which also covers where AAO-inferred links should live. Closing this one.

  3. bokelley commented on Nov 6, 2026

    @bokelley
    ContributorAuthor

    Where this stands:

    1. List a house's brands. #8748 added ?house_domain= to GET /api/brands/registry (merged). #8749 made it also match a brand's own unconfirmed claim in claimed_house_domain (merged). #8764 (open) lists every brand the registry links to the house and labels each row with house_link:

    house_link Meaning Extends trust
    confirmed Both sides publish the link, or the brand redirects to the house Yes
    house_declared The house's own manifest lists the brand, and the house has shown it controls its domain No
    brand_declared The brand's own brand.json names the house No
    inferred An enrichment or community record links them No

    #8764 also returns the house's own record, so a picker can show "Brands of Procter & Gamble (verified)" without a second call.

    2. Compute relationship_trust for the 422 existing links. Not doing this as a backfill: there's nothing to compute against. The resolver only returns a verdict for domains that serve a brand.json, and the brands linked to pg.com don't (tide.com, gillette.com and pampers.com return 404, dove.com 403). Most of the 422 links (338) come from enrichment. After #8764 they're listed and labelled inferred, which matches what they are.

    What changes P&G's list. pg.com's hosted manifest is a flat brand manifest with no brand list. Once the owner publishes a portfolio (brand_refs[] or inline brands[], for example with Addie's add_to_brand_refs), its brands show as house_declared. That works even for brands that never publish a brand.json, because the list reads the house's own manifest. A brand becomes confirmed only when it publishes its own brand.json naming the house.

    Open question, not blocking: when a house lists a brand and the brand publishes a brand.json that doesn't name the house back, the crawler records house_only and clears both house columns on the brand's row. #8764 doesn't depend on that row, but /api/brands/resolve for the brand then doesn't say which house claimed it. Worth deciding whether house_only should record the claiming house.

  4. bokelley commented on Nov 6, 2026

    @bokelley
    ContributorAuthor

    Update to my comment above:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    brandIssue concerns the brand protocol domainenhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions