IAB Tech Lab · Schema
Deal
A confirmed deal booked from a quote (Deals API v1.0 book phase). ID minting: ``deal_id`` is seller-issued.
CompanyAdvertisingAdTechStandardsProgrammaticReal-Time BiddingConsentPrivacyVideo AdsAgentic AdvertisingNon-Profit
Properties
| Name | Type | Description |
|---|---|---|
| activation_instructions | object | |
| buyer_tier | object | |
| consent_context | object | Privacy consent signals riding with the deal (FD-10). |
| created_at | string | |
| deal_id | string | Seller-issued deal identifier. |
| deal_type | object | |
| expires_at | object | Acceptance window for a proposed deal. |
| linear_tv | object | Linear TV details carried over from the booked quote (FD-6). |
| media_type | object | |
| openrtb_params | object | |
| pricing | object | |
| product | object | |
| quote_id | object | Seller-issued id of the quote this deal booked. |
| rate_card_id | object | Seller-issued id of the private rate card this deal books against, when the pair has one (FD-9). Never embedded, only referenced. |
| seller_id | object | Registry-issued id of the selling agent. |
| status | object | |
| supply_chain | object | OpenRTB supply chain (schain) for transparency (EP-10.3); optional so pre-schain deals still validate. |
| terms | object |
JSON Schema
{
"$defs": {
"AccessTier": {
"description": "Access tier for tiered pricing, derived from revealed buyer identity.\n\n- ``public``: no identity \u2014 price ranges only\n- ``seat``: authenticated DSP (demand-side platform) seat\n- ``agency``: agency identity revealed\n- ``advertiser``: advertiser identity revealed (best rates)",
"enum": [
"public",
"seat",
"agency",
"advertiser"
],
"title": "AccessTier",
"type": "string"
},
"CancellationTerms": {
"description": "Structured cancellation window for linear TV deals.",
"properties": {
"cancellable_pct": {
"description": "Portion of the deal that can be cancelled (0.0-1.0).",
"maximum": 1.0,
"minimum": 0.0,
"title": "Cancellable Pct",
"type": "number"
},
"deadline": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Absolute deadline for cancellation.",
"title": "Deadline"
},
"force_majeure": {
"default": true,
"description": "Whether force majeure exceptions apply.",
"title": "Force Majeure",
"type": "boolean"
},
"notice_days": {
"description": "Days of notice required before cancellation.",
"title": "Notice Days",
"type": "integer"
}
},
"required": [
"notice_days",
"cancellable_pct"
],
"title": "CancellationTerms",
"type": "object"
},
"ConsentContext": {
"description": "Privacy consent signals that travel with a deal (flagged decision FD-10).\n\nFull build-out (EP-10.4) of the EP-1.2 placeholder: the three\ninteroperable consent-string carriers \u2014 GPP (Global Privacy Platform)\nwith its applicable section ids, TCF (Transparency & Consent Framework)\nwith the ``gdpr_applies`` gate, and the US Privacy (``us_privacy``)\nstring \u2014 plus the SGP (SafeGuard Privacy / IAB Diligence Platform)\n``diligence_status``. Field names from the EP-1.2 placeholder are kept\nunchanged for backward compatibility; the build-out is purely additive.\nIt travels with the Deal, Quote, and Order. Strings are carried opaque:\nno decoding/vendor-list validation is claimed (see the conformance\nstandards registry).",
"properties": {
"applicable_regimes": {
"description": "Privacy regime identifiers in scope (e.g. 'GDPR', 'CCPA').",
"items": {
"type": "string"
},
"title": "Applicable Regimes",
"type": "array"
},
"diligence_status": {
"$ref": "#/$defs/DiligenceStatus",
"default": "unknown",
"description": "Counterparty diligence status (SGP = SafeGuard Privacy / IAB Diligence Platform)."
},
"gdpr_applies": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "null"
}
],
"default": null,
"description": "Whether GDPR (EU General Data Protection Regulation) applies to this context; None when undetermined. Gates interpretation of the TCF string.",
"title": "Gdpr Applies"
},
"gpp_section_ids": {
"description": "GPP section ids present in the string.",
"items": {
"type": "integer"
},
"title": "Gpp Section Ids",
"type": "array"
},
"gpp_string": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "GPP (Global Privacy Platform) consent string.",
"title": "Gpp String"
},
"tcf_string": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "TCF (Transparency & Consent Framework) TC string, when GDPR applies.",
"title": "Tcf String"
},
"us_privacy": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "US Privacy (CCPA) string, e.g. '1YNN'; superseded by GPP where present.",
"title": "Us Privacy"
},
"verified_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Timezone-aware timestamp of the last diligence verification, if any.",
"title": "Verified At"
}
},
"title": "ConsentContext",
"type": "object"
},
"DealStatus": {
"description": "ONE deal status vocabulary, unioned from the four competing sets.\n\nSources: buyer ``DealResponse.status`` (proposed/active/rejected/\nexpired/completed), seller ``DealBookingStatus`` (proposed/active/\nexpired/cancelled), buyer ``BuyerDealStatus`` (quoted/negotiating/\naccepted/booking/booked/delivering/... + linear TV extensions).\n\nRecorded aliases (retired values, NOT valid on the wire):\n``delivering`` -> ``active``; ``booking`` -> ``booked``;\n``quoted`` -> represented by QuoteStatus, not a deal state;\n``partially_canceled`` -> ``partially_cancelled``.",
"enum": [
"proposed",
"negotiating",
"accepted",
"booked",
"active",
"makegood_pending",
"partially_cancelled",
"completed",
"rejected",
"failed",
"cancelled",
"expired"
],
"title": "DealStatus",
"type": "string"
},
"DealType": {
"description": "Programmatic deal types. The short wire encoding is canonical.\n\n- ``PG`` = Programmatic Guaranteed: fixed price, guaranteed impressions\n- ``PD`` = Preferred Deal: fixed price, non-guaranteed first look\n- ``PA`` = Private Auction: auction with floor price, invited buyers\n\nMapping from the seller repo's retired long-form encoding\n(``models/core.py``): ``programmaticguaranteed`` -> ``PG``,\n``preferreddeal`` -> ``PD``, ``privateauction`` -> ``PA``. The\nlong-form strings are NOT valid wire values.",
"enum": [
"PG",
"PD",
"PA"
],
"title": "DealType",
"type": "string"
},
"DiligenceStatus": {
"description": "Status of counterparty privacy diligence (IAB Diligence Platform).",
"enum": [
"unknown",
"pending",
"passed",
"failed"
],
"title": "DiligenceStatus",
"type": "string"
},
"LinearTVQuoteDetails": {
"description": "Linear-TV-specific quote details (seller-populated).\n\nNested under ``Quote.linear_tv`` when ``media_type == \"linear_tv\"``.",
"properties": {
"audience_estimate": {
"additionalProperties": true,
"description": "Audience estimates; expected keys \"demo\", \"universe\", \"impressions_equiv\".",
"title": "Audience Estimate",
"type": "object"
},
"cancellation_terms": {
"anyOf": [
{
"$ref": "#/$defs/CancellationTerms"
},
{
"type": "null"
}
],
"default": null
},
"cpp": {
"$ref": "#/$defs/Money",
"description": "CPP (cost per point) offered by the seller."
},
"dayparts": {
"items": {
"type": "string"
},
"title": "Dayparts",
"type": "array"
},
"estimated_grps": {
"description": "Estimated GRPs (gross rating points).",
"title": "Estimated Grps",
"type": "number"
},
"estimated_rating": {
"title": "Estimated Rating",
"type": "number"
},
"makegood_policy": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Makegood policy: \"standard\" (audience deficiency unit), \"negotiated\", or \"none\".",
"title": "Makegood Policy"
},
"measurement_currency": {
"title": "Measurement Currency",
"type": "string"
},
"networks": {
"items": {
"type": "string"
},
"title": "Networks",
"type": "array"
},
"spot_length": {
"title": "Spot Length",
"type": "integer"
},
"spots_per_week": {
"title": "Spots Per Week",
"type": "integer"
},
"target_demo": {
"title": "Target Demo",
"type": "string"
},
"total_spots": {
"title": "Total Spots",
"type": "integer"
}
},
"required": [
"target_demo",
"estimated_grps",
"estimated_rating",
"cpp",
"dayparts",
"networks",
"spots_per_week",
"total_spots",
"spot_length",
"measurement_currency"
],
"title": "LinearTVQuoteDetails",
"type": "object"
},
"MediaType": {
"description": "Media type discriminator carried on quotes and deals.\n\nSellers that do not support ``linear_tv`` MUST return a structured\nrejection rather than silently mispricing (flagged decision FD-6);\nthe field exists on the shared schema so that rejection can be\nstructural.",
"enum": [
"digital",
"ctv",
"linear_tv"
],
"title": "MediaType",
"type": "string"
},
"Money": {
"description": "Exact money amount in integer micros (flagged decision FD-11).\n\n``1_000_000`` micros = 1 currency unit \u2014 the ad-industry convention\n(Google Ad Manager, among others, prices in micros). Float is BANNED on\nthe wire for money: IEEE 754 floating point is non-deterministic for\nmoney math (``0.1 + 0.2 != 0.3``, and repeated CPM \u2014 cost per mille \u2014\narithmetic accumulates error), and the two source repos used ``float``\nend-to-end; that defect must not be fossilized into the spec. Every\nprice, rate, budget, and offer in the shared contract is a ``Money``.\n\n``amount_micros`` is a strict integer: float inputs are rejected at\nvalidation time rather than silently truncated.",
"properties": {
"amount_micros": {
"description": "Amount in micros; 1,000,000 micros = 1 currency unit.",
"title": "Amount Micros",
"type": "integer"
},
"currency": {
"default": "USD",
"description": "ISO 4217 alpha-3 currency code.",
"pattern": "^[A-Z]{3}$",
"title": "Currency",
"type": "string"
}
},
"required": [
"amount_micros"
],
"title": "Money",
"type": "object"
},
"OpenRTBParams": {
"description": "OpenRTB (Open Real-Time Bidding) deal parameters for DSP\n(demand-side platform) activation.",
"properties": {
"at": {
"default": 3,
"description": "Auction type (3 = fixed price).",
"title": "At",
"type": "integer"
},
"bidfloor": {
"$ref": "#/$defs/Money",
"description": "Bid floor (exact micros; FD-11). Adapters translate to the raw OpenRTB float `bidfloor`/`bidfloorcur` encoding at the DSP edge."
},
"id": {
"description": "Deal id as it appears in the OpenRTB bid stream.",
"title": "Id",
"type": "string"
},
"wadomain": {
"description": "Allowed advertiser domains.",
"items": {
"type": "string"
},
"title": "Wadomain",
"type": "array"
},
"wseat": {
"description": "Allowed buyer seats.",
"items": {
"type": "string"
},
"title": "Wseat",
"type": "array"
}
},
"required": [
"id",
"bidfloor"
],
"title": "OpenRTBParams",
"type": "object"
},
"PricingModel": {
"description": "Unit of pricing. Union of the buyer's ``RateType`` and the seller's\n``PricingModel`` plus the linear TV additions.\n\n- ``cpm``: cost per mille (thousand impressions)\n- ``cpmv``: cost per thousand viewable impressions\n- ``cpv``: cost per view\n- ``cpc``: cost per click\n- ``cpcv``: cost per completed view\n- ``cpd``: cost per day\n- ``cpp``: cost per (gross rating) point \u2014 linear TV\n- ``flat_fee``: flat fee (buyer repo's ``FlatRate`` maps here)\n- ``unit_rate``: per-unit rate\n- ``hybrid``: mixed CPM/CPP pricing \u2014 linear TV",
"enum": [
"cpm",
"cpmv",
"cpv",
"cpc",
"cpcv",
"cpd",
"cpp",
"flat_fee",
"unit_rate",
"hybrid"
],
"title": "PricingModel",
"type": "string"
},
"PricingType": {
"description": "How a price signal should be interpreted.\n\n- ``fixed``: price is set by the seller, use as-is\n- ``floor``: minimum price; negotiation expected above this level\n- ``on_request``: no price available; buyer must negotiate before any\n pricing exists (pricing fields are None \u2014 buyers must never fabricate\n a price for on_request inventory)",
"enum": [
"fixed",
"floor",
"on_request"
],
"title": "PricingType",
"type": "string"
},
"ProductRef": {
"description": "Lightweight product summary embedded in quotes and deals.",
"properties": {
"inventory_type": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Inventory Type"
},
"name": {
"title": "Name",
"type": "string"
},
"product_id": {
"description": "Seller-issued product identifier.",
"title": "Product Id",
"type": "string"
}
},
"required": [
"product_id",
"name"
],
"title": "ProductRef",
"type": "object"
},
"QuotePricing": {
"description": "Pricing breakdown on a quote or deal.\n\n``base_cpm``/``final_cpm`` are optional to support\n``pricing_type=on_request`` \u2014 when the seller has not provided pricing,\nthese fields are None. CPM = cost per mille (thousand impressions);\nCPP = cost per point (linear TV).",
"properties": {
"base_cpm": {
"anyOf": [
{
"$ref": "#/$defs/Money"
},
{
"type": "null"
}
],
"default": null
},
"base_cpp": {
"anyOf": [
{
"$ref": "#/$defs/Money"
},
{
"type": "null"
}
],
"default": null,
"description": "Linear TV base CPP; None for digital/CTV."
},
"final_cpm": {
"anyOf": [
{
"$ref": "#/$defs/Money"
},
{
"type": "null"
}
],
"default": null
},
"final_cpp": {
"anyOf": [
{
"$ref": "#/$defs/Money"
},
{
"type": "null"
}
],
"default": null,
"description": "Linear TV final CPP; None for digital/CTV."
},
"pricing_model": {
"$ref": "#/$defs/PricingModel",
"default": "cpm"
},
"pricing_type": {
"$ref": "#/$defs/PricingType",
"default": "fixed"
},
"rationale": {
"default": "",
"title": "Rationale",
"type": "string"
},
"tier_discount_pct": {
"default": 0.0,
"title": "Tier Discount Pct",
"type": "number"
},
"volume_discount_pct": {
"default": 0.0,
"title": "Volume Discount Pct",
"type": "number"
}
},
"title": "QuotePricing",
"type": "object"
},
"QuoteTerms": {
"description": "Volume, flight, and guarantee terms on a quote or deal.",
"properties": {
"flight_end": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Flight End"
},
"flight_start": {
"anyOf": [
{
"format": "date",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"title": "Flight Start"
},
"grps": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"description": "Linear TV volume in GRPs (gross rating points).",
"title": "Grps"
},
"guaranteed": {
"default": false,
"title": "Guaranteed",
"type": "boolean"
},
"guaranteed_grps": {
"anyOf": [
{
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Guaranteed Grps"
},
"impressions": {
"anyOf": [
{
"minimum": 0,
"type": "integer"
},
{
"type": "null"
}
],
"default": null,
"title": "Impressions"
},
"target_demo": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Linear TV target demographic.",
"title": "Target Demo"
}
},
"title": "QuoteTerms",
"type": "object"
},
"SupplyChain": {
"description": "OpenRTB SupplyChain object (``schain``): the ordered node path.\n\n``complete`` is the OpenRTB 0/1 flag: 1 means every node from the\ninitial impression to the final bidder is present (no undisclosed\nhops). Nodes are ordered from the first seller to the entity making the\nrequest. Carried optionally on the :class:`Deal` for transparency.",
"properties": {
"complete": {
"default": 1,
"description": "OpenRTB 0/1: 1 = all nodes in the path are disclosed.",
"maximum": 1,
"minimum": 0,
"title": "Complete",
"type": "integer"
},
"ext": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Extension slot.",
"title": "Ext"
},
"nodes": {
"description": "Supply path, ordered first-seller -> requesting-entity.",
"items": {
"$ref": "#/$defs/SupplyChainNode"
},
"title": "Nodes",
"type": "array"
},
"ver": {
"default": "1.0",
"description": "SupplyChain object version (OpenRTB ``ver``).",
"title": "Ver",
"type": "string"
}
},
"title": "SupplyChain",
"type": "object"
},
"SupplyChainNode": {
"description": "One hop in the OpenRTB supply chain (``schain`` node).\n\nField names are the OpenRTB SupplyChainNode names verbatim. ``asi`` is\nthe advertising system identifier (the canonical domain of the system\nthe node operates in, e.g. ``\"exchange.example.com\"``); ``sid`` is the\nseller id **within that system** and matches a ``seller_id`` in that\nsystem's sellers.json.",
"properties": {
"asi": {
"description": "Advertising system identifier (canonical domain of the system).",
"title": "Asi",
"type": "string"
},
"domain": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Business domain of the entity represented by this node.",
"title": "Domain"
},
"ext": {
"anyOf": [
{
"additionalProperties": true,
"type": "object"
},
{
"type": "null"
}
],
"default": null,
"description": "Extension slot.",
"title": "Ext"
},
"hp": {
"default": 1,
"description": "Handled-payment flag (OpenRTB 0/1): 1 = node is paid for this inventory.",
"maximum": 1,
"minimum": 0,
"title": "Hp",
"type": "integer"
},
"name": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Business name of the entity represented by this node.",
"title": "Name"
},
"rid": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Request id issued by the seller (OpenRTB ``rid``), when present.",
"title": "Rid"
},
"sid": {
"description": "Seller id within the ``asi`` system; matches its sellers.json seller_id.",
"title": "Sid",
"type": "string"
}
},
"required": [
"asi",
"sid"
],
"title": "SupplyChainNode",
"type": "object"
}
},
"description": "A confirmed deal booked from a quote (Deals API v1.0 book phase).\n\nID minting: ``deal_id`` is seller-issued.",
"properties": {
"activation_instructions": {
"additionalProperties": {
"type": "string"
},
"title": "Activation Instructions",
"type": "object"
},
"buyer_tier": {
"$ref": "#/$defs/AccessTier",
"default": "public"
},
"consent_context": {
"anyOf": [
{
"$ref": "#/$defs/ConsentContext"
},
{
"type": "null"
}
],
"default": null,
"description": "Privacy consent signals riding with the deal (FD-10)."
},
"created_at": {
"format": "date-time",
"title": "Created At",
"type": "string"
},
"deal_id": {
"description": "Seller-issued deal identifier.",
"title": "Deal Id",
"type": "string"
},
"deal_type": {
"$ref": "#/$defs/DealType"
},
"expires_at": {
"anyOf": [
{
"format": "date-time",
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Acceptance window for a proposed deal.",
"title": "Expires At"
},
"linear_tv": {
"anyOf": [
{
"$ref": "#/$defs/LinearTVQuoteDetails"
},
{
"type": "null"
}
],
"default": null,
"description": "Linear TV details carried over from the booked quote (FD-6)."
},
"media_type": {
"$ref": "#/$defs/MediaType",
"default": "digital"
},
"openrtb_params": {
"anyOf": [
{
"$ref": "#/$defs/OpenRTBParams"
},
{
"type": "null"
}
],
"default": null
},
"pricing": {
"$ref": "#/$defs/QuotePricing"
},
"product": {
"$ref": "#/$defs/ProductRef"
},
"quote_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Seller-issued id of the quote this deal booked.",
"title": "Quote Id"
},
"rate_card_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Seller-issued id of the private rate card this deal books against, when the pair has one (FD-9). Never embedded, only referenced.",
"title": "Rate Card Id"
},
"seller_id": {
"anyOf": [
{
"type": "string"
},
{
"type": "null"
}
],
"default": null,
"description": "Registry-issued id of the selling agent.",
"title": "Seller Id"
},
"status": {
"$ref": "#/$defs/DealStatus",
"default": "proposed"
},
"supply_chain": {
"anyOf": [
{
"$ref": "#/$defs/SupplyChain"
},
{
"type": "null"
}
],
"default": null,
"description": "OpenRTB supply chain (schain) for transparency (EP-10.3); optional so pre-schain deals still validate."
},
"terms": {
"$ref": "#/$defs/QuoteTerms"
}
},
"required": [
"deal_id",
"deal_type",
"product",
"pricing",
"terms"
],
"title": "Deal",
"type": "object"
}
Work with this as data
Every JSON Schema here is available over the APIs.io API and to AI agents over MCP.
MCP server
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
Tools for schemas
4 MCP tools reach this
find_json_schemasBrowse and filter every JSON Schema in the catalog.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.
Call it yourself
curl for this page
This JSON Schema
curl "https://apis.io/api/v1/json-schemas/iab-tech-lab-agentic-primitive-deal"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Get an API key
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.