Skip to content
PlacementGraph™
Buy side transparency

What is buyers.json, and what does the DemandChain object add?

Part of Supply path transparency

A reader browsing on a laptop with a coffee.
Photo: Vlada Karpovich, Pexels

The short answer

buyers.json is a public JSON file that a DSP or other buying intermediary posts at /buyers.json on its root domain, listing the buyer seats it represents. The DemandChain object travels in each bid response and lists, in order, the parties paying for that creative. Together they give sellers the buy side view that sellers.json and schain give buyers.

Key takeaways

  • IAB Tech Lab released buyers.json and the DemandChain object as version 1.0 in June 2021, to help sellers trace malvertising to the buyer.
  • A buyers.json entry pairs a buyer_id with a buyer_type of ADVERTISER, INTERMEDIARY or BOTH, and the same ID should appear as the seat in the bid response.
  • Agencies are expected to publish their own buyers.json on the corporate domain; brands that pay directly have nothing to implement, only a domain to share.
  • No public adoption measure exists; in October 2026, 26 of 796 Prebid bidder adapter pages declared DemandChain support.

What is buyers.json?

Definition

buyers.json
A JSON file that an advertising system or other intermediary between the payer and the publisher posts on its root domain to declare publicly the buyers it represents, each with an ID, a type and, unless marked confidential, a legal name and domain.

The buyers.json 1.0 specification (opens in a new tab), released in June 2021, says it "enables sellers to identify who is buying their inventory." The stated driver is malvertising: bad actors jump from DSP to DSP, and publishers and SSPs cannot block one known bad entity across all of its access points at once.

The access rules mirror the sell side files. The file sits at https://{root_domain}/buyers.json, where the root domain is the public suffix plus one string, served over HTTPS as application/json. A consumer may follow one redirect off the original root domain, and without cache directives should default to an expiry of 7 days.

Top level fields of a buyers.json file, per the buyers.json 1.0 specification
FieldStatus in the specWhat it holds
buyersRequiredThe Buyers objects the system represents; all buyers must be included even if they are confidential
identifiersOptionalIDs for the advertising system itself, such as a TAG-ID or a Dun & Bradstreet DUNS number
contact_email and contact_addressOptionalWho to ask about the file, and the system's business address
versionRequiredWho to ask about the file, and the business address
last_updatedRecommendedWhen the contents last changed, in ISO 8601 UTC, left alone if nothing changed

What does one entry in a buyers.json file tell a seller?

Each entry in the buyers array identifies the legal entity that pays for inventory bought under that buyer_id. The spec says that in most cases a buyer_id should represent only a single legal entity; a managed service desk buying for several clients under one seat must post its own buyers.json and appear as its own node.

Fields in a buyers.json Buyers object, in the specification's terms
FieldRule in the specWhat a reader learns
buyer_idRequired; should match the seat in the OpenRTB bid response and the bsid in the DemandChainThe key that joins the file to live bids
buyer_typeRequired; ADVERTISER, INTERMEDIARY or BOTH, read case insensitivelyWhether the advertiser or an agency or reseller controls the seat
is_confidentialOptional; 0 by default, 1 hides the identityThat a seat exists even when its owner is withheld
name and domainRequired unless confidential; domain is a root domain, never a URLThe legal entity that pays under the ID
commentOptionalWhat a second or third seat for the same buyer is for
created_onRecommended; an ISO 8601 dateSeat age; the spec notes malvertising buyers tend to have a short lifespan

What is the DemandChain object?

The DemandChain Object 1.0 specification (opens in a new tab), or dchain, lets sellers see all parties involved in buying the creative in a given bid response. It sits in BidResponse.seatbid.bid.ext.dchain in OpenRTB 2.5 or later. It is an extension: the OpenRTB 2.6 specification (opens in a new tab) has no native dchain field, only seat, the ID of the buyer seat on whose behalf a bid is made.

The object holds three required attributes. complete is 1 when the chain reaches back to the ultimate source of payment for the creative, and 0 when it does not. nodes lists the parties in order, from the first known payer to the entity sending the response. ver carries "1.0". Each node names asi, the buying system's domain, which should host a buyers.json file, and bsid, which must appear as a buyer_id in that file.

