ESC
Docs / Introduction
BB

Boost Boss API

The monetization and advertising API for the AI era. REST-based, JSON everywhere, sub-50ms median latency.

The Boost Boss API lets you fetch ads, beacon events, and manage campaigns programmatically. This reference covers every endpoint, every parameter, and every response field. The API is organized around REST β€” predictable URLs, standard HTTP verbs, standard status codes, JSON request and response bodies.

If you're monetizing an AI app, start with the SDK quickstart. If you're running campaigns, skip to Create campaign. If you're integrating via OpenRTB 2.6, jump to the BBX adapter. Licensing Benna into your own mediation stack? Jump to Benna.

✦
Machine-readable spec. A full OpenAPI 3.1 description of every endpoint on this page lives at /openapi.json β€” drop it into Postman, Stoplight, or your code generator of choice.

Quickstart

Install the SDK, set your API key, fetch your first ad.

1. Install

bashCopy
npm install @boostbossai/lumi-sdk
# or
pip install boostboss
# or
go get github.com/boostboss/go-sdk

2. Initialize the client

TypeScriptCopy
import { BoostBoss } from '@boostbossai/lumi-sdk';

const bb = new BoostBoss({
  apiKey: process.env.BB_API_KEY,
  environment: 'live', // or 'test'
});

3. Fetch an ad

TypeScriptCopy
const ad = await bb.fetch({
  format: 'native',
  context: "help me refactor this python script",
  audience: 'ai-native',
});

// ad.headline  β†’ "Ship better code 10Γ— faster"
// ad.body      β†’ "The AI coding assistant..."
// ad.cta_url   β†’ "https://cursor.com/?ref=bb"
// ad.beacons   β†’ { impression, click, convert }
✦
Tip: the SDK automatically fires the impression beacon when you render the ad. You only need to call ad.trackClick() when the user clicks through.

Authentication

Boost Boss uses bearer tokens for authentication. Your API key must be passed in the Authorization header on every request.

HTTPCopy
Authorization: Bearer bb_sk_live_1a2b3c4d5e6f...

You have two key types:

!
Key hygiene: rotate keys from the dashboard β†’ Settings β†’ API keys. Old keys are revoked instantly. We send a webhook and an email when a key is rotated or suspected of being exposed.

Environments

Two environments. Both use the same SDKs and endpoints β€” you switch by using the corresponding keys.

EnvironmentKey prefixBase URLNotes
testbb_sk_test_*api.boostboss.aiNo real spend. No real payouts. Mock ads.
livebb_sk_live_*api.boostboss.aiReal auctions. Real spend. Real earnings.

SDKs

Official clients for every major language. Zero dependencies, tiny bundles, identical API surface. v1.0.0

The recommended client for browsers, Node, and Deno. Zero dependencies, 8kb gzipped.

bashCopy
npm install @boostbossai/lumi-sdk
TypeScriptCopy
import { BoostBoss, NativeAd } from '@boostbossai/lumi-sdk';

const bb = new BoostBoss({ apiKey: 'bb_sk_live_***' });

const ad: NativeAd = await bb.fetch({
  format: 'native',
  context: userMessage,
  mcpTools: ['filesystem', 'github'],
  model: 'claude-sonnet-4',
});

// Render the ad in your UI
renderCard({
  headline: ad.headline,
  body: ad.body,
  cta: ad.cta_text,
  onClick: () => ad.trackClick(),
});

Full async support, type hints throughout. Works with asyncio, trio, and anyio.

bashCopy
pip install boostboss
PythonCopy
from boostboss import BoostBoss

bb = BoostBoss(api_key="bb_sk_live_***")

ad = bb.fetch(
    format="native",
    context=user_message,
    mcp_tools=["filesystem", "github"],
    model="claude-sonnet-4",
)

if ad:
    render_card(ad.headline, ad.body, ad.cta_text)
    ad.track_click()  # on user click

Idiomatic Go with context support and structured errors.

bashCopy
go get github.com/boostboss/go-sdk
GoCopy
import "github.com/boostboss/go-sdk"

bb := boostboss.New("bb_sk_live_***")

