Skip to content

Commit ee818ff

Browse files
Merge branch 'master' into add-permutive-consent-changes
2 parents f3f5e6b + 3e340fb commit ee818ff

15 files changed

Lines changed: 770 additions & 123 deletions

File tree

_data/sidebar.yml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,3 +2042,32 @@
20422042
isSectionHeader: 0
20432043
sectionTitle:
20442044
subgroup: 0
2045+
2046+
#-------------- Prebid Agents --------------|
2047+
2048+
- sbSecId: 10
2049+
title:
2050+
link:
2051+
isHeader: 0
2052+
isSectionHeader: 1
2053+
sectionTitle: Prebid Agents
2054+
sectionId: prebid-agents
2055+
subgroup: 1000
2056+
sbCollapseId: prebid-agents
2057+
2058+
- sbSecId: 10
2059+
title: General
2060+
link:
2061+
isHeader: 1
2062+
headerId: agents-general
2063+
isSectionHeader: 0
2064+
sectionTitle:
2065+
subgroup: 0
2066+
2067+
- sbSecId: 10
2068+
title: Salesagent
2069+
link: /agents/salesagent.html
2070+
isHeader: 0
2071+
isSectionHeader: 0
2072+
sectionTitle:
2073+
subgroup: 0

agents/salesagent.md

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
---
2+
layout: page_v2
3+
title: Salesagent
4+
description: A media sales agent that implements the AdCP Media Buy protocol
5+
sidebarType: 10
6+
---
7+
8+
# Prebid Sales Agent
9+
10+
The Prebid Sales Agent is a server that exposes advertising inventory to AI agents via the Model Context Protocol (MCP) and Agent-to-Agent (A2A) protocol. It is designed to integrate with ad servers like Google Ad Manager and provides tools for managing inventory and campaigns throughout their lifecycle.
11+
12+
<div class="alert alert-info" role="alert">
13+
For the full source code and latest updates, visit the <a href="https://github.com/prebid/salesagent">prebid/salesagent repository</a>.
14+
</div>
15+
16+
## Key Features
17+
18+
### For AI Agents
19+
20+
- **Product Discovery**: Natural language search for advertising products.
21+
- **Campaign Creation**: Automated media buying with targeting capabilities.
22+
- **Creative Management**: Streamlined upload and approval workflows.
23+
- **Performance Monitoring**: Real-time access to campaign metrics.
24+
25+
### For Publishers
26+
27+
- **Multi-Tenant System**: Isolates data per publisher for security and organization.
28+
- **Adapter Pattern**: Supports multiple ad servers (e.g., Google Ad Manager).
29+
- **Real-time Dashboard**: Live activity feed powered by Server-Sent Events (SSE).
30+
- **Workflow Management**: Unified system for human-in-the-loop approvals.
31+
- **Admin Interface**: Web UI with Google OAuth for easy management.
32+
33+
### For Developers
34+
35+
- **MCP Protocol**: Standard interface for AI agents.
36+
- **A2A Protocol**: Agent-to-Agent communication via JSON-RPC 2.0.
37+
- **REST API**: Programmatic tenant management.
38+
- **Docker Deployment**: Easy setup for both local and production environments.
39+
40+
## Getting Started
41+
42+
### Quick Start (Evaluation)
43+
44+
You can try the sales agent locally using Docker:
45+
46+
```bash
47+
# Clone and start
48+
git clone https://github.com/prebid/salesagent.git
49+
cd salesagent
50+
docker compose up -d
51+
52+
# Test the MCP interface
53+
uvx adcp http://localhost:8000/mcp/ --auth test-token list_tools
54+
```
55+
56+
Access services at [http://localhost:8000](http://localhost:8000):
57+
58+
- **Admin UI**: `/admin` (Test credentials: `test123`)
59+
- **MCP Server**: `/mcp/`
60+
- **A2A Server**: `/a2a`
61+
62+
### Production Deployment
63+
64+
For production, publishers can deploy their own sales agent instance. The repository provides guides for various deployment methods, including Docker and cloud platforms.
65+
66+
## The AdContext Protocol (AdCP)
67+
68+
The Sales Agent is built on the **AdContext Protocol (AdCP)**, an open standard designed to standardize how AI agents interact with advertising platforms.
69+
70+
<div class="alert alert-info" role="alert">
71+
For comprehensive documentation, visit <a href="https://docs.adcontextprotocol.org/docs/intro">docs.adcontextprotocol.org</a>.
72+
</div>
73+
74+
### Protocol Architecture
75+
76+
AdCP operates as a layer on top of standard AI interaction protocols:
77+
78+
- **MCP (Model Context Protocol)**: Facilitates direct integration with AI assistants (e.g., Claude Desktop).
79+
- **A2A (Agent-to-Agent Protocol)**: Enables complex, autonomous workflows and collaboration between agents using JSON-RPC 2.0.
80+
81+
### Core Concepts
82+
83+
AdCP abstracts complex advertising operations into standardized domains:
84+
85+
1. **Inventory Discovery** (`get_products`): Agents can search for ad products using natural language criteria (e.g., "video ads in North America") rather than specific line item IDs.
86+
2. **Media Buying** (`create_media_buy`): A normalized workflow for proposal, negotiation, and booking that works consistently across different ad servers.
87+
3. **Creative Management** (`build_creative`): Standardized handling of creative assets, allowing agents to generate or upload assets that match publisher specifications.
88+
4. **Signal Activation** (`get_signals`, `activate_signal`): Mechanisms for passing context and identity signals to improve targeting and campaign performance.
89+
90+
### Workflow Example
91+
92+
A typical AI-driven campaign flow using AdCP might look like this:
93+
94+
1. **Discovery**: Expected outcome is a list of available "Products" matching the agent's intent.
95+
2. **Planning**: The agent uses `create_media_buy` to submit a proposal.
96+
3. **Review**: The Sales Agent (and potentially a human publisher) reviews the proposal.
97+
4. **Execution**: Once approved, the Sales Agent pushes the orders to the underlying ad server (e.g., GAM).
98+
99+
## Architecture
100+
101+
The project follows a clean structure isolating core MCP components, business logic services, and ad server adapters.
102+
103+
```text
104+
salesagent/
105+
├── src/
106+
│ ├── core/ # Core MCP server components
107+
│ ├── services/ # Business logic services
108+
│ ├── adapters/ # Ad server integrations (e.g., GAM)
109+
│ └── admin/ # Admin UI (Flask)
110+
├── scripts/ # Utility and deployment scripts
111+
└── tests/ # Comprehensive test suite
112+
```
113+
114+
## Contributing
115+
116+
Contributions are welcome! Please refer to the [Development Guide](https://github.com/prebid/salesagent/blob/main/docs/development/README.md) in the repository for details on setting up your environment and creating pull requests.

dev-docs/analytics/intentiq.md

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,8 @@ pbjs.enableAnalytics({
4646
provider: 'iiqAnalytics',
4747
options: {
4848
partner: 1177538,
49-
manualWinReportEnabled: false,
50-
reportMethod: "GET",
51-
adUnitConfig: 1,
49+
ABTestingConfigurationSource: 'IIQServer',
5250
domainName: "currentDomain.com",
53-
gamPredictReporting: false
5451
}
5552
});
5653
```
@@ -91,7 +88,9 @@ originalCpm: 1.5, // Original CPM value.
9188
originalCurrency: 'USD', // Original currency.
9289
status: 'rendered', // Auction status, e.g., 'rendered'.
9390
placementId: 'div-1' // ID of the ad placement.
94-
adType: 'banner' // Specifies the type of ad served
91+
adType: 'banner', // Specifies the type of ad served
92+
size: '320x250', // Size of adUnit item,
93+
pos: 0 // The following values are defined in the ORTB 2.5 spec
9594
}
9695
```
9796

@@ -109,6 +108,8 @@ adType: 'banner' // Specifies the type of ad served
109108
| status | String | Status of the impression. Leave empty or undefined if Prebid is not the bidding platform | rendered | No |
110109
| placementId | String | Unique identifier of the ad unit on the webpage that showed this ad | div-1 | No |
111110
| adType | String | Specifies the type of ad served. Possible values: “banner“, “video“, “native“, “audio“. | banner | No |
111+
| size | String | Size of adUnit item | 320x250 | No |
112+
| pos | number | The pos field specifies the position of the adUnit on the page according to the OpenRTB 2.5 specification | 0 | No |
112113

113114
To report the auction win, call the function as follows:
114115

dev-docs/bidders/alchemyx.md

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
---
2+
layout: bidder
3+
title: AlchemyX
4+
description: Prebid AlchemyX Bidder Adapter
5+
aliasCode: adverxo
6+
pbjs: true
7+
pbs: false
8+
pbs_app_supported: false
9+
biddercode: alchemyx
10+
media_types: banner, native, video
11+
schain_supported: true
12+
dchain_supported: false
13+
ortb_blocking_supported: true
14+
floors_supported: true
15+
multiformat_supported: will-bid-on-any
16+
tcfeu_supported: false
17+
dsa_supported: false
18+
gvl_id: none
19+
usp_supported: false
20+
coppa_supported: false
21+
gpp_sids: none
22+
userId: none
23+
safeframes_ok: false
24+
deals_supported: true
25+
fpd_supported: true
26+
prebid_member: false
27+
sidebarType: 1
28+
---
29+
30+
### Note
31+
32+
The AlchemyX Bidding adapter requires setup and approval before beginning. Please reach out to <prebid@alchemyx.io> for
33+
more details.
34+
35+
### Bid Params
36+
37+
{: .table .table-bordered .table-striped }
38+
| Name | Scope | Description | Example | Type |
39+
|----------|----------|-----------------------|---------------------------|----------|
40+
| `adUnitId` | required | Unique identifier for the ad unit in AlchemyX platform. | `1` | `integer` |
41+
| `auth` | required | Authentication token provided by AlchemyX platform for the AdUnit. |`'61336e75e414c77c367eq5c47c2599ce80a8032b'` | `string` |
42+
43+
### Setting First Party Data (FPD)
44+
45+
Publishers should use the `ortb2` method of setting First Party Data. The following fields are supported:
46+
47+
- ortb2.site.\*
48+
- ortb2.app.\*
49+
- ortb2.user.\*
50+
51+
Example first party data:
52+
53+
```javascript
54+
pbjs.setConfig({
55+
ortb2: {
56+
site: {
57+
keywords: "kw1,kw2",
58+
content: {
59+
title: "title1",
60+
series: "series1"
61+
}
62+
},
63+
user: {
64+
keywords: "a,b",
65+
gender: "M",
66+
yob: 1984
67+
}
68+
}
69+
});
70+
```
71+
72+
### ORTB Blocking
73+
74+
AlchemyX supports the next blocking parameters:
75+
76+
- Blocked advertisers list (`badv`) is an array of domains as strings.
77+
- Blocked apps list (`bapp`) is an array of apps names as strings, for mobile apps in Google Play Store, these should be
78+
bundle or package names (e.g. com.foo.mygame). For apps in Apple App Store, these should be a numeric ID.
79+
- Blocked categories list (`bcat`) is an array of IAB categories as strings.
80+
- Blocked attributes list (`battr`) is an array of integers. Refer to section 5.3 of the IAB specification for a list of
81+
attributes.
82+
83+
#### Globally defined ORTB Blocking
84+
85+
```javascript
86+
pbjs.setConfig({
87+
ortb2: {
88+
badv: ["domain1.com", "domain2.com"],
89+
bapp: ["com.foo.mygame", "284708449"],
90+
bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"]
91+
}
92+
});
93+
```
94+
95+
#### ORTB Blocking specific only to the AlchemyX bidder
96+
97+
```javascript
98+
pbjs.setBidderConfig({
99+
bidders: ['alchemyx'],
100+
config: {
101+
ortb2: {
102+
badv: ["domain1.com", "domain2.com"],
103+
bapp: ["com.foo.mygame"],
104+
bcat: ["IAB23-1", "IAB23-5", "IAB25-3", "IAB25-2"]
105+
}
106+
}
107+
});
108+
```
109+
110+
#### Media Type defined ORTB Blocking
111+
112+
Additionally `battr` ORTB blocking param may be set on media types to specify blocked creative
113+
attributes. Refer to section 5.3 of the IAB specification for a list of attributes.

dev-docs/bidders/intlscoop.md

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
---
2+
layout: bidder
3+
title: Intellectscoop
4+
description: Intellectscoop Adaptor
5+
biddercode: intlscoop
6+
aliasCode: adkernel
7+
tcfeu_supported: true
8+
dsa_supported: false
9+
gvl_id: 14 (adkernel)
10+
usp_supported: true
11+
coppa_supported: true
12+
gpp_sids: tcfeu, usp
13+
schain_supported: true
14+
dchain_supported: false
15+
userId: all
16+
media_types: banner, video, native
17+
safeframes_ok: true
18+
deals_supported: false
19+
floors_supported: true
20+
fpd_supported: true
21+
pbjs: true
22+
pbs: false
23+
pbs_app_supported: false
24+
prebid_member: false
25+
multiformat_supported: will-bid-on-any
26+
ortb_blocking_supported: true
27+
privacy_sandbox: no
28+
sidebarType: 1
29+
30+
---
31+
32+
### Note
33+
34+
The Intellectscoop bidding adaptor requires setup and approval before beginning. Please reach out to <apoorv@intellectscoop.com> for more details
35+
36+
### Bid Params
37+
38+
{: .table .table-bordered .table-striped }
39+
| Name | Scope | Description | Example | Type |
40+
|----------|----------|-----------------------|---------------------------|----------|
41+
| `host` | required | RTB host | `'cpm.intellectscoop.com'` | `string` |
42+
| `zoneId` | required | RTB zone id | `30164` | `integer` |

dev-docs/bidders/ogury.md

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -82,12 +82,13 @@ Use this example configuration for enabling Ogury ad server integration on a spe
8282

8383
#### Inventory mapping
8484

85-
_"Inventory mapping" is only available for request coming from **web**. For **in-app** request use the "bid param" integration method._
86-
8785
_Note: If you choose inventory mapping, you can skip specifying assetKey and adUnitId per ad unit._
8886

89-
With inventory mapping you don't need to setup `assetKey/adUnitId` for every ad unit that you want to integrate. You use a single `id` and provide Ogury with list of sites and `ad_unit_code`s that you want to integrate and the mapping will be done on our side.
90-
The example configuration for this type of integration looks like this:
87+
With inventory mapping you don't need to setup `assetKey/adUnitId` for every ad unit that you want to integrate. You use a single `id` and provide Ogury with list of sites or bundles and `ad_unit_code`s that you want to integrate and the mapping will be done on our side.
88+
89+
The example configuration for this type of integration looks like bellow.
90+
91+
Web example:
9192

9293
```javascript
9394
pbjs.que.push(function () {
@@ -107,6 +108,26 @@ pbjs.que.push(function () {
107108
})
108109
````
109110

111+
In-app example:
112+
113+
```javascript
114+
pbjs.que.push(function () {
115+
// setup publisherId for ogury
116+
pbjs.setBidderConfig({
117+
bidders: ['ogury'],
118+
config: {
119+
ortb2: {
120+
app: {
121+
publisher: {
122+
id: '$OGURY_PUBLISHER_ID',
123+
},
124+
}
125+
}
126+
}
127+
})
128+
})
129+
````
130+
110131
`$OGURY_PUBLISHER_ID` is a Ogury provided id.
111132
112133
### Optional bid Params

0 commit comments

Comments
 (0)