# Ad Tech Glossary — full text corpus > Plain-language definitions for the vocabulary of agentic and programmatic advertising. Generated 2026-08-13. 36 documents. --- # AAMP Source: https://adtechglossary.com/concepts/aamp/ AAMP is IAB Tech Lab's umbrella label for nine separately versioned agentic advertising repositories, spanning a control plane, a bidstream mutation framework and an embedding exchange. It has no version: each repository tags independently. AAMP is IAB Tech Lab's umbrella label over nine separately versioned repositories of agentic advertising work. The repositories describe one media transaction carried out machine to machine: a buyer's agent finds a seller, asks what inventory is available (avails), negotiates a quote across several rounds and books the deal. The control plane — everything that happens before a campaign runs: discovery, negotiation and booking — is defined by the wire contract in iab-agentic-primitives and implemented by the reference agents and the OpenDirect wrapper that speak it. ARTF is the bidstream mutation framework, the one part that runs at serve time. agentic-audiences is the embedding exchange. The hub repository, github.com/IABTechLab/AAMP, holds a README and a licence file, and that README carries the release model: "Each repository uses independent semantic versioning." There is no AAMP version number, so a dependency declaration names one repository at a tag and the others move on their own schedule. The hub expands the acronym as Agentic Advertising Management Protocols. Three other expansions appear inside the corpus, including in the wire contract both reference agents import; AAMP Explorer has the file and line for each. Nine repositories carry the label Nine repositories carry the label: the hub, the six the hub lists, and two named only in the code or on the standards page. Supporting AAMP means a different thing in each one. | Repository | What it publishes | What supporting it means | On the hub README? | | ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- | --------------------------------------- | | AAMP | The umbrella README and a licence | Nothing to implement | it is the hub | | iab-agentic-primitives | 48 JSON Schemas and a 13-operation OpenAPI, the wire contract both agents import | Speaking the buyer-to-seller wire contract, at v0.5.0, unreleased | no | | seller-agent | Supply-side reference implementation; 74 OpenAPI paths, 87 operations | Answering for a publisher: avails, quotes, negotiation, booking | yes | | buyer-agent | Demand-side reference implementation, Python | Running the same control plane from the demand side | yes | | agentic-direct | MCP/A2A wrapper over OpenDirect 2.1; handlers call generateMockResponse | Booking against OpenDirect 2.1 over MCP, A2A and REST | yes | | agentic-rtb-framework (ARTF) | The released v1.0 specification and a protobuf contract | Changing a bid at serve time: ARTF v1.0, protobuf, one entry point | yes, under its old name | | agentic-audiences | Draft v0.1 embedding exchange from LiveRamp, filed under specs/v1.0/, where specs/v1.0/schema/agentinterface.schema.json is zero bytes | Exchanging audience embeddings | yes | | registry-agent-example | Example client that registers an agent and verifies it | Registering and verifying an agent against an API with no published specification | yes | | agentic-mobile | spec v1.0.0-draft over MCP and A2A, untagged | Mobile in-app workflows | no, but named on the standards page | ARTF v1.0 was released on 12 November 2025 as a Tech Lab standard, and it is the only ratified standard among the repositories with published code. The rest publish drafts or reference implementations; agentic-direct's MCP handlers call generateMockResponse. No repository records a production adopter. ARTF's contributor list names Index Exchange, The Trade Desk, OpenX and Chalice, and agentic-audiences arrived as LiveRamp's proposal. Those repositories publish 143 operations. One runs at serve time, GetMutations in ARTF; the other 142 sit in the control plane: discovery, avails, quotes, multi-round negotiation and deal booking. AdCP's FAQ characterises AAMP as agentic bidding. The official lists and the code name different repositories The standards page names Agentic Mobile, Agentic Ad Object and Agentic Guardrails. Two of those three have no public repository: IABTechLab/agentic-ad-object and IABTechLab/agentic-guardrails return 404 on GitHub, and neither string appears in the published code. Agentic Mobile is real and public, since 18 November 2025, and the hub README does not mention it. seller-agent/pyproject.toml and buyer-agent/pyproject.toml share a line. Both reference agents hard-pin iab-agentic-primitives at an exact tag, and it appears on neither official list. Its own README states that it is unreleased, unstable and subject to change without notice. The hub README has not been edited since 16 April 2026, and the two agents it lists have since diverged: seller-agent v2.4.1 landed on 5 August, and buyer-agent's newest tag is v2.3.0 from 22 July. The version matrix tracks the drift. The agent registry has no published specification behind it either. Seller-agent v2.4.1 ships two registry clients: AampApiRegistryClient, which talks to a live IAB registry over Bearer JWT when AAMPREGISTRYURL is set, and a legacy stub, "stubbed pending the public AAMP API specification", which is what an unconfigured deployment gets. Terms taken from AAMP — quote, negotiation round, trust status — describe how IAB Tech Lab's own agents behave at a tag, and any of them can change on the next minor without deprecation. AdCP is the other stack rather than a counterpart to the umbrella: one repository, one stable release, 64 registered operations. AAMP is a label over repositories that share no type with each other, so there is nothing to line up at the umbrella level. AdCP's FAQ names AAMP, and no file published under AAMP names AdCP; object by object the comparison is tractable, which is what the terminology lookup does. Repository-by-repository detail is in AAMP Explorer. Related terms: quote, deal, agent registry, OpenDirect 2.1, ARTF intent. --- # Access Tier Source: https://adtechglossary.com/negotiation/access-tier/ Access Tier is AAMP's four-value enum (public, seat, agency, advertiser) that gates what price, negotiation and availability detail a buyer agent gets. It travels as buyer_tier, is capped server-side by the calling agent's trust status, and is never self-asserted. Access Tier is AAMP's four-value string enum for what a buyer agent is allowed to see and pay. On the wire it is buyertier, carried on the Quote, Deal and Negotiation objects and glossed "Access tier for tiered pricing, derived from revealed buyer identity". | Value (schema) | Identity revealed | What the schema says | | -------------- | ----------------------- | ----------------------------------------------- | | public | None | "no identity — price ranges only" | | seat | DSP seat, authenticated | "authenticated DSP (demand-side platform) seat" | | agency | Agency | "agency identity revealed" | | advertiser | Advertiser | "advertiser identity revealed (best rates)" | All three objects declare it identically: {"$ref": "#/$defs/AccessTier", "default": "public"}. A buyer that sends no identity is priced at the public tier rather than rejected. The schema derives the tier from revealed buyer identity. In the reference implementations the seller's API key fixes it instead, and an identity sent in the payload can only confirm what the key already allows. The repository that defines it is unreleased and warns that its schemas will change without notice. There is no canonical AccessTier.json: the same block is copied into five schema files, and the two reference agents no longer derive the tier the same way. Entitlements at each tier Pricing visibility, negotiation and availability detail all move together. The discounts below are the reference seller agent's defaulttiers() fallback, which an operator overrides, rather than a published rate. | Tier | Pricing visibility | Negotiation | Default discount | Avails granularity | | ------------ | -------------------------- | ----------- | ---------------- | ------------------ | | public | Price ranges only | No | 0% | highlevel | | seat | Exact prices, no discounts | Limited | 5% | moderate | | agency | Tier discounts applied | Standard | 10% | detailed | | advertiser | Full discounts plus volume | Premium | 15% | detailed | The reference seller agent also maps the effective tier to a named negotiation strategy, with three hard limits and one behavioural parameter. These are that agent's defaults, not protocol. | Tier | Strategy | Max rounds | Per-round cap | Cumulative cap | Buyer gap share | | ------------ | --------------- | ---------- | ------------- | -------------- | --------------- | | public | aggressive | 3 | 3% | 8% | 30% | | seat | standard | 4 | 4% | 12% | 40% | | agency | collaborative | 5 | 5% | 15% | 50% | | advertiser | premium | 6 | 6% | 20% | 65% | Buyer gap share, gapsplitbuyershare on the wire, rises with the tier: at advertiser the seller expects the buyer to close 65 percent of the remaining gap, alongside the widest concession budget. docs/integration/negotiation.md glosses the field as "How much of the price gap the seller expects the buyer to close (higher = more favorable to seller)". The worked example is on AAMP Explorer; the round record is a Negotiation Round. The tier also controls how much availability detail a caller sees, which the tier documentation does not cover. A public caller is told a product is Available, a seat caller that availability is High, and agency and advertiser callers get numbers: estimatedmonthlyimpressions of 10M-50M, a fillrate of 85-95%. The default rate card sets negotiationenabled=False for public and seat, and the seller's negotiation engine never reads the flag. What sets the tier BuyerIdentity has eleven properties and no required array, so an empty BuyerIdentity {} validates. Only seatid, agencyid and advertiserid change the tier; neither reference implementation branches on dspplatform, advertisername or the campaign fields. A brand buying direct, with no agency and no seat, computes advertiser on its own agent while the seller walks the same identity down to ANONYMOUS and quotes a range. Neither agent raises an error, and the buyer is quoted at the lower tier. The two agents disagree about how many IDs the top tier needs: the seller requires both an advertiser ID and an agency ID, and its identitylevel reaches AGENCYANDADVERTISER only when both are present, while the buyer treats an advertiser ID alone as enough. The buyer's model carries the seller's rule as a comment, # Agency + Advertiser - 15% discount, and does not implement it. The revelation mechanism the buyer's documentation describes is not wired up. toheaderdict() builds X-DSP-Seat-ID, X-Agency-ID and X-Advertiser-ID, no code in the repository calls it, and the seller reads only Authorization and X-Api-Key. docs/api/authentication.md states the arithmetic: "The effective tier is the minimum of the API key tier and the agent trust tier. A preferred agent with a seat-level API key gets seat access." A BuyerIdentity sent afterwards cannot raise the tier above what the key allows. The ceiling side of that minimum is Trust Status. The schema states that the tier is "capped server-side by the registry-verified trust status of the calling agent — it is never self-asserted", over the order public < seat < agency < advertiser. Quotes, deals and negotiation all go through verifiedbuyercontext, which floors the effective tier to public when the claim is unverifiable. One discovery endpoint in the reference seller agent does not apply that cap. POST /media-kit/search bypasses verifiedbuyercontext, builds a buyer context whenever apikeyrecord is not None or request.buyertier != "public", and leaves maxaccesstier unset, so an unauthenticated caller claiming advertiser is answered at that tier: exactprice at the top-tier discount, floorprice, placements, audience segment IDs and negotiationenabled: true. It is a defect in that repository rather than a reading of the schema. Access tier in AdCP AdCP 3.1.13 defines no access tier, and no tier, accesstier, buyertier or accounttier property in dist/schemas/3.1.13/. The relationship is modelled under another name: core/account.json describes "the relationship between a buyer and seller", an account that "determines rate cards, payment terms, and billing entity", and its ratecard is {"type": "string"}, so the rate card is named and its contents are left to the parties. Capability lives in core/account-authorization.json, an allowlist of task names in allowedtasks[] plus fieldscopes and readonly. AdCP's accountscope is also a four-value enum on the buyer relationship — operator, brand, operatorbrand, agent — but its values are categories, not levels, so they do not compose into a ceiling. The rest of that shape difference is in the protocol comparison. --- # Signal Activation Source: https://adtechglossary.com/signals/activation/ Signal activation is the AdCP call that makes a discovered signal usable on a named destination, taking a segment handle and a list of destinations and returning an activation key once the deployment is live. Signal activation is the AdCP call that makes a discovered signal usable on a named destination. AdCP's glossary puts it as "the process of making a signal available for targeting on a specific platform and seat". The Signals area has two operations: getsignals reports that a signal exists and returns a handle, and activatesignal turns that handle into something a DSP will accept. Destination, Deployment, and the activation key Destination and Deployment are discriminated unions on type with the same two branches: a platform names a DSP by string identifier (the-trade-desk, amazon-dsp), an agent names one by URL. Deployment adds islive, activationkey, estimatedactivationdurationminutes and deployedat. All four — both Destination branches and both Deployment branches — allow additional properties. activation-key.json calls the key a "universal identifier for using a signal on a destination platform", arriving as type: segmentid or type: keyvalue, because AdCP does not normalise how platforms express targeting. The visibility rule sits on both Deployment branches: "The key to use for targeting. Only present if islive=true AND requester has access to this deployment." The field is simply absent, so the caller cannot distinguish "not live yet" from "not yours". estimatedactivationdurationminutes is the only clock the protocol offers, and activation is asynchronous rather than immediate: the glossary's "Estimated Activation Time" entry describes "typically 24-48 hours for new activations", which is 1,440 to 2,880 in the field's unit. Deployments also arrive with neither a key nor an estimate, and the schema says nothing about the interval there. What an activatesignal request requires activate-signal-request.json lists exactly ["idempotencykey", "signalagentsegmentid", "destinations"] in required. Two further fields are required by conditions written in field descriptions that nothing in the file can check: no if/then, no dependentRequired, and the only oneOf is the version envelope the request inherits. | Tier | Fields | | ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | | Enforced by required[] | idempotencykey, signalagentsegmentid, destinations (minItems: 1) | | Required by a sentence, unenforceable | pricingoptionid, when the signal has pricing options; governancecontext, when the account has a registered governance agent | That leaves action, account, context and ext optional. action defaults to activate. Its other value, deactivate, exists because ending a campaign requires the segment to be torn down: the schema gives the reason as "required when campaigns end to comply with data governance policies (GDPR, CCPA)". Both conditional fields are stated in prose and enforced nowhere. governancecontext carries the description "signal agents MUST reject governed activations that omit a valid context", and pricingoptionid is required when the getsignals response carried pricingoptions "when it has an incremental price"; in both cases the request schema constrains the value once it appears and says nothing about whether it was sent. Omitted on a priced signal, the seller has to catch it, with INVALIDPRICINGMODEL per the task page, a code that is not in the released enum. Reusing one idempotencykey across two sellers hands both of them a join key, so the schema requires it to be unique per (seller, request) pair "to prevent cross-seller correlation". Partial failure activate-signal-response.json: "Returns either complete success data OR error information, never both. This enforces atomic operation semantics - the signal is either fully activated or not activated at all." The oneOf enforces it: the success branch requires deployments and adds not: {required: ["errors"]}, the error branch requires errors with minItems: 1 and excludes both deployments and sandbox. A payload carrying both matches neither branch. Only one destination per call keeps the error branch usable. A call with three destinations and one hard failure has no representation: reporting the failure loses the two successes, and reporting the successes leaves the failure with no reason attached. The only way out is islive: false on the failed deployment inside a success response, which carries no error code and no recovery classification, and core/error.json has no destination pointer to scope an error to one entry of destinations[]. Documentation and schema divergence docs/signals/tasks/activatesignal.mdx describes the operation in terms the released schemas do not support. It reads as though five fields are required where required[] names three. Its "Response Data" section shows one object carrying both deployments[] and errors[], and its "Error Handling Philosophy" says a signal "can be deployed while still having warnings in errors array", where the oneOf forbids both shapes; only its