Migration Guide: OpenRTB to Core API
This guide walks you through migrating from the legacy OpenRTB 2.6 interface to the Adlocaite Core API. The Core API provides better performance, more features, and a simpler integration model.
OpenRTB 2.6 is deprecated
The OpenRTB 2.6 interface is maintained for legacy compatibility only and will be phased out. All new integrations should use the Core API. Existing integrations should migrate at the earliest opportunity.
Why migrate?
The Core API was built specifically for DOOH advertising workflows and removes the limitations imposed by the OpenRTB protocol.
What you gain
- Name
Real-time offer control- Description
Accept or reject offers explicitly instead of relying on auction mechanics. You decide which ads run on your screens.
- Name
Lower latency- Description
Simple REST calls (GET/POST) instead of complex BidRequest/BidResponse serialization. No auction overhead.
- Name
Full feature set- Description
Access to playout tracking, billing codes, demo mode, VAST XML on demand, and external screen IDs.
- Name
Simpler integration- Description
Three endpoints instead of a full OpenRTB implementation. No VAST parsing required for basic integrations.
- Name
Better error handling- Description
Clear HTTP status codes and human-readable error messages instead of no-bid reason codes.
What changes
- Name
Protocol- Description
From OpenRTB 2.6 BidRequest/BidResponse to simple REST API (JSON).
- Name
Authentication- Description
Same Bearer token authentication -- no changes needed.
- Name
Screen identification- Description
From
imp.tagidto path parameter. UUIDs recommended, external IDs supported.
- Name
Pricing- Description
From CPM-based bidfloor calculations to direct bid price in cents.
- Name
Creative delivery- Description
From mandatory VAST XML to direct asset URLs. VAST available optionally via
?vast=true.
Key differences
| Aspect | OpenRTB 2.6 (Legacy) | Core API |
|---|---|---|
| Request method | POST with JSON body | GET (offers) / POST (response, playout) |
| Screen ID | imp[0].tagid | URL path parameter |
| Pricing model | CPM bidfloor x totalaud | Direct min_bid_cents |
| Auction type | Fixed Price only (at=3) | No auction -- direct offer/accept model |
| Creative format | VAST 4.0 XML (always) | Direct asset URL (VAST optional) |
| Offer acceptance | Implicit (bid wins auction) | Explicit accept/reject call |
| Playout tracking | Via VAST tracking pixels | Dedicated endpoint with metadata |
| No-match response | HTTP 204 or empty seatbid + NBR code | HTTP 404 with clear error message |
Migration steps
Step 1: Map your screen identifiers
In OpenRTB, screens are identified via imp[0].tagid (External Screen ID). The Core API supports both UUIDs and external IDs:
- If you have Adlocaite UUIDs: Use them directly in the path -- this is recommended for best performance
- If you only have external IDs: Use the
/external-id/endpoint variant (see External Screen IDs)
Step 2: Replace the bid request with an offer request
Instead of constructing a full OpenRTB BidRequest, make a simple GET request:
Before vs. After
curl -X POST https://api.adlocaite.com/functions/v1/openrtb-2-6/bid \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": "auction-12345",
"imp": [{
"id": "1",
"tagid": "screen-ext-001",
"video": {
"mimes": ["video/mp4"],
"w": 1920,
"h": 1080
},
"pmp": {
"deals": [{
"id": "deal-001",
"bidfloor": 2.50,
"at": 3
}]
},
"ext": {
"totalaud": 119.47
}
}],
"at": 3
}'
Note the pricing difference: in OpenRTB, the minimum bid is calculated as (bidfloor x totalaud) / 10. In the Core API, you pass min_bid_cents directly.
Step 3: Handle the simpler response
The Core API returns a flat JSON object instead of the nested OpenRTB BidResponse:
Response comparison
{
"id": "auction-12345",
"seatbid": [{
"bid": [{
"id": "bid-uuid-12345",
"impid": "1",
"price": 2.50,
"adm": "<?xml version=\"1.0\"?>...<VAST>...</VAST>",
"dealid": "deal-001",
"w": 1920,
"h": 1080
}]
}],
"cur": "EUR"
}
Step 4: Add explicit offer acceptance
This is the biggest workflow change. In OpenRTB, winning a bid implicitly means the ad will be shown. In the Core API, you must explicitly accept or reject offers:
Accept an offer
curl -X POST https://api.adlocaite.com/functions/v1/api/offers/response/[offer_id] \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "accept",
"accepted_price_cents": 253
}'
This returns a deal_id that you use for playout tracking.
Step 5: Implement playout tracking
Replace VAST tracking pixels with the dedicated playout confirmation endpoint:
Confirm playout
curl -X POST "https://api.adlocaite.com/functions/v1/api/playout/confirm/[deal_id]" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"played_at": "2025-10-10T14:30:00Z",
"duration_seconds": 15,
"completion_rate": 100
}'
Endpoint mapping
- Name
POST /functions/v1/openrtb-2-6/bid- Description
Replaced by GET
/functions/v1/api/offers/request/[screenId]-- Offers documentation
- Name
VAST tracking pixels- Description
Replaced by POST
/functions/v1/api/playout/confirm/[dealId]-- Playout Tracking documentation
- Name
(No equivalent)- Description
New: POST
/functions/v1/api/offers/response/[offerId]for explicit accept/reject -- Offers documentation
Request & response comparison
Field mapping
Use this table to map your existing OpenRTB field handling to the Core API:
- Name
BidRequest.imp[0].tagid- Type
- string
- Description
Maps to the
[screenId]path parameter in the offer request URL.
- Name
BidRequest.imp[0].pmp.deals[0].bidfloor- Type
- number
- Description
Replaced by the
min_bid_centsquery parameter. Convert using:min_bid_cents = (bidfloor x totalaud) / 10.
- Name
BidResponse.seatbid[0].bid[0].price- Type
- number
- Description
Maps to
bid_price_centsin the offer response (note: cents, not EUR).
- Name
BidResponse.seatbid[0].bid[0].adm- Type
- string
- Description
Replaced by
asset_urlfor direct asset access. Use?vast=trueif you still need VAST XML.
- Name
BidResponse.seatbid[0].bid[0].dealid- Type
- string
- Description
No longer in the offer response. The
deal_idis returned when you accept the offer.
Playout tracking
The Core API provides richer playout tracking compared to VAST tracking pixels:
| Feature | OpenRTB (VAST pixels) | Core API |
|---|---|---|
| Confirmation | Fire-and-forget pixel | POST with response confirmation |
| Duration tracking | Not available | duration_seconds |
| Completion rate | Not available | completion_rate (0-100) |
| Player info | Not available | player_version, screen_resolution |
See the full Playout Tracking documentation for details.
Testing your migration
The Core API provides built-in demo mode for testing without affecting production data.
Demo offer request
Request a demo offer
curl -X GET "https://api.adlocaite.com/functions/v1/api/offers/request/test-display-test" \
-H "Authorization: Bearer YOUR_API_KEY"
Demo offer acceptance
Accept the demo offer
curl -X POST https://api.adlocaite.com/functions/v1/api/offers/response/test-offer-test \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action": "accept",
"accepted_price_cents": 250
}'
Demo playout confirmation
Confirm demo playout
curl -X POST "https://api.adlocaite.com/functions/v1/api/playout/confirm/test-deal-test" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"duration_seconds": 15,
"completion_rate": 100
}'
All demo endpoints return realistic responses without modifying any data. Use the Staging environment for integration testing with real API keys.
Need help migrating? Contact our integration team at support@adlocaite.com for assistance with your migration.