ad, err := bb.Fetch(ctx, &boostboss.FetchRequest{
    Format:   "native",
    Context:  userMessage,
    McpTools: []string{"filesystem", "github"},
    Model:    "claude-sonnet-4",
})
if err != nil { log.Fatal(err) }

Swift concurrency with async/await. SPM and CocoaPods support.

Swift Package ManagerCopy
.package(url: "https://github.com/boostboss/swift-sdk", from: "1.0.0")
SwiftCopy
import BoostBoss

let bb = BoostBoss(apiKey: "bb_sk_live_***")

let ad = try await bb.fetch(
    format: .native,
    context: userMessage,
    mcpTools: ["filesystem", "github"]
)

Coroutine-based with Kotlin Multiplatform support. JVM, Android, and JS targets.

GradleCopy
implementation("ai.boostboss:sdk:1.0.0")
KotlinCopy
import ai.boostboss.BoostBoss

val bb = BoostBoss(apiKey = "bb_sk_live_***")

val ad = bb.fetch(
    format = "native",
    context = userMessage,
    mcpTools = listOf("filesystem", "github")
)

Fetch ad

POST/v1/ads/fetchRun an auction and return the winning ad.
β–Ά Try it

Runs a real-time auction against your targeting parameters and returns the winning ad creative with signed beacon URLs. Median latency: 47ms p50, 180ms p99.

Request body

FieldTypeDescription
formatreqstringOne of native, tool_result, agent_suggestion, display.
contextstringFree-form user intent or session snippet. Up to 2000 chars.
audiencestringAudience tier: ai-native, prosumer, or broad.
mcp_toolsstring[]Active MCP tool IDs in this session.
modelstringModel in use: claude-opus-4, claude-sonnet-4, gpt-5, etc.
user_idstringStable anonymous user identifier (hashed, not PII).
frequency_capobjectCaps: { per_session: 3, per_day: 10 }.

Example request

cURLCopy
curl https://api.boostboss.ai/v1/ads/fetch \
  -H "Authorization: Bearer bb_sk_live_***" \
  -H "Content-Type: application/json" \
  -d '{
    "format": "native",
    "context": "refactor this python function to use async",
    "audience": "ai-native",
    "mcp_tools": ["filesystem", "github"],
    "model": "claude-sonnet-4"
  }'

Response

JSON Β· 200 OKCopy
{
  "id": "ad_3Xc9wZ8fK4",
  "format": "native",
  "headline": "Ship better code 10Γ— faster",
  "body": "The AI coding assistant that actually reads your codebase.",
  "cta_text": "Try Cursor free",
  "cta_url": "https://cursor.com/?ref=bb",
  "advertiser": { "name": "Cursor", "verified": true },
  "beacons": {
    "impression": "https://api.boostboss.ai/v1/beacon/imp/...",
    "click":      "https://api.boostboss.ai/v1/beacon/clk/...",
    "convert":    "https://api.boostboss.ai/v1/beacon/cvt/..."
  },
  "bid_cpm": 3.42,
  "match_score": 0.91,
  "latency_ms": 47
}

Impression beacon

POST/v1/beacon/imp/:tokenFire when the ad becomes visible.

The SDK fires this for you automatically on render. If you're hitting the API directly, fire this beacon the first time the ad is visible in the viewport (β‰₯50% pixels, β‰₯1 second). Idempotent β€” duplicates are deduped server-side.

Click beacon

POST/v1/beacon/clk/:tokenFire when the user clicks the ad.

Fire before redirecting to the CTA URL. Returns 302 to the verified advertiser destination β€” so you can use it as the anchor's href directly.

Conversion beacon

POST/v1/beacon/cvt/:tokenFire when the user completes the advertiser's goal.

Advertisers use this to report conversions back β€” signup complete, purchase made, install confirmed. Used by CPA bidders to pay per outcome.

List campaigns

GET/v1/campaignsList all campaigns for the authenticated advertiser.
β–Ά Try it
Query paramTypeDescription
statusstringFilter: active, paused, review, ended.
limitintPage size. Default 20, max 100.
starting_afterstringCursor ID for pagination.

Create campaign