How a DemandChain grows on its way to the seller
How a DemandChain grows on its way to the sellerEach system that passes a bid response along appends its own node. Brand and agency nodes carry a name and domain when they are not programmatic systems. 1. Brand: Ultimate payer, name and domain only. 2. Agency: Node with asi null unless it has a file. 3. DSP: Starts the dchain with asi and bsid. 4. Reselling system: Copies the chain and appends itself. 5. Seller: Checks bsid against buyers.json01BrandUltimate payer,name and domainonly02AgencyNode with asinull unless ithas a file03DSPStarts the dchainwith asi and bsid04ResellingsystemCopies the chainand appendsitself05SellerChecks bsidagainstbuyers.json
How a DemandChain grows on its way to the sellerEach system that passes a bid response along appends its own node. Brand and agency nodes carry a name and domain when they are not programmatic systems. 1. Brand: Ultimate payer, name and domain only. 2. Agency: Node with asi null unless it has a file. 3. DSP: Starts the dchain with asi and bsid. 4. Reselling system: Copies the chain and appends itself. 5. Seller: Checks bsid against buyers.json01BrandUltimate payer, name and domainonly02AgencyNode with asi null unless it hasa file03DSPStarts the dchain with asi andbsid04Reselling systemCopies the chain and appendsitself05SellerChecks bsid against buyers.json
Each system that passes a bid response along appends its own node. Brand and agency nodes carry a name and domain when they are not programmatic systems.

The spec's rules for building a dchain

  1. Start the chain at the first system. The originating system creates a node for itself and sets complete to 1 only if it can name the ultimate payer.
  2. Mark gaps honestly. If payers are known to exist beyond the listed nodes, complete must be 0.
  3. Append, never copy. A system passing a response along keeps the original complete value and adds its node at the end.
  4. Repair broken chains. A response with no dchain, or an invalid one, gets a new object with complete set to 0.

How do buyers.json and sellers.json relate?

In many ways, buyers.json and DemandChain Object can be considered the mirror images of sellers.json and SupplyChain Object, with the goal of providing a similar level of transparency to publishers, just as sellers.json & SupplyChain Object had provided transparency to buyers.

IAB Tech Lab, buyers.json and DemandChain Object page, source (opens in a new tab)
The sell side and buy side transparency pairs, field by field
QuestionSell side answerBuy side answer
Static directorysellers.json, posted by each advertising systembuyers.json, posted by each DSP or buying intermediary
Per transaction recordSupplyChain object in the bid requestDemandChain object in the bid response
Join keyseller_id, equal to the ads.txt account ID and the schain sidbuyer_id, equal to the response seat and the dchain bsid
Role labelsPUBLISHER, INTERMEDIARY or BOTHADVERTISER, INTERMEDIARY or BOTH
Main readerBuyers and DSPs checking who sellsPublishers, SSPs and ad quality teams checking who buys

The pairs share structure but not direction: sellers.json (opens in a new tab) answers who is paid for inventory, buyers.json who pays for the ad. The sellers.json guide and SupplyChain object guide cover the sell side.

Who publishes a buyers.json file?

The implementation guide assigns a job to each kind of participant, following the spec's line that all intermediaries between the buyer and publisher should publish a buyers.json file.

What the IAB Tech Lab implementation guide asks of each participant
ParticipantPublishes buyers.json?Other tasks in the guide
DSP, the first programmatic access pointYes, on its advertising system domainStart dchain in bid responses, expose seat IDs, tag ad markup with the creative source
DSP managed service deskYes, a separate file on a domain for the deskAppear as its own node; the DSP's file points to the desk's seat
SSP or other intermediaryYes, when it acts as a buying intermediaryExtend or start dchain on responses it passes
Agency or holding companyYes, on its corporate domain, listing the brands it representsGive DSPs that domain to put in their files
Brand paying directlyNo specific implementationShare one canonical domain with agencies and DSPs
Publisher or app developerNoTrain ad ops to read the creative source string; push partners to adopt

An agency runs no ad server, so the guide suggests an internal account ID as buyer_id for each brand relationship, and one corporate domain at each DSP. A brand buying for another payer is, in the guide's words, effectively acting as an agency. The buyer seat ID guide and the DSP explainer cover the seat side.

How far has buyers.json and DemandChain adoption gone?

No issuer publishes an adoption rate. IAB Tech Lab's supply chain standards directory (opens in a new tab) still lists the pair at version 1.0, dated June 2021. The Tech Lab blog announcing the 1.0 release (opens in a new tab) named two obstacles: contractual concerns about exposing business relationships, and "a lack of consistency in identifying buyers."

One public trace sits in header bidding. Prebid.js has a Demand Chain Object module (opens in a new tab) that validates dchain data from bidders, rejects invalid objects in its default strict mode, and appends a node for itself. When checked on October 22, 2026, 26 of 796 bidder adapter pages in Prebid's documentation declared dchain support. That counts documentation flags, not live traffic.

What does a buyers.json rollout look like for an agency?

