Publisher Integration Guide
OpenRTB 2.5 · Version 1.0
This guide covers all required and optional fields for the Digibid Ads OpenRTB bid request endpoint, per-DC endpoint URLs, complete request/response examples, and integration best practices.
1. Overview
Digibid Ads implements the OpenRTB 2.5 specification.
Publishers send a JSON bid request over HTTPS POST to the /ortb/adx endpoint.
The exchange runs a real-time auction among demand partners and returns the winning bid in an OpenRTB bid response.
Field status legend: Required — omission breaks the protocol Recommended — strongly advised for fill quality Optional — provides additional context Cond. — required only in specific contexts
Method: POST only | Content-Type:
application/jsonBody size limit: 1 MB | Encoding: gzip accepted (
Content-Encoding: gzip)Timeout: controlled by
tmax in the request (default 100 ms, clamped to 100 – 1000 ms)
2. Endpoints by Data Center
Choose the endpoint closest to your ad server to minimize latency.
Each DC endpoint is fully independent; the pos_id assigned to you is valid across all DCs.
🇺🇸 US East
pos_id resolution order: 1) URL query parameter ?pos_id=N, 2) ext.pos_id, 3) first imp tag_id.POST https://adx-use.digibid.com/ortb/adx?pos_id=101
3. Quick Start
Below is the minimal valid banner bid request. Replace pos_id with your assigned value and POST.
Minimal Banner Request{
"id": "req-001",
"imp": [{
"id": "1",
"banner": { "w": 320, "h": 50 },
"bidfloor": 0.50,
"bidfloorcur": "USD"
}],
"app": {
"bundle": "com.yourcompany.app",
"publisher": { "id": "YOUR_PUBLISHER_ID" }
},
"device": {
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 ...)",
"ip": "203.0.113.45",
"ifa": "550e8400-e29b-41d4-a716-446655440000"
},
"ext": { "pos_id": 101 },
"at": 2,
"tmax": 300
}
curl
curl -s -X POST https://adx-use.digibid.com/ortb/adx \
-H "Content-Type: application/json" \
-d @request.json
4. Bid Request Fields
4.1 Top-Level Object
| Field | Type | Status | Description |
|---|---|---|---|
id | string | Required | ID of the bid request, assigned by the exchange, and unique for the exchange's subsequent tracking of the responses. Recommended: UUID v4 or similar. |
imp | array<Imp> | Required | Array of Imp objects representing the impressions offered. At least 1 Imp object is required. |
app | object | Recommended | Details about the publisher's app (non-browser applications). Only applicable for app traffic. A bid request must not contain both app and site. |
site | object | Recommended | Details about the publisher's website. Only applicable for web traffic. A bid request must not contain both site and app. |
device | object | Recommended | Details about the user's device to which the impression will be delivered. |
at | integer | Optional | Auction type, where 1 = First Price, 2 = Second Price Plus. Default: 2. |
tmax | integer | Optional | Maximum time in milliseconds the exchange allows for bids to be received including Internet latency to avoid timeout. Default: 100. Clamped to [100, 1000]. |
regs | object | Optional | A Regs object that specifies any industry, legal, or governmental regulations in force for this request (GDPR, CCPA). |
user | object | Optional | Details about the human user of the device; the advertising audience. user.consent carries the GDPR Transparency and Consent string (TCF v2). |
ext | object | Cond. | Exchange-specific extensions. pos_id may be in ext or first imp tag_id if not provided via URL param. |
4.2 Impression Object (imp)
| Field | Type | Status | Description |
|---|---|---|---|
id | string | Required | A unique identifier for this impression within the bid request (typically starts with "1" and increments). Echoed as impid in the response. |
banner | object | Cond. | A Banner object; required if this impression is offered as a banner ad opportunity. |
video | object | Cond. | A Video object; required if this impression is offered as a video ad opportunity. |
native | object | Cond. | A Native object; required if this impression is offered as a native ad opportunity. |
bidfloor | float | Optional | Minimum bid for this impression expressed in CPM. Bids below this value are filtered. Default: 0. |
bidfloorcur | string | Optional | Currency specified using ISO-4217 alpha codes for the bid floor. Default: "USD". |
rwdd | integer | Optional | Indicates whether the user receives a reward for viewing the ad, where 0 = no, 1 = yes. Only ad groups with position_type_id = 6 qualify. |
instl | integer | Optional | 1 = the ad is interstitial or full screen, 0 = not interstitial. Default: 0. |
4.3 Banner Object
| Field | Type | Status | Description |
|---|---|---|---|
format | array<Format> | Recommended | Array of {w, h} objects representing the banner sizes permitted. If none are specified, use of w and h is highly recommended. |
w | integer | Recommended | Exact width in device-independent pixels (DIPS); recommended if no format objects are specified. |
h | integer | Recommended | Exact height in device-independent pixels (DIPS); recommended if no format objects are specified. |
btype | array<int> | Optional | Blocked banner ad types. Values: 1=XHTML Text, 2=XHTML Banner, 3=JavaScript, 4=iframe. |
battr | array<int> | Optional | Blocked creative attributes. Refer to IAB AdCOM List: Creative Attributes. |
pos | integer | Optional | Ad position on screen. Refer to IAB AdCOM List: Placement Positions. 1 = above the fold. |
4.4 Video Object
| Field | Type | Status | Description |
|---|---|---|---|
mimes | array<string> | Required | Content MIME types supported (e.g. "video/mp4"). At least one must be specified. |
minduration | integer | Recommended | Minimum video ad duration in seconds. Bids shorter than this are filtered. Default: 0. |
maxduration | integer | Recommended | Maximum video ad duration in seconds. Bids longer than this are filtered. |
protocols | array<int> | Recommended | Array of supported video bid response protocols. Refer to IAB AdCOM List: Creative Subtypes – Video. E.g. [2, 3] = VAST 2.0, 3.0. |
w | integer | Recommended | Width of the video player in device-independent pixels (DIPS). |
h | integer | Recommended | Height of the video player in device-independent pixels (DIPS). |
skip | integer | Optional | Indicates if the player will allow the video to be skipped, where 0 = no, 1 = yes. Skip tracking events are included in the VAST response when enabled. |
linearity | integer | Optional | Indicates if the impression must be linear, nonlinear, etc. If none specified, assume all are allowed. 1 = Linear (In-Stream), 2 = Non-Linear. Refers to expected VAST response, not player type. |
placement | integer | Optional | Video placement type (IAB). 1 = In-Stream, 5 = Interstitial. Note: deprecated in OpenRTB 2.6 in favor of plcmt. |
4.5 Native Object
| Field | Type | Status | Description |
|---|---|---|---|
request | string (JSON) | Required | Request payload complying with the Native Ad Specification. Serialized JSON string containing an assets array (title, image, icon, video, data). |
ver | string | Recommended | Version of the Dynamic Native Ads API to which request complies; highly recommended for efficient parsing. Default: "1.2". The response ver matches the request. For ver 1.0 or 1.1, the response uses imptrackers (string array) for impression tracking; for 1.2, it uses eventtrackers. |
Native Asset Types
| Asset | required=1 behavior |
|---|---|
| title | Ad must supply a title ≤ len characters. |
| img (type=3, main image) | Ad must supply a main image meeting w/h or wmin/hmin. Non-matching bids are filtered. |
| img (type=1, icon) | Ad must supply an icon meeting wmin/hmin. Bids without an icon are filtered. |
| video | Ad must supply a VAST video. Image-only ads are excluded from the auction. |
| data | Supplementary fields (brand, desc, rating). Typically required=0. |
4.6 App / Site Object
| Field | Type | Status | Description |
|---|---|---|---|
app.bundle | string | Required | Application bundle / package name. E.g. "com.yourcompany.appname". Used for app-bundle targeting and frequency capping. |
app.id | string | Optional | Internal app ID in your system. |
app.publisher.id | string | Recommended | Your Publisher ID assigned by Digibid. E.g. "42". |
app.domain | string | Optional | App or associated domain. Used for domain-based targeting. |
site.domain | string | Cond. | Domain of the web page. Required when using the site object. |
site.publisher.id | string | Recommended | Your Publisher ID assigned by Digibid. |
4.7 Device Object
| Field | Type | Status | Description |
|---|---|---|---|
ua | string | Recommended | Browser user agent string. This field represents a raw user agent string from the browser. Used for device type, OS, and make detection. |
ip | string | Recommended | IPv4 address closest to the device. Used for geo-targeting. Falls back to X-Forwarded-For header if neither ip nor ipv6 is set. |
ipv6 | string | Optional | IP address closest to the device as IPv6. Takes priority over ip for geo resolution. |
ifa | string | Optional | ID sanctioned for advertiser use in the clear (i.e., not hashed) — IDFA on iOS, GAID on Android. Used for frequency capping and click tracking. Strongly recommended. |
lmt | integer | Optional | "Limit Ad Tracking" signal commercially endorsed (e.g., iOS, Android), where 0 = tracking is unrestricted, 1 = tracking must be limited per commercial guidelines. |
os | string | Optional | Device operating system. E.g. "iOS", "Android". |
make | string | Optional | Device make (manufacturer). E.g. "Apple", "Samsung". |
model | string | Optional | Device model. E.g. "iPhone", "Pixel 7". |
devicetype | integer | Optional | The general type of device. Refer to IAB AdCOM List: Device Types. 1=Mobile/Tablet, 2=PC, 4=Phone, 5=Tablet. |
4.8 Privacy Signals
| Field | Type | Description |
|---|---|---|
regs.gdpr | integer | 1 if GDPR applies. Exchange checks user.consent. |
regs.us_privacy | string | CCPA consent string (4-char IAB format). E.g. "1YNN". |
regs.ext.us_privacy | string | Fallback CCPA string if regs.us_privacy is absent. |
user.consent | string | GDPR consent string (TCF v2, Base64 encoded). |
4.9 Extension Object (ext)
| Field | Type | Status | Description |
|---|---|---|---|
ext.pos_id | integer | Cond. | Position ID assigned by Digibid. Resolution order: URL param ?pos_id=N > ext.pos_id > first imp tag_id. At least one source must provide a valid pos_id. |
5. Bid Response Fields
The exchange always returns HTTP 200 OK. An empty seatbid array (or absent) means no winning bid (no fill). The response structure follows the OpenRTB 2.5 BidResponse / SeatBid / Bid object model.
| Field | Type | Status | Description |
|---|---|---|---|
id | string | Required | ID of the bid request to which this is a response. Echoes back the request id. |
seatbid | array | Cond. | Array of SeatBid objects; at least 1 required if a bid is to be made. Empty array indicates no fill. |
bidid | string | Optional | Bidder generated response ID to assist with logging/tracking. Format: {txid}_{impid}. |
cur | string | Optional | Bid currency using ISO-4217 alpha codes. Default: "USD". |
seatbid[].seat | string | Optional | ID of the buyer seat on whose behalf this bid is made. Always "Digibid". |
seatbid[].bid[].id | string | Required | Bidder generated bid ID to assist with logging/tracking. Format: {txid}_{impid}. |
seatbid[].bid[].impid | string | Required | ID of the Imp object in the related bid request. Echoes the impression id from the request. |
seatbid[].bid[].price | float | Required | Bid price expressed as CPM, although the actual transaction is for a unit impression only. Value represents the publisher's net revenue after margin deduction (USD). |
seatbid[].bid[].adm | string | Optional | Optional means of conveying ad markup in case the bid wins; supersedes the win notice if markup is included in both. HTML for banner, VAST XML for video, JSON string for native. Direct banner inventory uses an IAB-style script (clickTag, platform click tracker, third-party click URLs, handleAdClick) plus a wrapped creative; OpenRTB/DSP-sourced banner markup may still use ${CLICK_URL} + URL-encoded click URL. |
seatbid[].bid[].nurl | string | Optional | Win notice URL called by the exchange if the bid wins (not necessarily indicative of a delivered, viewed, or billable ad). Must be fired upon rendering the ad. |
seatbid[].bid[].lurl | string | Optional | Loss notice URL called by the exchange when the bid does not win. Includes loss=${AUCTION_LOSS}; the exchange substitutes the macro with the auction loss reason code when firing the URL. |
seatbid[].bid[].adid | string | Optional | ID of a preloaded ad to be served if the bid wins. |
seatbid[].bid[].crid | string | Optional | Creative ID to assist with ad quality checking. |
seatbid[].bid[].w | integer | Optional | Width of the creative in device-independent pixels (DIPS). |
seatbid[].bid[].h | integer | Optional | Height of the creative in device-independent pixels (DIPS). |
6. Full Examples
6.1 Banner Ad Request
Request JSON{
"id": "banner-req-001",
"imp": [
{
"id": "1",
"banner": {
"w": 320,
"h": 50,
"format": [{ "w": 320, "h": 50 }, { "w": 728, "h": 90 }],
"btype": [1, 2],
"pos": 1
},
"bidfloor": 0.50,
"bidfloorcur": "USD"
}
],
"app": {
"id": "app-001",
"bundle": "com.example.newsapp",
"publisher": { "id": "42" }
},
"device": {
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X) AppleWebKit/605.1.15",
"ip": "203.0.113.45",
"ifa": "550e8400-e29b-41d4-a716-446655440000",
"os": "iOS",
"make": "Apple",
"devicetype": 4
},
"ext": { "pos_id": 101 },
"at": 2,
"tmax": 300
}
6.2 Video Ad Request
Request JSON{
"id": "video-req-002",
"imp": [
{
"id": "1",
"video": {
"mimes": ["video/mp4"],
"w": 640,
"h": 480,
"minduration": 5,
"maxduration": 30,
"protocols": [2, 3, 5, 6],
"linearity": 1,
"skip": 1,
"placement": 1
},
"bidfloor": 1.00,
"bidfloorcur": "USD"
}
],
"app": {
"bundle": "com.example.videoapp",
"publisher": { "id": "42" }
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 13; Pixel 7) AppleWebKit/537.36",
"ip": "198.51.100.10",
"ifa": "38400000-8cf0-11bd-b23e-10b96e40000d",
"os": "Android",
"make": "Google",
"devicetype": 4
},
"ext": { "pos_id": 202 },
"at": 1,
"tmax": 500
}
6.2b Rewarded Video Request
Request JSON{
"id": "reward-req-003",
"imp": [
{
"id": "1",
"video": {
"mimes": ["video/mp4"],
"w": 640,
"h": 480,
"minduration": 15,
"maxduration": 30,
"protocols": [3, 6],
"linearity": 1
},
"bidfloor": 2.00,
"bidfloorcur": "USD",
"rwdd": 1
}
],
"app": { "bundle": "com.example.game", "publisher": { "id": "42" } },
"device": {
"ua": "Mozilla/5.0 (iPhone; CPU iPhone OS 16_0 like Mac OS X)",
"ip": "198.51.100.20",
"ifa": "6D92078A-8246-4479-8C7D-A7CF568C5E9E"
},
"ext": { "pos_id": 303 },
"at": 1,
"tmax": 500
}
6.3 Native Ad Request
Request JSON{
"id": "native-req-004",
"imp": [
{
"id": "1",
"native": {
"request": "{\"ver\":\"1.2\",\"layout\":6,\"adunit\":2,\"plcmtcnt\":1,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":100}},{\"id\":2,\"required\":1,\"img\":{\"type\":3,\"w\":300,\"h\":250}},{\"id\":3,\"required\":1,\"img\":{\"type\":1,\"wmin\":50,\"hmin\":50}},{\"id\":4,\"required\":0,\"data\":{\"type\":2,\"len\":90}}]}",
"ver": "1.2"
},
"bidfloor": 0.80,
"bidfloorcur": "USD"
}
],
"app": { "bundle": "com.example.readingapp", "publisher": { "id": "42" } },
"device": {
"ua": "Mozilla/5.0 (iPad; CPU OS 16_0 like Mac OS X)",
"ip": "192.0.2.100",
"ifa": "7C553443-9D8E-4BE8-B11E-C3D8D3A7B1F3",
"devicetype": 5
},
"ext": { "pos_id": 404 },
"at": 2,
"tmax": 300
}
6.4 Bid Response
Response JSON – With Bid{
"id": "banner-req-001",
"bidid": "txid-abc123_1",
"cur": "USD",
"seatbid": [
{
"seat": "Digibid",
"bid": [
{
"id": "txid-abc123_1",
"impid": "1",
"price": 0.42,
"adm": "<div>...banner HTML...</div>",
"nurl": "https://ads-us-east.digibid.com/tracking?txid=txid-abc123&type=9&...",
"adid": "dsp-ad",
"crid": "cr-001",
"w": 320,
"h": 50
}
]
}
]
}
Response JSON – No Fill{
"id": "banner-req-001",
"seatbid": []
}
6.5 Pounder Request and Response (with ADM Example)
A pounder (popunder) request has imp objects with no banner, native, or video — only fields such as id, instl, secure.
Pounder Request JSON{
"id": "5ccab55d-a5a5-5555-5e55-aa5b5b55b5a5",
"at": 1,
"imp": [
{
"id": "555555555",
"instl": 1,
"secure": 0
}
],
"site": {
"id": "555555",
"domain": "example.com",
"cat": ["IAB25-3"],
"page": "http://example.com"
},
"device": {
"ua": "Mozilla/5.0 (Linux; Android 10; M2006C3LG) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.120 Mobile Safari/537.36",
"ipv6": "2a00:1756:0a1e:a100:1571:8b01:f36:1d8f",
"ifa": "5974d090-4516-4565-933d-69c79c9abf75",
"geo": {
"country": "UKR",
"utcoffset": 120
},
"language": "ru",
"os": "Android",
"js": 1,
"ext": {
"remote_addr": "203.0.113.50",
"x_forwarded_for": ""
}
},
"user": {
"id": "55f7d5acada5b5.555555555555555555"
},
"bcat": ["IAB24", "IAB25", "IAB26"],
"badv": ["example.com", "example.ru", "example.net"]
}
Pounder Response JSON (with adm example){
"id": "5ccab55d-a5a5-5555-5e55-aa5b5b55b5a5",
"bidid": "txid-xxx_imp-1",
"cur": "USD",
"seatbid": [
{
"seat": "Digibid",
"bid": [
{
"id": "txid-xxx_imp-1",
"impid": "555555555",
"price": 0.01,
"nurl": "https://tracking.example.com/tracking?txid=txid-xxx&did=...&imp=1&type=9&...",
"burl": "https://tracking.example.com/tracking?txid=txid-xxx&did=...&imp=1&type=10&...",
"lurl": "https://tracking.example.com/tracking?txid=txid-xxx&did=...&imp=1&type=11&loss=${AUCTION_LOSS}&...",
"adm": "<?xml version=\"1.0\" encoding=\"UTF-8\"?><ad><popunderAd><url><![CDATA[https://www.landing.example/]]></url></popunderAd></ad>\n<img src=\"https://tracking.example.com/tracking?txid=txid-xxx&imp=1&type=1&iv=1&...\" width=\"1\" height=\"1\" style=\"display:none;border:0;\" alt=\"\" aria-hidden=\"true\"/>",
"adid": "266",
"adomain": ["landing.example"],
"cid": "1",
"crid": "27",
"cattax": 3,
"cat": ["IAB25-3"],
"w": 192,
"h": 192
}
]
}
]
}
ADM (ad markup) for pounder: adm is XML with a popunderAd block; url inside CDATA is typically a data:text/html;base64,... page that fires click trackers then navigates to the landing URL (fallback: raw landing URL). This is followed by one or more 1×1 <img> impression tracking pixels. The exchange substitutes ${AUCTION_PRICE} in nurl/burl/lurl when firing; lurl includes loss=${AUCTION_LOSS} for loss reason.
7. Error Codes
| HTTP Status | Cause |
|---|---|
200 OK | Successful response. seatbid may be empty (no fill). |
400 Bad Request | Malformed JSON, empty body, missing imp, invalid or unrecognized pos_id. |
405 Method Not Allowed | Request method is not POST. |
413 Request Entity Too Large | Request body exceeds 1 MB. |
8. FAQ
How do I get a pos_id?
Contact your Digibid account manager. A pos_id represents a specific ad placement configuration
(publisher margin, position type, allowed formats). One publisher may have multiple pos_ids for different placements.
What happens if there is no fill?
The endpoint always returns HTTP 200 OK with an empty seatbid array.
Never interpret a 200 response as a guaranteed fill.
Which DC should I use?
Choose the DC geographically closest to your ad server to minimize latency. Contact your Digibid account manager if you need guidance on DC selection.
Can I send gzip-compressed requests?
Yes. Set Content-Encoding: gzip and gzip the JSON body.
Recommended for large native requests.
Digibid Ads Publisher Integration Guide v1.0 · For support: publisher-support@digibid.com