POST/v1/campaignsLaunch a new ad campaign.
FieldTypeDescription
namereqstringHuman-readable campaign name.
formatreqstringAd format to serve.
headlinereqstringAd headline, max 60 chars.
bodystringSupporting copy, max 200 chars.
cta_textreqstringCall-to-action button text.
cta_urlreqstringDestination URL.
billing_modelreqstringOne of cpm, cpc, cpa.
bid_amountreqnumberMax bid per unit (CPM, CPC, or CPA target).
daily_budgetreqnumberMaximum daily spend in USD.
intent_signalsstring[]AI-native intent targets. See AI targeting.
host_appsstring[]Target AI apps: claude, cursor, etc.
mcp_toolsstring[]Target active MCP tools.

Update campaign

PATCH/v1/campaigns/:idModify a running campaign.

Any field from Create campaign can be patched. Patching status to paused halts spend immediately. Patching creative triggers automatic creative re-review (typically under 15 minutes).

Get stats

GET/v1/statsAggregate performance metrics.

Returns impressions, clicks, conversions, spend, and derived rates (CTR, CVR, eCPA) across the time range. Break down by campaign, format, host_app, intent_signal, or day.

JSON Β· 200 OKCopy
{
  "range": { "from": "2026-04-01", "to": "2026-04-15" },
  "totals": {
    "impressions": 4_812_400,
    "clicks":      218_600,
    "conversions": 12_840,
    "spend_usd":   24810.00,
    "ctr":         0.0454,
    "cvr":         0.0587,
    "ecpa_usd":    1.93
  },
  "breakdown": [ ... ]
}

Benna β€” the ranking engine

Benna is the model that ranks every bid served through Boost Boss. It's an MCP-native ranker: instead of scoring on cookies, device IDs, and page URLs, it scores on the signals that actually predict conversion in an AI surface β€” user intent, the MCP tool about to be called, the host application, and session length. Benna runs at sub-5ms p50 and returns a full attribution block so every decision is inspectable.

Benna powers the first-party Boost Boss exchange (BBX) by default. You don't need to call it directly β€” the SDK does it for you. But if you operate your own demand stack and want to plug Benna into an existing mediation waterfall or header bidder, we license the raw inference endpoint at $0.002 per call. Every response includes the model version, predicted click & conversion rates, and a signal-by-signal contribution breakdown.

i
When to license Benna directly. If your network already has demand but your ranker was built for web/mobile contexts, Benna is the fastest way to bolt on MCP-aware scoring. Typical lift in A/B tests: +28% eCPM and +34% CVR vs. a cookie-trained baseline on the same inventory.
✦
Technical whitepaper. The full architecture, training protocol, and A/B evaluation are documented in Benna: MCP-Native Ranking for Agentic Advertising (PDF, 8 pages). Cite as boostboss.ai/benna-whitepaper.pdf.

Score a bid request

POST/api/bennaRank a single bid against your own demand.
β–Ά Try it

Submit a bid context and a campaign spec; Benna returns an effective bid in USD plus click / convert probabilities and a signal attribution map. Billed at $0.002 per call; latency budget is 20ms end-to-end (model itself is 3–6ms, the rest is network & JSON).

Request

FieldTypeDescription
context.intentstringNormalized intent token. See Signal reference.
context.mcp_toolstringTool about to be invoked β€” e.g. shell.exec, file.read, web.search.
context.hoststringHost app domain β€” e.g. cursor.com, claude.ai.
context.session_lennumberMinutes elapsed in the current user session.
context.regionstringISO region β€” us-west, eu-central, etc.
campaign.target_cpanumberAdvertiser target CPA in USD.
campaign.goalstringtarget_cpa, target_roas, max_conversions, or manual.
campaign.formatstringimage, video, or native.
cURLCopy
curl "https://boostboss.ai/api/benna" \
  -H "Authorization: Bearer bb_sk_live_..." \
  -H "Content-Type: application/json" \
  -d '{
    "context": {
      "intent":      "debug_py",
      "mcp_tool":    "shell.exec",
      "host":        "cursor.com",
      "session_len": 42,
      "region":      "us-west"
    },
    "campaign": {
      "target_cpa": 8.00,
      "goal":       "target_cpa",
      "format":     "native"
    }
  }'

