This guide walks publishers through the complete process of setting up the Prebid Sales Agent, from initial deployment through go-live. By the end, you will have a fully configured Sales Agent that AI buying agents can use to discover your inventory and purchase advertising.
The onboarding process follows ten steps:
Start by deploying the Sales Agent using Docker. For local development and testing:
git clone https://github.com/prebid/salesagent.git
cd salesagent
docker compose up -d
For production deployments, see the Deployment Overview for Docker, Fly.io, and Google Cloud Run options.
ADCP_AUTH_TEST_MODE=false and configure real authentication. See the Configuration Reference for all environment variables.
Navigate to http://localhost:8000/admin (or your production URL) to access the Admin UI.
In test mode, log in with:
test_super_admin@example.comtest123Super admins have unrestricted access to all tenants and system settings. Configure super admin access using environment variables:
# Grant super admin to specific email addresses
SUPER_ADMIN_EMAILS=admin@yourcompany.com,ops@yourcompany.com
# Or grant super admin to all users from a domain
SUPER_ADMIN_DOMAINS=yourcompany.com
Once logged in, the Admin UI dashboard provides:
Navigate to Settings > Ad Server in the Admin UI to select and configure your ad server adapter.
| Adapter | Channels | Requirements |
|---|---|---|
| Google Ad Manager | Display, OLV, Social | GAM API access, OAuth credentials, GCP project |
| Kevel | Display | Kevel API key |
| Triton Digital | Audio | Triton Digital account credentials |
| Broadstreet | Display | Broadstreet API credentials |
| Mock Ad Server | All | None (in-memory, for testing only) |
To connect Google Ad Manager:
Required environment variables for GAM:
GAM_OAUTH_CLIENT_ID=your-client-id
GAM_OAUTH_CLIENT_SECRET=your-client-secret
GCP_PROJECT_ID=your-gcp-project
GOOGLE_APPLICATION_CREDENTIALS=/path/to/service-account.json
For other adapters, select the adapter in the Admin UI and provide the required API credentials in the connection configuration form. Each adapter has a typed configuration class that validates the required fields.
Products are the advertising offerings that AI agents discover and purchase. Navigate to Products in the Admin UI to create your catalog.
Each product includes:
| Field | Required | Description |
|---|---|---|
name |
Yes | Display name shown to buying agents (e.g., “Premium Homepage Leaderboard”) |
description |
Yes | Detailed description including audience, placement, and value proposition |
format_ids |
Yes | Creative formats accepted (e.g., display 728x90, video pre-roll) |
pricing_options |
Yes | One or more pricing models with rates (see Step 5) |
targeting |
No | Available targeting parameters (geo, audience, contextual) |
delivery_type |
Yes | How impressions are delivered (e.g., standard, guaranteed, sponsorship) |
delivery_measurement |
Yes | How delivery is measured (e.g., impressions, clicks, completions) |
properties |
No | Specific sites or apps where the product runs |
AI agents use product descriptions to match buyer briefs to your inventory. Write descriptions that clearly communicate:
Each product needs at least one pricing option. Pricing options define how advertisers pay for the product.
| Model | Code | Description |
|---|---|---|
| Cost Per Mille | cpm |
Price per 1,000 impressions |
| Cost Per Click | cpc |
Price per click |
| Cost Per Completed View | cpcv |
Price per completed video view |
| Cost Per Point | cpp |
Price per rating point |
| Cost Per View | cpv |
Price per video view (any duration) |
| Flat Rate | flat_rate |
Fixed price for a sponsorship or time period |
| Viewable CPM | vcpm |
Price per 1,000 viewable impressions |
| Field | Type | Description |
|---|---|---|
pricing_model |
enum | One of: cpm, cpc, cpcv, cpp, cpv, flat_rate, vcpm |
is_fixed |
boolean | true for fixed pricing, false for negotiable/floor pricing |
rate |
decimal | The price per unit (e.g., $12.50 CPM) |
currency |
string | ISO 4217 currency code (e.g., USD, EUR, GBP) |
min_budget |
decimal | Minimum total spend required for this product |
max_budget |
decimal | Maximum total spend allowed (optional cap) |
A product might have multiple pricing options:
Advertisers (called “principals” in the system) are the entities that buy media through AI agents. Navigate to Principals in the Admin UI to create accounts.
Each principal receives an authentication token that their AI agent uses to identify itself when calling the Sales Agent.
The advertiser’s AI agent includes the token in every request:
# As a custom header
x-adcp-auth: principal-token-here
# Or as a standard Bearer token
Authorization: Bearer principal-token-here
The token identifies both the tenant (your publisher account) and the specific principal (the advertiser), ensuring proper access control and audit logging.
For the Admin UI, you can configure Single Sign-On (SSO) so your team members authenticate with your existing identity provider. Navigate to Settings > Authentication in the Admin UI.
| Provider | Protocol | Configuration Required |
|---|---|---|
| OIDC | Client ID, Client Secret | |
| Microsoft | OIDC | Client ID, Client Secret, Tenant ID |
| Okta | OIDC | Client ID, Client Secret, Okta Domain |
| Auth0 | OIDC | Client ID, Client Secret, Auth0 Domain |
| Keycloak | OIDC | Client ID, Client Secret, Realm URL |
https://your-salesagent-domain.com/admin/auth/callback.Advertising policies control what types of campaigns and creatives are allowed on your properties. Navigate to Settings > Policies in the Admin UI.
Policies are enforced at two points:
create_media_buy, the policy agent checks the proposed campaign against your policies. Non-compliant proposals are rejected with clear error messages.sync_creatives, the review agent checks them against your policies and returns compliance results.Workflows control whether campaigns and creatives require human approval before going live. Navigate to Settings > Workflows in the Admin UI.
| Mode | Behavior |
|---|---|
require-human |
All media buys and creatives require manual approval by a publisher admin |
auto-approve |
Media buys and creatives are automatically approved if they meet configured thresholds |
When using auto-approve mode, the AI review agent evaluates each creative and assigns a confidence score. You can set thresholds to control auto-approval:
When human approval is required, the system creates workflow tasks that appear in:
hitl_webhook_url (if configured)AI agents can poll media buy status via get_media_buys and notify their operators when approval is needed.
Before connecting your production ad server, validate your entire configuration using the Mock Ad Server adapter.
get_products to verify your product catalog appears correctly.create_media_buy and verify it flows through your approval workflow.sync_creatives and confirm they pass policy checks.get_media_buy_delivery to verify mock delivery metrics are returned.Once everything works with the mock adapter, switch to your production ad server adapter.
| Item | Status | Notes |
|---|---|---|
| Sales Agent deployed to production infrastructure | See Deployment Overview | |
ADCP_AUTH_TEST_MODE=false set |
Disables test credentials | |
| Production ad server adapter configured | GAM, Kevel, Triton, or Broadstreet | |
| Ad server API credentials validated | Test connection from Settings page | |
| Product catalog populated | At least one product with pricing | |
| Pricing options configured per product | Include min_budget for spend guardrails |
|
| At least one principal (advertiser) account created | Token shared with buyer | |
| SSO configured for admin team | Test login/logout flow | |
| Advertising policies set | Blocked categories, brands, tactics | |
| Workflow approval mode selected | require-human recommended for launch |
|
| SSL/TLS configured on production domain | Required for secure token transmission | |
ENCRYPTION_KEY set to a strong random value |
Used for encrypting sensitive config | |
FLASK_SECRET_KEY set to a strong random value |
Used for session security | |
| Monitoring and alerting configured | Health check at /health |
|
| Backup strategy for PostgreSQL database | Point-in-time recovery recommended | |
| End-to-end test completed with real AI agent | Full workflow: discover → buy → deliver |