Bid Stream or Request Forwarding
When advertisers take control of their media-buying and in-houses their programmatic spends, the outcomes and intent are not just limited to gain control over where to spend by modifying the targeting criteria for a campaign or a set of campaigns. They get much more than an interface to set up the campaigns and monitor the performance. Advertisers can receive the stream of the eligible bid requests for their campaigns which can enhance advertiser’s capabilities by enabling them to drill down deeper into the available inventory, build ML models, and hence leverage the power of the data to achieve goals very specific to their app & business needs.
GeoSpot Media enables this learning for advertisers by providing an Out-of-Box solution where advertisers need not code anything for receiving & logging eligible bid-requests on their servers.
One of the benefits of taking control of media buying and in-housing programmatic is that advertisers can enhance their learning about available inventory and leverage that learning to build ML models specific to their app and business needs. GeoSpot Media enables this learning for advertisers seamlessly.
To enable advertisers to leverage the bid-request data, GeoSpot Media provides an easy to integrate solution:
How it works?
GeoSpot Media receives bid requests from OpenRTB compliant exchanges (>70bn bid requests/day)
Eligible campaigns are filtered based on the bid request received. Eligibility of campaigns is decided based on multiple attributes like targeting criteria (Geo, OS, Audiences etc), frequency capping, budget pacing, creative formats and more.
For example, 4 campaigns of 3 different advertisers are eligible for the received bid request. Out of this, Advertiser 2 has enabled bid forwarding and logging functionality with GeoSpot Media.
Because this bid request is eligible for a campaign of Advertiser 2, the GeoSpot Media bidder will forward this bid request to Advertiser 2 API endpoint. This can be a simple REST API
The advertiser server receives the forwarded bid request and logs it / pushes it into a queue and run jobs to process this data
This data can be fed to different consumers such as a ML model optimizing CPI/ RoAS or any other business objective
Key Points
The advertiser receives only those bid requests for which their campaigns were eligible. This ensures that the advertiser system is not overloaded with bid requests which are not of interest to them.
The advertiser will need to ensure that their endpoint / server is able to handle the required QPS.
The advertiser will receive hashed Device IDs (SHA1) as part of bid request and will not receive raw IDFA/GAID. At GeoSpot Media, all our solutions honour user privacy and consent.
The bid request forwarding integration can be enhanced to support BYOA (Bring your own Algorithm) integration as well i.e. GeoSpot Media will not only forward the bid request to the advertiser but will also wait for the advertiser endpoint to query its model and reply with a bid price that it wants to bid. The BYOA integration has much stricter latency requirements and details will be covered in a separate doc.
Production Environment Setup
Reach out to your contact person in GeoSpot Media to pass on your company’s or POCs GitHub id. We will provide access to the code repository for you to download the code or clone the GitHub repository.
Install maven and Java 8
Clone the repository :
git clone https://<user-name>@github.com/shrutiagarwal-geo/Geospot-BYOA-Kit.git
Go in to the folder and do mvn package dependency:copy-dependencies
Start the java process with root user as it needs to run on port 80
Command to run java
java -server -Xms8g -Xmx8g -cp "target/dependency/*:target/byoakit-1.0-SNAPSHOT.jar" io.kayzen.byoakit.launcher.BYOAKitLauncher -env production
If running under supervisor, here is the config
[program: Geospot-BYOA-Kit]
directory=<path to cloned repo>
command=java -server -Xms8g -Xmx8g -cp "target/dependency/*:target/byoakit-1.0-SNAPSHOT.jar" io.kayzen.byoakit.launcher.BYOAKitLauncher -env production user=root autostart=true autorestart=true redirect_stderr = True startretries = 3 stdout_logfile=<path to cloned repo>/logs/supervisord.log stdout_logfile_maxbytes=20MB stdout_logfile_backups=10 stopasgroup = true killasgroup = true
Sample OpenRTB Bid Request
{
"app": {
"bundle": "com.xxx",
"cat": [
"IAB3"
],
"id": "dc852dbcdf944f9f8c80ab3f281fd967",
"name": "Truecaller - Caller ID & Block",
"publisher": {
"id": "34",
"name": "xxx publisher"
},
"ver": "6.41"
},
"at": 2,
"badv": [
"badoo.com",
"bigfish.com",
"callapp.com",
"holaa.me",
"ktcs.co.kr",
"m.pkr.com",
"mrnumber.com",
"nap4319.casino.bigfish.com",
"pkr.com",
"pkrtech.com",
"whitepages.com",
"whoscall.com"
],
"bcat": [
"IAB14-1",
"IAB24",
"IAB25",
"IAB26",
"IAB6-7",
"IAB7-39",
"IAB8-18",
"IAB8-5",
"IAB9-9"
],
"device": {
"carrier": "405-799",
"connectiontype": 2,
"dnt": 1,
"geo": {
"country": "KOR",
"lat": 37.495499,
"lon": 127.0162,
},
"h": 1280,
"ifa": "df58a938-d087-491d-985f-1c42ca3ef0da",
"ip": "182.58.217.166",
"js": 1,
"language": "en",
"lmt": 1,
"make": "samsung",
"model": "SM-E700H",
"os": "Android",
"osv": "5.1.1",
"ua": "Mozilla\/5.0 (Linux; Android 5.1.1; SM-E700H Build\/LMY47X; wv) AppleWebKit\/537.36 (KHTML, like Gecko) Version\/4.0 Chrome\/47.0.2526.100 Mobile Safari\/537.36",
"w": 720
},
"id": "64fcf249-da49-4e58-a5f0-9ffed99529d6",
"imp": [
{
"bidfloor": 0.014,
"displaymanager": "test",
"displaymanagerver": "4.2.0",
"id": "1",
"instl": 0,
"native": {
"battr": [
3,
8,
9,
10,
14,
6
],
"request": "{\"native\":{\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":25}},{\"id\":2,\"img\":{\"hmin\":80,\"type\":1,\"wmin\":80},\"required\":1},{\"id\":3,\"img\":{\"h\":80,\"type\":2,\"w\":80},\"required\":0},{\"id\":4,\"img\":{\"h\":627,\"type\":3,\"w\":1200},\"required\":1},{\"id\":5,\"data\":{\"len\":100,\"type\":1},\"required\":0},{\"id\":6,\"data\":{\"len\":100,\"type\":2},\"required\":1},{\"id\":7,\"data\":{\"len\":100,\"type\":3},\"required\":0},{\"id\":8,\"data\":{\"len\":100,\"type\":4},\"required\":0},{\"id\":9,\"data\":{\"len\":100,\"type\":5},\"required\":0},{\"id\":10,\"data\":{\"len\":100,\"type\":6},\"required\":0},{\"id\":11,\"data\":{\"len\":100,\"type\":7},\"required\":0},{\"id\":12,\"data\":{\"len\":100,\"type\":8},\"required\":0},{\"id\":13,\"data\":{\"len\":100,\"type\":9},\"required\":0},{\"id\":14,\"data\":{\"len\":100,\"type\":10},\"required\":0},{\"id\":15,\"data\":{\"len\":100,\"type\":11},\"required\":0},{\"id\":16,\"data\":{\"len\":15,\"type\":12},\"required\":0}],\"layout\":6}}",
"ver": "1.0.0.2"
},
"tagid": "072df02f86984dc6b50d74b0ad42bb85"
}
]
}