Response

JSON Β· 200 OKCopy
{
  "model_version": "benna-rc3-2026.04.14",
  "bid_usd":          8.42,
  "p_click":          0.031,
  "p_convert":        0.0062,
  "signal_contributions": {
    "intent=debug_py":        0.34,
    "mcp_tool=shell.exec":    0.22,
    "host=cursor.com":        0.18,
    "session_len>30m":       0.13,
    "region=us-west":         0.09,
    "residual":               0.04
  },
  "latency_ms": 4.2
}

Engine status

GET/api/benna?op=engine-statusCurrent model version, training window, and health.

Use this to confirm which model is live in production, when it was last retrained, and its self-reported calibration metrics. Free to call β€” not billed. Pair it with your own monitoring to alert on stale models or calibration drift.

JSON Β· 200 OKCopy
{
  "model_version":      "benna-rc3-2026.04.14",
  "trained_through":    "2026-04-12",
  "training_examples": 184_000_000,
  "p50_latency_ms":     4.1,
  "p99_latency_ms":     11.8,
  "calibration_ece":    0.021,
  "status":             "healthy"
}

Signal reference

Benna is trained on five MCP-native signals. These are the only inputs that affect ranking β€” there are no cookies, no device fingerprints, no persistent user IDs. Intent strings are matched against a vocabulary server-side; raw text is discarded after normalization.

SignalTypeTypical weightNotes
intenttokenβ‰ˆ 0.34Normalized from the active user request. Vocabulary > 4,000 tokens.
mcp_tooltokenβ‰ˆ 0.22The tool about to execute. High signal β€” differentiates "reading about X" vs. "doing X".
hosttokenβ‰ˆ 0.18Host app domain. Proxies for user persona (developer, analyst, consumer).
session_lennumberβ‰ˆ 0.13Longer sessions convert at higher rates; bucketed as <10m / 10–30m / >30m.
regiontokenβ‰ˆ 0.09Coarse region only. Never IP-level.

Weights shown are the current production contributions averaged across the live exchange; per-request attribution is returned in every /api/benna response so you can inspect the exact mix for any decision.

Ad formats

Boost Boss serves four native-first ad formats. Each is rendered by your app β€” we return the content, you render the chrome that matches your UI.

FormatMax charsUse case
nativeHeadline 60 Β· body 200Inline card inside chat / agent output.
tool_resultHeadline 60 Β· body 140Shown after a tool call returns results.
agent_suggestionHeadline 40 Β· body 100"Try this tool" suggestion from an agent.
displayImage 300Γ—250 / 728Γ—90Traditional IAB banner for legacy contexts.

AI-native targeting

Boost Boss replaces cookie-based targeting with three session-level signals gathered from the MCP layer. All signals are anonymized and aggregated β€” no PII ever leaves the client.

Intent signals

Free-form intent extracted from the current user request. Examples: "debugging python", "writing pitch deck", "refactoring code". Advertisers bid on the intents that match what they sell.

Tool context

Which MCP tools are active in the session β€” filesystem, github, terminal, browser, slack, etc. Strong proxy for user activity type.

Model context

Which AI model is in use β€” claude-opus-4, gpt-5, gemini-3, etc. Useful for advertisers with model-specific integrations.

i
No PII, ever. User identifiers are SHA-256 hashed before they leave the client. Intent strings are matched against a vocabulary server-side; raw text is dropped after matching. See our Privacy white paper for the full protocol.

MCP integration

The SDK hooks into your MCP client automatically. On initialization, it registers a listener for tool calls and user messages, uses those signals as context and mcp_tools when fetching ads, and otherwise gets out of your way.

TypeScriptCopy
import { BoostBoss } from '@boostbossai/lumi-sdk';
import { McpClient } from '@modelcontextprotocol/sdk';

const mcp = new McpClient({ /* ... */ });
const bb  = new BoostBoss({
  apiKey: 'bb_sk_live_***',
  mcpClient: mcp, // ← just pass it in
});

// The SDK now reads context from MCP automatically
const ad = await bb.fetch({ format: 'native' });

Webhooks

