Repository navigation
Description
What kind of change?
Add a new field
Which section?
5.3 — Audience reach
Current text
| `buyer_supplied` | Object | supplied | `{ segments_allowed, suppression_allowed, match_rate_expected, segments[], suppression_list }`. `match_rate_expected` is the seller's stated expectation; `segments[]` and `suppression_list` are buyer-populated |Proposed text
"buyer_supplied": {
"segments_allowed": true,
"suppression_allowed": true,
"match_rate_expected": 0.65,
"segments": [],
"suppression_list": [],
"diligence_ref": {
"type": "audience_diligence",
"issuer": "diligence.example",
"ref": "12345@2",
"digest": "sha256:..."
}
}Why
Issue #108 rightly addresses the mechanics of the data-sharing handoff (how data moves via S3, Snowflake, clean rooms, etc.). However, the current OpenProposal object model describes the transport without capturing the authorization or attestation that must logically precede it.
In an agentic workflow, a seller's automated compliance agents cannot safely execute a match count or a data ingestion without verifying that the buyer agent is authorized to provide those segments. While AAMP 2.3 integrated the IAB Diligence Platform into the execution layer, OpenProposal (§ 5.3) lacks a mechanism for the buyer to assert this diligence at the proposal stage.
This proposal is not asking OpenProposal to define privacy semantics, consent frameworks (TCF/GPP), or data lineage standards. It is simply asking the protocol to provide a standardized "trust boundary" pointer (diligence_ref).
If the spec lacks an attestation model, the RFP workflow becomes a compliance bottleneck. A buyer agent might optimize for reach/CPM and commit to an RFP, only for the seller to reject the subsequent data handoff because the buyer cannot attest to the provenance of the audience. Providing a generic attestation reference ensures:
Lineage and Trust: The agreed proposal object becomes a self-contained record that the buyer asserted the right to transact.
Protocol Extensibility: Today this pointer references audience diligence; tomorrow it could reference healthcare certification (HCP scenarios), geographic data residency requirements, or political advertising approvals.
Scope Preservation: It preserves flexibility and interoperability without forcing the OpenProposal WG to become a privacy standard-setting body.
diligence_ref (optional, string): A reference to external diligence, consent, or audience provenance documentation maintained outside OpenProposal. This serves as a machine-readable attestation by the buyer agent that prerequisite conditions for the requested data handoff (as configured via activation_route or Issue #108 mechanisms) have been satisfied.
Knock-on effects
-
Downstream Standards (OpenDirect / Deals API): Binding diligence_ref into the resulting Deal object — so that the execution layer inherits the trust boundary established at the proposal stage — is the desired end state, but it is out of scope for this change request. It will require a corresponding change request to OpenDirect (and, where relevant, the Deals API), covering the contract generation phase and the Deal object's field surface. This issue flags that knock-on effect rather than asserting it. Until such a change lands, OpenProposal's guarantee is limited to preserving the attestation in the agreed proposal record, where it remains available for out-of-band diligence and audit.
-
OpenRTB 2.6: At the bid-request level, OpenRTB does not need to carry the
diligence_refdirectly. Thedeal.idin the OpenRTB request implicitly resolves back to the OpenProposal object where the attestation lives, maintaining separation between commercial discovery (OpenProposal) and transactional execution (OpenRTB). -
Examples in § 6: The HCP (healthcare) and clean-room examples from Issue [Comment] § 5.3 — Buyer-supplied audience match: reachable count, avails, and data-sharing handoff #108 would simply include
"diligence_ref": "uri:iab-diligence:12345"to demonstrate how a buyer agent signals compliance before the seller agent executes the match. -
"Resolves without a round trip" guarantee (§ 3): Because this is an optional string reference (URI/ID) rather than a nested object requiring recursive validation, it preserves the lightweight parsing guarantees of the spec. The actual resolution of the diligence assertion happens asynchronously out-of-band, mirroring how
catalog_refresolutions are handled. -
No-inheritance rule: The
diligence_refremains strictly scoped to thebuyer_suppliedobject. It asserts authority over the buyer's inputs (segments/suppressions) and does not inappropriately inherit into the seller's catalog, pricing, or environments.
Would this break an implementation already built to this draft?
No — additive or editorial
Alternatives you considered and rejected
1. Embedding the full privacy/consent payload (e.g., full TCF string, SafeGuard object) directly in the proposal:
Rejected: This bloats the proposal object massively and violates the separation of concerns. A proposal should remain a lightweight commercial menu. Embedding nested consent graphs would break the lightweight parsing guarantees of the spec.
2. Handling diligence strictly out-of-band with no machine-readable footprint in the proposal:
Rejected: While the actual data lives out-of-band, the assertion of authority must be machine-readable for agentic workflows. If buyer and seller agents negotiate at machine speed, a lack of a machine-readable signal forces agents to blindly attempt data matches, resulting in automated compliance failures, wasted compute, and broken execution SLAs. The protocol needs a machine-readable trust boundary.
3. Defining normative privacy semantics within OpenProposal (e.g., adding hipaa_compliant or gdpr_tcf booleans/fields):
Rejected: Scope creep. OpenProposal is a commercial protocol, not a privacy standard. Hardcoding regulatory frameworks (GDPR, CCPA, PIPL) into the object model would make the spec brittle to future legal changes. A generic pointer (diligence_ref) future-proofs the protocol against regulatory evolution.
You are commenting as
Individual, no organisational position
Before you submit
- I have read CONTRIBUTING.md and agree my contribution may be published under this repository's licence.
- This contains no confidential or commercially sensitive information.
Activity
peterduhon commentedon Oct 24, 2026
Editorial revision to the Knock-on effects section: the OpenDirect bullet now flags the binding of diligence_ref into Deal contract generation as requiring a companion change request to OpenDirect, rather than asserting it as part of this proposal. No change to the proposed § 5.3 normative text.
KonstantinMirin commentedon Oct 25, 2026
Thank you, @peterduhon. Postindustria (IAB Tech Lab member) supports a provenance reference. As proposed,
diligence_refis a string the buyer agent writes, with no issuer or signature to check: a claim, not an attestation. We ask for an opaque reference inbuyer_supplied(§ 5.3):typeis an open vocabulary: a core list plus domain-namespaced terms. Your healthcare, data-residency, and political-advertising cases then need no spec revision.issueris thehttpsorigin of the party that did the diligence and signs the record.refidentifies that record at the issuer.The proposal carries the reference, and its meaning stays with the issuer. Nothing resolves while parsing. Our AAMP identity proposal (AAMP #3) applies the same principle to agents: "A signature proves the signer, never the authority."
Our binding-record change request (#63) already keeps every
buyer_suppliedfield exceptmatch_rate_expectedunderrecord_digest, so both assents name the reference.Open questions:
Analyzed and generated with the help of Claude, fully reviewed by me.
peterduhon commentedon Nov 10, 2026
Accepted. The issuer anchored shape is a superior design, and your framing names the flaw precisely. A bare string lets the buyer assert, while the structured reference lets the seller see who stands behind the claim before deciding whether and how to verify it. I am updating the proposed text below.
Two alignment notes with the existing object model, then answers to your open questions.
Alignment. Using an https origin for the
issuermatches the semantics already used byrequired_credentials[].issuerin § 5.8. This maintains one concept of issuer across the spec. Furthermore, the namespaced open vocabulary fortypefollows the same pattern as thecatalog_refand channel namespaced format identifiers. Core terms cover common cases, while domain terms extend without requiring a spec revision. This lands the extensibility case from the original proposal much more cleanly.On Q1. Who issues a diligence record a seller can verify. Issuance should follow the authority chain of the data. For first party segments, the authority is the compliance function of the buyer. The buyer issues the record, and trusting it becomes a policy decision for the seller against a named origin. For third party segments, the natural issuer is the provider that granted transmission rights in the first place, since the diligence question of whether the buyer may hand these segments to the seller is ultimately for the provider to answer. Neutral venues like clean rooms can also issue records where both parties already trust the operator. I would not have OpenProposal enumerate or prefer any of these. The spec simply requires a resolvable origin and nothing more. Per your AAMP #3 principle, the signature proves the signer. Whether the authority of the signer matters is strictly a policy decision for the counterparty. Verification semantics belong in the identity workstream, not the proposal object.
On Q2. A digest of the signed record. Yes, but it should be optional and recommended rather than strictly required, because it supplies the content pinning this reference otherwise lacks. Without it, the reference simply points at a live document. The issuer can reissue, rescope, or supersede after agreement, and the meaning of the committed artifact silently drifts. That is the exact hazard that the version pinning in § 2.2 exists to prevent for
catalog_ref. A diligence record is a fact about a specific moment in time, just like a catalog entry. A digest object containing the algorithm and value binds the assents to what was attested rather than merely where it lives. Given that #63 already placesbuyer_suppliedfields underrecord_digest, the structural reference is named by both assents, and the digest extends that binding to the external record itself. Where an issuer does not sign, a version suffixed reference is the fallback. Algorithm choice should follow the scheme of the issuer rather than the spec.Consolidated proposed text for § 5.3 in the
buyer_suppliedobject:typeis an open vocabulary with a core list plus domain namespaced terms.issueris the https origin of the party that performed the diligence and signs the record, using origin semantics consistent with § 5.8.refidentifies the record at the issuer and is version suffixed where the issuer versions records.digestis optional and recommended, binding assent to content rather than location.Nothing resolves while parsing (§ 3). The reference remains opaque to OpenProposal and freezes into the committed artifact at
agreed. The alternatives rejected section of the original issue stands unchanged, as issuer anchoring strengthens the scope preservation argument rather than altering it.KonstantinMirin commentedon Nov 11, 2026
Thanks, @peterduhon. Three details against our open PRs. The second changes my own example.
Digeststring,sha256:and 64 hexadecimal characters, so the value carries the algorithm, andsha256is the only one in this version (§ 2.2). For one form of digest across the specification,digestwould be"sha256:…", not an{ alg, value }object.required_credentials[].issueris aDomain(§ 5.8), and § 2.8, § 4.1.1, § 4.1.2, § 5.6.1 — Signing: what is signed, and how a seller checks it (#63) #142 names an identity by its host, such asbuyer.example, nothttps://buyer.example(§ 2.8.1). For one form of issuer across the specification,issuerwould bediligence.example.buyer_supplied.segmentsandsuppression_listout of the binding record, as deliveries (§ 4.1.1), so my earlier line overstated it. A newdiligence_refwould stay in the record, since only the listed paths leave it, so both assents still name it.Analyzed and generated with the help of Claude, fully reviewed by me.
[-][Question] § 5.3 — Machine-readable attestations for buyer_supplied data provenance and diligence[/-][+][Change] § 5.3 — Machine-readable attestations for buyer_supplied data provenance and diligence[/+]peterduhon commentedon Nov 11, 2026
@KonstantinMirin
KonstantinMirin commentedon Nov 12, 2026
Thanks, @peterduhon. One naming detail against #137: it reserves the suffix
_reffor aDocumentRefor anEntryRef(§ 2.6), so an object with your four keys needs a name without it, such asdiligence. My earlier example used that name too. To keepdiligence_ref, it could be oneEntryRefstring (§ 2.2),"diligence.example/audience_diligence/12345@2", when the issuer versions its records, withtypeas its ownVocabularyTermkey. AnEntryRefcarries no digest, so that pin is #129's question.Analyzed and generated with the help of Claude, fully reviewed by me.