Fictional example

An agency lists a cosmetology school group in Kentucky

An unnamed independent agency in Louisville buys display and online video for an unnamed cosmetology and barbering school group with campuses in Louisville and Lexington, on beauty, career and local news sites. A publisher's ad ops team reports a creative using the school's logo that the agency never trafficked.

The captured creative source string names a DSP domain, a seat and a creative ID. That DSP's buyers.json lists the seat as INTERMEDIARY under a name the agency does not recognize, created two weeks earlier; the agency's own seat is listed separately under its corporate domain.

The agency then publishes its own buyers.json listing the school group as ADVERTISER under an internal account ID, and sends its domain to each DSP it buys through. Sellers can now tell the seats apart.

Buy side transparency checklist for an agency

  • Our corporate domain serves /buyers.json over HTTPS with Content-Type application/json and version "1.0".
  • Each brand has its own buyer_id, legal name, root domain and created_on date.
  • No entry is marked confidential without a written reason we could defend to a seller.
  • Each DSP we buy through has our corporate domain and lists our seat as INTERMEDIARY.
  • Ad ops knows how to read a data-ad-creative-source string and look the seat up in the DSP's buyers.json.

Where does PlacementGraph fit alongside buy side transparency?

buyers.json helps sellers see who buys. A buyer planning a site list still needs the other direction: who sells each site, and how.

Frequently asked questions

Does an agency's buyers.json show which publishers or DSPs it works with?

No. The implementation guide says buyers.json files designate account relationships in the direction of the payer, meaning which agencies or advertisers a system receives demand from. An entry on an agency's file does not represent a relationship with an inventory provider or with a DSP.

What is the data-ad-creative-source string?

It is a comma separated string the DemandChain spec recommends placing in ad markup: version, DSP domain, buyer seat ID and creative ID, for example 1.0,mydsp.example,ac1f9e,89708971. Publisher ad ops staff who capture a problem creative can append /buyers.json to the DSP domain and look up the seat.

How quickly should a buyers.json file change when a new buyer is added?

The implementation guide says the file should be updated whenever buyers that may appear in bid responses are added, and no more than one day thereafter. Hosts should not reuse an old seat ID for a new entity, except for a name change, merger or acquisition.

Does buyers.json name the brand behind an ad?

Not always. A brand appears only if the system or agency lists it, and a seat can be marked confidential. The DemandChain spec lets a confidential entry be disclosed privately through the name and domain fields of a node in individual bid responses, and lets non programmatic payers appear with a name and domain only.

Sources

  1. buyers.json and DemandChain Object (opens in a new tab)IAB Tech Lab
  2. buyers.json Specification Version 1.0 (June 2021) (opens in a new tab)IAB Tech Lab
  3. DemandChain Object Specification Version 1.0 (June 2021) (opens in a new tab)IAB Tech Lab
  4. Implementation Guide for buyers.json and DemandChain Object (June 2021) (opens in a new tab)IAB Tech Lab
  5. The Time for Buy-side Transparency is Now (opens in a new tab)IAB Tech Lab
  6. Supply Chain Foundations standards directory (opens in a new tab)IAB Tech Lab
  7. OpenRTB 2.6 specification, SeatBid object (opens in a new tab)IAB Tech Lab
  8. sellers.json specification (opens in a new tab)IAB Tech Lab
  9. Module: Demand Chain Object (opens in a new tab)Prebid.org
  10. Certified Against Malvertising (opens in a new tab)Trustworthy Accountability Group

Researched and written by PlacementGraph Research. Read how we research, source and update these pages. Corrections: diana@placementgraph.com.

HOW AGENCIES WORK WITH US

From your first brief.
To your next campaign.

Share a brief in plain language. Get contextual websites and YouTube channels that fit it, with the evidence behind every pick and a deal ready for your usual buying platform.

  1. 01

    Share your brief

    The campaign in plain language.

  2. 02

    Get your shortlist

    The strongest contextual sites and channels, with the evidence behind each.

  3. 03

    We build the deal

    Your shortlist becomes a curated deal through our exchange partners.

  4. 04

    Activate and grow

    Buy in your usual platform. Agencies earn benefits as their investment grows.

LET’S WORK TOGETHER

Your next campaign starts here.

Your details will only be used to respond to your enquiry.

Prefer email? diana@placementgraph.com

YOUR PRIVACY

You choose whether to allow optional analytics. You can use the whole website either way.

Change or withdraw consent at any time using “Cookie preferences” in the footer. Turning analytics off stops future collection and removes this site’s analytics cookies; it does not erase information already sent. The page may refresh to apply withdrawal.