Receive real-time notifications for platform events. Configure endpoints in the dashboard β†’ Settings β†’ Webhooks.

EventFires when
ad.servedA fetch request returned an ad for one of your campaigns.
ad.impressionImpression beacon fired.
ad.clickUser clicked the ad.
ad.conversionConversion beacon fired.
campaign.approvedCampaign passed review and is now live.
campaign.rejectedCampaign was rejected. Reason in payload.
campaign.endedCampaign finished (budget exhausted or end date reached).
payout.initiatedA weekly publisher payout started processing.
payout.completedPayout landed in the publisher's bank / wallet.

Signature verification

Every webhook is signed with HMAC-SHA256. Verify with the signing secret from your dashboard:

NodeCopy
import crypto from 'crypto';

const sig = req.headers['bb-signature'];
const expected = crypto.createHmac('sha256', SECRET)
  .update(req.rawBody).digest('hex');

if (crypto.timingSafeEqual(
  Buffer.from(sig),
  Buffer.from(expected)
)) {
  // βœ“ verified β€” process event
}

Rate limits

We rate-limit per API key to protect both us and you. Limits are applied at the second and minute level with a rolling window.

EndpointLimitBurst
POST /v1/ads/fetch500/s per key1000 over 10s
POST /v1/beacon/*Unlimitedβ€”
POST /v1/campaigns30/min per keyβ€”
GET /v1/stats60/min per keyβ€”

Responses include three headers on every request:

X-RateLimit-Limit:      500
X-RateLimit-Remaining:  487
X-RateLimit-Reset:      1760521200

Error codes

Errors return a JSON body with a machine-readable code, a human message, and a request_id you can cite when contacting support.

HTTPCodeMeaning
400invalid_requestMalformed body or missing required field.
401invalid_api_keyKey missing, revoked, or for the wrong environment.
402billing_requiredNo payment method on file.
403forbiddenAuthenticated but not authorized for this resource.
404not_foundResource does not exist.
409conflictState conflict (e.g. editing a campaign under review).
429rate_limitedToo many requests. Back off and retry with jitter.
500server_errorSomething broke on our side. Auto-retried up to 3Γ—.

OpenRTB 2.6 β€” BBX adapter

BBX (Boost Boss Exchange) exposes an OpenRTB 2.6 endpoint so that any compliant DSP β€” The Trade Desk, DV360, Amazon DSP, Criteo, or your in-house demand stack β€” can bid into MCP-native inventory without writing a bespoke integration. One URL, first-price auction, win/loss notices, native 1.2 + VAST 4.2 markup. The adapter sits in front of Benna: every bid is scored and every response includes a full attribution block in bid.ext.benna.

✦
Why bid here. MCP surfaces are the highest-intent inventory on the internet β€” a user calling filesystem.read on a traceback is a conversion event waiting to happen. BBX translates those signals into OpenRTB fields DSPs already understand, so your existing bidder works out of the box.

Endpoint summary

OperationMethodPathPurpose
BidPOST/api/rtbSend an OpenRTB 2.6 BidRequest; get back a BidResponse or 204 No Content.
Win noticeGET/api/rtb?op=winDSPs hit bid.nurl with ${AUCTION_PRICE} substituted. Returns a 1Γ—1 GIF.
Loss noticeGET/api/rtb?op=lossDSPs hit bid.lurl with ${AUCTION_LOSS}. Returns a 1Γ—1 GIF.
StatusGET/api/rtb?op=statusAdapter metadata β€” OpenRTB version, supported formats, auction type, Benna build.
i
Machine-readable. Full JSON Schema for every object on this page is in /openapi.json under the RTB tag. Drop it into your DSP's QA harness.

Bid request

Send a standard OpenRTB 2.6 BidRequest as the body. All supported objects β€” imp[], site / app, device, user, source, regs, bcat, badv β€” are honored. Native 1.2 asset requests pass through unchanged; the adapter parses imp.native.request and returns matching asset IDs in the response adm.

Minimum viable request: a BidRequest.id, a single imp with one of native / banner / video, and enough context to score. A realistic Trade Desk-style request looks like this:

cURL Β· POST /api/rtbCopy
curl -X POST https://boostboss.ai/api/rtb \
  -H 'Authorization: Bearer bb_seat_<your-seat-key>' \
  -H 'Content-Type: application/json' \
  -H 'x-openrtb-version: 2.6' \
  --data '{
    "id": "bid_req_9a8b7c",
    "at": 1,
    "tmax": 200,
    "cur": ["USD"],
    "imp": [{
      "id": "1",
      "tagid": "cursor.com/editor/python",
      "bidfloor": 1.50,
      "bidfloorcur": "USD",
      "secure": 1,
      "native": {
        "ver": "1.2",
        "request": "{\"ver\":\"1.2\",\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":60}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":1200,\"h\":628}},{\"id\":4,\"required\":1,\"data\":{\"type\":12,\"len\":25}}]}"
      }
    }],
    "site": {
      "id": "site_cursor_1",
      "domain": "cursor.com",
      "page": "https://cursor.com/editor",
      "keywords": "python debugging traceback editor",
      "publisher": { "id": "pub_cursor", "name": "Cursor Labs" }
    },
    "device": {
      "ua": "Mozilla/5.0 ...",
      "ip": "192.0.2.1",
      "geo": { "country": "USA", "region": "us-west" },
      "devicetype": 2
    },
    "user": { "id": "anon_sess_a1b2c3", "ext": { "session_len_min": 42 } },
    "source": { "tid": "tx_42f8", "fd": 1 },
    "bcat": ["IAB7-39", "IAB8-18"],
    "badv": ["bad-competitor.com"]
  }'

If your DSP already computes MCP signals server-side, pass them explicitly via imp.ext.mcp_context β€” they will override any values the adapter would otherwise infer. Example:

{ "imp": [{ "id": "1", "ext": { "mcp_context": {
  "intent": "debug_py",
  "mcp_tool": "filesystem.read",
  "host": "cursor.com",
  "region": "us-west",
  "session_len": 42
} } }] }

No-bid codes (NBR)

NBRHTTPMeaning
β€”204No eligible campaign (price floor, brand safety, targeting).
2400Invalid request β€” missing id, imp[], or format.
1500Technical error; safe to retry with backoff.

Bid response

On a win, the adapter returns a standard BidResponse with a single seatbid (seat = boostboss). Each bid carries CPM price (USD), creative markup, tracking URLs with the standard auction macros, and β€” critically β€” a bid.ext.benna attribution block that tells you exactly why the bid was scored the way it was.

BidResponse β€” 200 OKCopy
{
  "id": "bid_req_9a8b7c",
  "bidid": "bbx_b1f42a6c3d9e",
  "cur": "USD",
  "seatbid": [{
    "seat": "boostboss",
    "bid": [{
      "id": "bbx_b1f42a6c3d9e",
      "impid": "1",
      "price": 148.20,
      "adid": "cam_datadog_001",
      "crid": "cr_datadog_apm_v3",
      "cid": "cam_datadog_001",
      "adomain": ["datadoghq.com"],
      "cat": ["IAB19-6"],
      "nurl": "https://boostboss.ai/api/rtb?op=win&imp=1&bid=bbx_b1f42a6c3d9e&price=${AUCTION_PRICE}",
      "lurl": "https://boostboss.ai/api/rtb?op=loss&imp=1&bid=bbx_b1f42a6c3d9e&reason=${AUCTION_LOSS}",
      "adm": "{\"native\":{\"ver\":\"1.2\",\"assets\":[...],\"link\":{\"url\":\"https://...\"},\"eventtrackers\":[...]}}",
      "ext": {
        "benna": {
          "model_version": "benna-rc3-2026.04.14",
          "p_click": 0.0500,
          "p_convert": 0.0119,
          "latency_ms": 4,
          "signal_contributions": [
            { "signal": "intent=debug_py",    "weight": 0.34, "lift": 33.5 },
            { "signal": "host=cursor.com",    "weight": 0.18, "lift": 21.9 },
            { "signal": "region=us-west",     "weight": 0.09, "lift": 11.2 }
          ]
        }
      }
    }]
  }]
}

Key fields

FieldTypeNotes
pricenumberFirst-price CPM in USD. Always β‰₯ imp.bidfloor.
adomainstring[]Advertiser domain(s) for brand-safety checks.
admstringJSON for native (1.2 payload), HTML for banner, VAST 4.2 XML for video.
nurlstringWin notice URL β€” substitute ${AUCTION_PRICE}, fire on win.
lurlstringLoss notice URL β€” substitute ${AUCTION_LOSS}, fire on loss.
ext.bennaobjectAttribution block β€” model version, p_click, p_convert, per-signal lift.

Win / loss notices

Both notices are idempotent GETs that return a 43-byte 1Γ—1 transparent GIF with Content-Type: image/gif. Fire them when your DSP resolves the auction. Substitute the standard OpenRTB macros before fetching:

# Win: substitute ${AUCTION_PRICE} with the clearing price in USD
GET /api/rtb?op=win&imp=1&bid=bbx_b1f42a6c3d9e&price=148.20

# Loss: substitute ${AUCTION_LOSS} with the OpenRTB loss reason code
GET /api/rtb?op=loss&imp=1&bid=bbx_b1f42a6c3d9e&reason=2

Common loss reasons (OpenRTB Β§5.24): 1 internal error, 2 impression opportunity expired, 3 invalid bid response, 102 below deal floor, 1001 lost to higher bid. BBX logs every notice and reconciles against Benna's internal price book.

Adapter status

A lightweight metadata endpoint for DSP discovery and health checks. Returns adapter version, supported formats, and Benna build info β€” useful for sandboxed QA and for your bidder's capability-negotiation phase.

GET /api/rtb?op=statusCopy
{
  "adapter": "bbx-rtb-adapter",
  "adapter_version": "1.0.0",
  "openrtb_version": "2.6",
  "auction_type": 1,
  "supported_formats": ["native", "banner", "video"],
  "native_version": "1.2",
  "vast_version": "4.2",
  "benna_version": "benna-rc3-2026.04.14",
  "currencies": ["USD"]
}

OpenRTB β†’ MCP signal map

BBX bridges OpenRTB's cookie/URL world and the MCP signal world that Benna actually scores on. The table below shows how the adapter infers MCP signals from standard OpenRTB fields. Any explicit imp.ext.mcp_context always wins β€” set it if your DSP has richer signal than the adapter can derive.

MCP signalInferred fromRules
hostsite.domain β†’ app.bundle β†’ app.name β†’ imp.tagidFirst non-empty wins. Used as a strong persona proxy.
intentsite.keywords + site.page + imp.tagidVocabulary match: debug|error|traceback|bug β†’ debug_*; doc|tutorial|guide|learn β†’ docs_lookup; language tokens (python, rust, …) attach a suffix.
mcp_toolimp.ext.mcp_context.mcp_tool onlyNot inferred β€” DSPs must pass it explicitly. Highest-lift signal when supplied.
regiondevice.geo.region → device.geo.countryCountry mapping: USA→us-west, CAN→us-east, DEU/GBR/FRA→eu-central, JPN/KOR/SGP→apac, others→global.
session_lenuser.ext.session_len_minInteger minutes. Bucketed at <10 / 10–30 / >30. Sessions > 30 min carry the strongest lift.
i
Brand safety. Standard OpenRTB bcat (blocked IAB categories) and badv (blocked advertiser domains) are honored at the campaign-eligibility layer. A request that blocks every eligible campaign returns 204 No Content, not a 400.

Response headers

Every BidResponse carries three BBX-specific headers for observability:

x-openrtb-version:     2.6
x-bbx-adapter:         bbx-rtb-adapter/1.0.0
x-bbx-processing-ms:   4

Changelog

v1.0.0 β€” April 2026

Initial public release of the Boost Boss API. Includes Fetch Ad, Beacon, Campaign Management, Stats, Benna scoring, OpenRTB 2.6 adapter (BBX), and SDKs for TypeScript, Python, Go, Swift, and Kotlin.

v0.9.0-beta β€” March 2026

Closed beta with 12 launch partners. Added MCP-native targeting signals, frequency capping, and webhook support.

Was this page helpful?

Help us improve the docs by sharing your feedback.