Giter Club home page Giter Club logo

prebid-server-java's Introduction

This is the Java version of Prebid Server. See the Prebid Server Feature List and FAQ entry to understand the differences between PBS-Java and PBS-Go.

Prebid Server (Java)

GitHub version GitHub contributors PRs Welcome GitHub pull-requests closed

Prebid Server is an open source implementation of Server-Side Header Bidding. It is managed by Prebid.org, and upholds the principles from the Prebid Code of Conduct.

This project does not support the same set of Bidders as Prebid.js, although there is overlap. The current set can be found in the adapters package. If you don't see the one you want, feel free to contribute it.

For more information, see:

Please consider registering your Prebid Server to get on the mailing list for updates, etc.

Getting Started

The server makes the following assumptions:

  • No ranking or decisioning is performed by this server. It just proxies requests.
  • No ad quality management (e.g., malware, viruses, deceptive creatives) is performed by this server.
  • This server does no fraud scanning and does nothing to prevent bad traffic.
  • This server logs errors but not requests.
  • This server has no user profiling or user data collection capabilities.

This project is built upon Vert.x to achieve high request throughput. We use Maven and attempt to introduce minimal dependencies.

When running, the server responds to several HTTP endpoints.

Building

Follow next steps to create JAR file which can be deployed locally.

  • Install prerequsites

    • Java SDK: Oracle's or Corretto. Let us know if there's a distribution PBS-Java doesn't work with.
    • Maven
  • Clone the project:

git clone https://github.com/prebid/prebid-server-java.git
  • Move to project directory:
cd prebid-server-java

And from this step there are two common use cases, which can be chosen depending on your goals

  1. Create prebid-server JAR only
  • First, make sure nothing's running on your local port 8080 or 8090
  • Run below command to build project:
mvn clean package
  1. Create prebid-server JAR with modules
  • Run below command to build project:
mvn clean package --file extra/pom.xml

For more information how to build the server follow documentation.

Configuration

The source code includes an example configuration file sample/configs/prebid-config.yaml. Also, check the account settings file sample/configs/sample-app-settings.yaml.

For more information how to configure the server follow documentation. There are many settings you'll want to consider such as which bidders you're going to enable, privacy defaults, admin endpoints, etc.

Running

Run your local server with the command:

java -jar target/prebid-server.jar --spring.config.additional-location=sample/configs/prebid-config.yaml

For more options how to start the server, please follow documentation.

Running prebuilt .jar

Starting from PBS Java v2.9, you can download prebuilt .jar packages from Release Notes page, instead of building them by yourself. This prebuilt packages are delivered with or without extra modules.

Verifying

To check the server is started go to http://localhost:8080/status and verify response status is 200 OK.

There are a couple of 'hello world' test requests described in sample/requests/README.txt

Running Docker image

Starting from PBS Java v2.9, you can download prebuilt Docker images from GitHub Packages page, and use them instead of plain .jar files. This prebuilt images are delivered with or without extra modules.

In order to run such image correctly, you should attach PBS config file. Easiest way is to mount config file into container, using --mount or --volume (-v) Docker CLI arguments. Keep in mind, that config file should be mounted into specific location: /app/prebid-server/ or /app/prebid-server/conf/.

Documentation

Development

Maintenance

Contributing

prebid-server-java's People

Contributors

albertmolinermrf avatar and1ss avatar andriypavlyuk avatar anestere avatar antoxaantoxic avatar apaliy avatar braslavskiyandrey avatar bretg avatar ctmbnara avatar dependabot[bot] avatar dgarbar avatar dhutsalo avatar hupaloo avatar javaandscriptdeveloper avatar laurb9 avatar marki1an avatar mtuchkova avatar muuki88 avatar net-burst avatar nickluck8 avatar osulzhenko avatar pro-nsk avatar rodionorets avatar rossgoncharuk avatar rpanchyk avatar schernysh avatar serhiinahornyi avatar valeriibarsuk avatar veryextraordinaryusername avatar yevhenii-viktorov avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

prebid-server-java's Issues

Prevent exception when cookie sync has limit

There is a potential index out of bounds exception when cookie sync is requested with a limit and the amount of bidders to sync is smaller than the total amount of bidders (because some of them already have live uids, mainly).

Stored Requests by account id for filesystem

In #488 stored request by account id where introduced, but as far as I understand this doesn't cover the filesystem stored requests implementation. Currently the configuration looks like this

settings:
  filesystem:
    stored-requests-dir: configs/stored-requests

A simple solution would be something like this

settings:
  filesystem:
    stored-requests-dir: configs/stored-requests
    appendAccountId: true

this wouldeffectively appending the accountId to the path. If a request has the accountId example.com
it would turn configs/stored-requests into configs/stored-requests/example.com.

FileApplicationSettings

private final Map<String, String> storedIdToRequest;
private final Map<String, String> storedIdToImp;
private final Map<String, String> storedIdToSeatBid;

Related

Relates to prebid/prebid-server#1024

Question regarding default currency value

How do we configure the default currency value, if the bid request from publisher doesn't contain the currency? Noticed the below place it is setting it as null
https://github.com/rubicon-project/prebid-server-java/blob/master/src/main/java/org/prebid/server/spring/config/ServiceConfiguration.java#L169

I tried testing by setting this value to "USD" instead of null. It is working. Otherwise receiving below error
"Invalid request format: currency was not defined either in request.cur or in configuration field adServerCurrency" while testing.

What is the expected way to set this default value? Are we supposed to validate and add default in each adapter code if bidrequest.cur is not present?

@DGarbar Please let me know.

Appnexus is returning null pointer exception while running /openrtb2/auction request

I have tried using the appnexus request for openrtb2/auction but it is returning the following error,

Critical error while running the auction

java.lang.NullPointerException:

The following is my sample request:
{ "id": 190, "cur": ["USD"], "imp": [{ "id": 190, "video": { "mimes": ["video/x-ms-wmv", "video/mp4"], "skipmin": 0, "skipafter": 0 }, "ext": { "appnexus": { "placementId": 1234 } } }], "user": { "id": "456789876567897654678987656789", "buyeruid": "545678765467876567898765678987654", "data": [{ "id": "6", "name": "Data Provider 1", "segment": [{ "id": "12341318394918", "name": "auto intenders" }, { "id": "1234131839491234", "name": "auto enthusiasts" } ] }] }, "app": { "publisher": { "id": 1001, "ext": { "rp": { "account_id": 2001 } } }, "ext": { "rp": { "site_id": 3001 } } } }

Also, from the code I found that the usersyncer is returning null from the AppnexusConfiguration.class,

BidderDeps(name=appnexus, deprecatedNames=[], aliases=[districtm], bidderInfo=BidderInfo(enabled=false, maintainer=BidderInfo.MaintainerInfo([email protected]), capabilities=BidderInfo.CapabilitiesInfo(app=BidderInfo.PlatformInfo(mediaTypes=[banner, native]), site=BidderInfo.PlatformInfo(mediaTypes=[banner, video])), vendors=[], gdpr=BidderInfo.GdprInfo(vendorId=32, enforced=true)), usersyncer=null, bidder=org.prebid.server.bidder.DisabledBidder@26ceffa8, adapter=org.prebid.server.bidder.DisabledAdapter@600b90df)

Kindly help me resolve this issue to pass this request

Add matched cookie sync metrics

A metric measuring the amount of times a user already had a live uid when cookie syncing can be helpful to calculate match rates and detect sync errors.

Refactor metrics

Looking at the account-level metrics for PBS-Java, it's apparent that AMP requests aren't logging the same set of metrics as regular openrtb requests.

The first step is to catch up with what's being done on the Go side in prebid/prebid-server#547 and prebid/prebid-server#550. Then we should go beyond the Go implementation to count adapter and account requests. Also, Go

Scenarios:

  • openrtb (with or without stored requests)
  • openrtb for app (with or without stored requests)
  • AMP

Every request should log:

  • $.{ok,badinput,err}.{ortb-web,ortb-app,amp,legacy}
  • $.adapter.ID.requests.type.{ortb-web,ortb-app,amp,legacy}

Make the following metric configurable:

  • $.account.ID.requests.type.{ortb-web,ortb-app,amp,legacy}

Suggested configuration:
{code}
metrics.accounts.default: {none, basic, detailed}
metrics.accounts.basic: acctId1, accId2
metrics.accounts.detailed: acctId3, accId4
{code}
Where 'basic' metrics are:

  • account.ID.requests
  • account.ID.bids_received
    And 'detailed' metrics are everything else:
  • account.ID.ADAPTER.*
  • account.ID.requests.type.{ortb-web,ortb-app,amp,legacy}

If either 'basic' or 'detailed' is specified in the config and an account is not in either 'basic' or 'detailed', no metrics should be logged for it.

Other changes aligning with prebid/prebid-server#550:

requests.adapter.ID.requests.gotbids => a bid request was made and bids were returned
requests.adapter.ID.requests.nobid => a bid request was made, but no bids were returned
requests.adapter.ID.requests.badinput => a bid request was made with some invalid input
requests.adapter.ID.requests.badserverresponse => a bid request was made and the server responded with an error or something unexpected.
requests.adapter.ID.requests.timeout => a bid request was made and the bidder timed out.
requests.adapter.ID.requests.unknown => a bid request was made and some unknown error happened.

Issue Tappx Adapter

Hello,

My name is Rubรฉn and I am a IT Team Lead in Tappx.

We have issues with our adapter in your solution, from April 23 all the traffic that we received from your solution disappeared and the publishers didn't stop our bidder....

Can you investigate if there is something wrong in our adapter? I saw that you made some changes on April 21... too much of a coincidence...

Thanks

Pubmatic adapter only uses adSlot param for banners

I'm using PBS for video HB and Pubmatic adapter (based on the info in pubmatic.yaml) supports video. I couldn't find my video requests/imps in Pubmatic reporting and on closer look at the bid requests sent to Pubmatic, the adapter code here only ever passes the adapter adSlot param for the banner requests (in imp.tagid field) but not for any other media type. I believe this is a bug as after modifying the adapter to set imp.tagid for video I see the bids in Pubmatic reports + Pubmatic started bidding much more frequently than before.

Inform ExtBidResponse's usersync field with the user sync status

We would like to store some custom auction's metrics : auction result, user's cookie sync status with each bidder ...
In order to do that we will use BidResponsePostProcessor, there we could access BidResponse and also BidResponse.ext field, whom real type is ExtBidResponse, and read its usersync field, but unfortunately this field is not set in ExchangeService's toExtBidResponse method

OpenrtbAdapter's requests do not contain neither user agent nor ip information

HttpAdapterRequester creates PreBidRequestContext in the private method toPreBidRequestContext but it does not fill neither ua(user agent) nor ip(client ip).

Because of this when an OpenrtbAdapter creates a DeviceBuilder based on PreBidRequestContext the ip and user agent is set to null, and thus requests do not contain this information.

Make /setuid handler GDPR-aware

Requirements

The uids cookie must only be set in the following conditions:

  • If gdpr=0, the uids cookie may be set.
  • Else both of these conditions must be true:
    • The user must allow local storage -- If gdpr is 1 and the consent string allows Purpose 1
    • The PBS host company must have consent -- If gdpr is 1 and the consent string allows the PBS host company's vendor ID as defined in config

If gdpr is undefined in request, gdpr.in-scope-by-default configuration value will be applied as value of "gdpr" query parameter (name of this configuration property must be mentioned in the document describing differences between Java and Go implementation since in Go implementation it is called "gdpr.usersync_if_ambiguous" currently).

This library could be used for consent string parsing: https://github.com/InteractiveAdvertisingBureau/Consent-String-SDK-Java

Test failure when building project

I've cloned the project and attempted to build on master branch. I'm wondering if there's some additional workstation setup that I am missing but cannot find what that might be.

java version "1.8.0_291"
Java(TM) SE Runtime Environment (build 1.8.0_291-b10)
Java HotSpot(TM) 64-Bit Server VM (build 25.291-b10, mixed mode)

Apache Maven 3.8.1 (05c21c65bdfed0f71a2f2ada8b84da59348c4c5d)
Maven home: C:\DEV\maven\apache-maven-3.8.1
Java version: 1.8.0_291, vendor: Oracle Corporation, runtime: C:\Program Files\Java\jdk1.8.0_291\jre
Default locale: en_US, platform encoding: Cp1252
OS name: "windows 10", version: "10.0", arch: "amd64", family: "windows"

[ERROR] Failures:
[ERROR] ApplicationTest.biddersParamsShouldReturnBidderSchemas:524
Expecting:
<{"33across"={"$schema":"http://json-schema.org/draft-04/schema#","title":"33Across Adapter Params","description":"A schema which validates params accepted by the 33Across adapter","type":"object","properties":{"productId":{"type":"string","description":"Product type"},"siteId":{"type":"string","description":"Site Id"},"zoneId":{"type":"string","description":"Zone Id"}},"required":["productId","siteId"]}, "acuityads"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AcuityAds Adapter Params","description":"A schema which validates params accepted by the AcuityAds adapter","type":"object","properties":{"host":{"type":"string","description":"Network host to send request","minLength":1},"accountid":{"type":"string","description":"Account id","minLength":1}},"required":["host","accountid"]}, "adf"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adf Adapter Params","description":"A schema which validates params accepted by the adf adapter","type":"object","properties":{"mid":{"type":["integer","string"],"pattern":"^\d+$","description":"An ID which identifies the placement selling the impression"}},"required":["mid"]}, "adform"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adform Adapter Params","description":"A schema which validates params accepted by the Adform adapter","type":"object","properties":{"mid":{"type":["integer","string"],"description":"An ID which identifies the placement selling the impression"},"priceType":{"type":"string","enum":["gross","net"],"description":"An expected price type (net or gross) of bids."},"mkv":{"type":"string","description":"Comma-separated key-value pairs. Forbidden symbols: &. Example: mkv='color:blue,length:350'","pattern":"^(\s*|((\s*[^,:&\\s]+\s*:[^,:&])(,\s[^,:&\\s]+\s*:[^,:&])))$"},"mkw":{"type":"string","description":"Comma-separated keywords. Forbidden symbols: &.","pattern":"^[^&]$"},"cdims":{"type":"string","description":"Comma-separated creative dimensions.","pattern":"(^\d+x\d+)(,\d+x\d+)$"},"minp":{"type":"number","description":"The minimum CPM price.","minimum":0},"url":{"type":"string","description":"Custom URL for targeting."}},"required":["mid"]}, "adgeneration"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdGeneration Adapter Params","description":"A schema which validates params accepted by the AdGeneration adapter","type":"object","properties":{"id":{"type":"string","description":"Ad ID registered by AdGeneration."}},"required":["id"]}, "adhese"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adhese Adapter Parameters","description":"Validation for parameters handled by the Adhese adapter","type":"object","properties":{"account":{"type":"string","description":"Your Adhese account name. If unknown, please contact your sales rep"},"location":{"type":"string","description":"The location you want to refer to for a specific section or page, as defined in your Adhese inventory"},"format":{"type":"string","description":"The format you accept for this unit, as defined in your Adhese inventory"},"targets":{"type":"object","description":"Target params, as defined in your Adhese setup."}},"required":["account","location","format"]}, "adkernel"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adkernel Adapter Params","description":"A schema which validates params accepted by the Adkernel adapter","type":"object","properties":{"zoneId":{"type":"integer","minimum":1,"description":"Publisher Id to use."},"host":{"type":"string","description":"Network host to send request"}},"required":["host","zoneId"]}, "adkernelAdn"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdkernelAdn Adapter Params","description":"A schema which validates params accepted by the AdkernelAdn adapter","type":"object","properties":{"pubId":{"type":"integer","minimum":1,"description":"Publisher Id to use."},"host":{"type":"string","description":"Network host to send request"}},"required":["pubId"]}, "adman"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adman Adapter Params","description":"A schema which validates params accepted by the Adman adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies the adman ad tag"}},"required":["TagID"]}, "admixer"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Admixer Adapter Params","description":"A schema which validates params accepted by the Admixer adapter","type":"object","properties":{"zone":{"type":"string","description":"Zone ID.","pattern":"^([a-fA-F\d\-]{36})$"},"customFloor":{"type":"number","description":"The minimum CPM price in USD.","minimum":0},"customParams":{"type":"object","description":"User-defined targeting key-value pairs."}},"required":["zone"]}, "adocean"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdOcean Adapter Params","description":"A schema which validates params accepted by the AdOcean adapter","type":"object","properties":{"emiter":{"type":"string","description":"AdOcean emiter","pattern":".+"},"masterId":{"type":"string","description":"Master's id","pattern":"^[\w.]+$"},"slaveId":{"type":"string","description":"Slave's id","pattern":"^adocean[\w.]+$"}},"required":["emiter","masterId","slaveId"]}, "adoppler"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adoppler Adapter Params","description":"A schema which validates params accepted by the Adoppler adapter","type":"object","properties":{"adunit":{"type":"string","description":"AdUnit to bid against to."},"client":{"type":"string","description":"Client name."}},"required":["adunit"]}, "adot"={"$schema":"http://json-schema.org/draft-04/schema#","title":"The Adot Adapter Params","description":"A schema which validates params accepted by Adot adapter","type":"object","properties":{"placementId":{"type":"string","description":"An ID which identifies this placement of the impression"},"parallax":{"type":"boolean","description":"It determines if the wanted advertising format is a parallax."}},"required":[]}, "adpone"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adpone Adapter Params","description":"A schema which validates params accepted by the adpone adapter","type":"object","properties":{"placementId":{"type":"string","description":"Placement Id"}},"required":[]}, "adprime"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adprime Adapter Params","description":"A schema which validates params accepted by the Adprime adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies the adprime ad tag"}},"required":["TagID"]}, "adtarget"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adtarget Adapter Params","description":"A schema which validates params accepted by the Adtarget adapter","type":"object","properties":{"placementId":{"type":"integer","description":"An ID which identifies this placement of the impression"},"siteId":{"type":"integer","description":"An ID which identifies the site selling the impression"},"aid":{"type":"integer","description":"An ID which identifies the channel"},"bidFloor":{"type":"number","description":"BidFloor, US Dollars"}},"required":["aid"]}, "adtelligent"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adtelligent Adapter Params","description":"A schema which validates params accepted by the Adtelligent adapter","type":"object","properties":{"placementId":{"type":"integer","description":"An ID which identifies this placement of the impression"},"siteId":{"type":"integer","description":"An ID which identifies the site selling the impression"},"aid":{"type":"integer","description":"An ID which identifies the channel"},"bidFloor":{"type":"number","description":"BidFloor, US Dollars"}},"required":["aid"]}, "advangelists"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Advangelists Adapter Params","description":"A schema which validates params accepted by the Advangelists adapter","type":"object","properties":{"pubid":{"type":"string","description":"An id used to identify Advangelists publisher.","minLength":8},"placement":{"type":"string","description":"An id used to identify placements."}},"required":["pubid"]}, "adyoulike"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdYouLike Adapter Params","description":"A schema which validates params accepted by the AdYouLike adapter","type":"object","properties":{"placement":{"type":"string","description":"Placement Id"},"campaign":{"type":"string","description":"Id of a forced campaign"},"track":{"type":"string","description":"Id of a forced Track"},"creative":{"type":"string","description":"Id of a forced creative"},"source":{"type":"string","description":"context of the campaign"},"debug":{"type":"string","description":"Arbitrary id used for debug purpose"}},"required":["placement"]}, "aja"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AJA Adapter Params","description":"A schema which validates params accepted by the AJA adapter","type":"object","properties":{"asi":{"type":"string","description":"Ad spot ID"}},"required":["asi"]}, "algorix"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AlgoriX Adapter Params","description":"A schema which validates params accepted by the AlgoriX adapter","type":"object","properties":{"sid":{"type":"string","description":"Your Sid"},"token":{"type":"string","description":"Your Token"}},"required":["sid","token"]}, "amx"={"$schema":"http://json-schema.org/draft-04/schema#","title":"AMX RTB Adapter Params","description":"A schema to validate params accepted by the AMX adapter","type":"object","properties":{"tagId":{"type":"string","description":"Set a tagId (overrides site.publisher.id, or app.publisher.id)"},"adUnitId":{"type":"string","description":"Override imp.tagid value to provide a custom value in AMX ad unit ID reporting"}}}, "applogy"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Applogy Adapter Params","description":"A schema which validates params accepted by Applogy adapter","type":"object","properties":{"token":{"type":"string","description":"Token"}},"required":["token"]}, "appnexus"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Appnexus Adapter Params","description":"A schema which validates params accepted by the AppNexus adapter","type":"object","properties":{"placement_id":{"type":"integer","description":"An ID which identifies this placement of the impression"},"placementId":{"type":"integer","description":"Deprecated, use placement_id instead."},"inv_code":{"type":"string","description":"A code identifying the inventory of this placement."},"invCode":{"type":"string","description":"Deprecated, use inv_code instead."},"member":{"type":"string","description":"An ID which identifies the member selling the impression."},"keywords":{"type":"array","minItems":1,"items":{"type":"object","description":"A key with one or more values associated with it. These are used in buy-side segment targeting.","properties":{"key":{"type":"string"},"value":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["key"]}},"traffic_source_code":{"type":"string","description":"Specifies the third-party source of this impression."},"trafficSourceCode":{"type":"string","description":"Deprecated, use traffic_source_code instead."},"reserve":{"type":"number","description":"The minimium acceptable bid, in CPM, using US Dollars"},"position":{"type":"string","enum":["above","below"],"description":"Specifies the ad unit as above or below the fold"},"use_pmt_rule":{"type":"boolean","description":"Boolean to signal AppNexus to apply the relevant payment rule"},"private_sizes":{"type":"array","items":{"type":"object","properties":{"w":{"type":"integer"},"h":{"type":"integer"}},"required":["w","h"]},"description":"Private sizes (ex: [{"w": 300, "h": 250},{...}]), experimental, may not be supported."}},"oneOf":[{"oneOf":[{"required":["placementId"]},{"required":["placement_id"]}]},{"oneOf":[{"required":["invCode","member"]},{"required":["inv_code","member"]}]}],"not":{"required":["placementId","invCode","member"]}}, "audienceNetwork"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Facebook Audience Network Adapter Params","description":"A schema which validates params accepted by the Facebook Audience Network adapter","type":"object","properties":{"placementId":{"type":"string","description":"An ID which identifies the placement selling the impression"}},"required":["placementId"]}, "avocet"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Avocet Adapter Params","description":"A schema which validates params accepted by the Avocet adapter","type":"object","properties":{"placement":{"type":"string","description":"An Avocet placement ID"},"placement_code":{"type":"string","description":"An Avocet placement external code"}},"oneOf":[{"required":["placement"]},{"required":["placement_code"]}]}, "beachfront"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Beachfront Adapter Params","description":"A schema which validates params accepted by the Beachfront adapter","type":"object","properties":{"appId":{"type":"string","description":"The id of an inventory target. This can only be used in requests that contain one media type. It will be applied to all imps in the request."},"appIds":{"type":"object","description":"An object that specifies appIds for specific media types. This can be used for either single media type requests or multiple.","properties":{"video":{"type":"string","description":"An appId string that will be applied to video requests in this imp."},"banner":{"type":"string","description":"An appId string that will be applied to banner requests in this imp."}}},"bidfloor":{"type":"number","description":"The price floor for the bid."},"videoResponseType":{"type":"string","description":"By default the video response will be an AdM element containing VAST 3.0 markup including tracking, click through, and mediafile elements pointing to mp4, webm or other playable media files or Vpaid media as configured for the exchange at beachfront.io. Optionally, set this to 'nurl' to receive a URI pointing to VAST 3.0 markup which will contain a mediafile pointing to a beachfront neptune javascript video player which will load your video and take care of tracking, etc. Regardless of which format is selected, the id of the returned impression will be the provided impression id (imp[{'id'...},...] in the request) with the format appended. The impression id will be returned unchanged as 'impid'. So if you indicate 'nurl', and an impression id 'someImp', the returned impression will have an 'impid' value of 'someImp', and the 'id' value 'someImpNurlVideo'. This is to differentiate the object in the case that a request includes both video and banner elements. Setting videoResponseType to any other string will have no effect and the default format (AdM) will be returned."}},"required":["bidfloor"],"oneOf":[{"required":["appId"]},{"required":["appIds"]}]}, "beintoo"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Beintoo Adapter Params","description":"A schema which validates params accepted by the Beintoo adapter","type":"object","properties":{"tagid":{"type":"string","description":"The id of an inventory target"},"bidfloor":{"type":"string","description":"The minimum price acceptable for a bid"}},"required":["tagid"]}, "between"={"$schema":"http://json-schema.org/draft-04/schema#","title":"BetweenDigital Adapter Params","description":"A schema which validates params accepted by the BetweenDigital adapter","type":"object","properties":{"host":{"type":"string","description":"Network Host to request from","enum":["lbs-eu1.ads","lbs-ru1.ads","lbs-us-east1.ads","lbs-asia1.ads"]},"publisher_id":{"type":"string","description":"Publisher ID from Between Exchange control panel"},"bid_floor":{"type":"number","description":"The minimum price acceptable for a bid"},"bid_floor_cur":{"type":"string","description":"Currency of bid floor","enum":["USD","EUR","RUB"]}},"required":["host","publisher_id"]}, "brightroll"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Brightroll Adapter Params","description":"A schema which validates params accepted by the Brightroll adapter","type":"object","properties":{"publisher":{"type":"string","description":"Publisher Name to use."}},"required":["publisher"]}, "colossus"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Colossus Adapter Params","description":"A schema which validates params accepted by the Colossus adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies the colossus ad tag"}},"required":["TagID"]}, "connectad"={"$schema":"http://json-schema.org/draft-04/schema#","title":"ConnectAd S2S dapter Params","description":"A schema which validates params accepted by the ConnectAd Adapter","type":"object","properties":{"networkId":{"type":"integer","description":"NetworkId"},"siteId":{"type":"integer","description":"SiteId"},"bidfloor":{"type":"number","description":"Requests Floorprice"}},"required":["networkId","siteId"]}, "consumable"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Consumable Adapter Params","description":"A schema which validates params accepted by the Consumable adapter","type":"object","properties":{"siteId":{"type":"number","description":"The site ID from Consumable","pattern":"^[0-9]+$"},"networkId":{"type":"number","description":"The network ID from Consumable","pattern":"^[0-9]+$"},"unitId":{"type":"number","description":"The unit ID from Consumable","pattern":"^[0-9]+$"},"unitName":{"type":"string","description":"The unit name from Consumable (expected to be a valid CSS class name)","pattern":"^-?[_a-zA-Z]+[_a-zA-Z0-9-]$"}},"required":["siteId","networkId","unitId"]}, "conversant"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Conversant Adapter Params","description":"A schema which validates params accepted by the Conversant adapter.","type":"object","properties":{"site_id":{"type":"string","description":"A Conversant specific ID which identifies the site."},"secure":{"type":"integer","description":"Override http/https context on ad markup."},"bidfloor":{"type":"number","description":"Minimum bid price that will be considered."},"tag_id":{"type":"string","description":"Identifies specific ad placement."},"position":{"type":"integer","description":"Ad position on screen."},"mimes":{"type":"array","description":"Array of content MIME types. For videos only.","items":{"type":"string"}},"maxduration":{"type":"integer","description":"Maximum duration in seconds. For videos only."},"api":{"type":"array","description":"Array of supported API frameworks. For videos only.","items":{"type":"integer"}},"protocols":{"type":"array","description":"Array of supported video protocols. For videos only.","items":{"type":"integer"}}},"required":[]}, "cpmstar"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Cpmstar Adapter Params","description":"Schema to validate params accepted by the Cpmstar adapter","type":"object","properties":{"placementId":{"type":"integer","description":"Cpmstar-specific ID for ad pool"},"subpoolId":{"type":"integer","description":"Cpmstar-specific ID for ad subpool"}},"required":["placementId"]}, "datablocks"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Datablocks Adapter Params","description":"A schema which validates params accepted by the Datablocks adapter","type":"object","properties":{"sourceId":{"type":"integer","minimum":1,"description":"Website Source Id"},"host":{"type":"string","description":"Network Host to request from"}},"required":["host","sourceId"]}, "decenterads"={"$schema":"http://json-schema.org/draft-04/schema#","title":"DecenterAds Adapter Params","description":"A schema which validates params accepted by the DecenterAds adapter","type":"object","properties":{"placementId":{"type":"string","minLength":1,"description":"An ID which identifies the DecenterAds placement"},"customParams":{"type":"object","description":"User-defined targeting key-value pairs."}},"required":["placementId"]}, "deepintent"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Deepintent Adapter Params","description":"A schema which validates params accepted by the Deepintent adapter","type":"object","properties":{"tagId":{"type":"string","description":"An ID which identifies the deepintent ad tag"}},"required":["tagId"]}, "districtm"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Appnexus Adapter Params","description":"A schema which validates params accepted by the AppNexus adapter","type":"object","properties":{"placement_id":{"type":"integer","description":"An ID which identifies this placement of the impression"},"placementId":{"type":"integer","description":"Deprecated, use placement_id instead."},"inv_code":{"type":"string","description":"A code identifying the inventory of this placement."},"invCode":{"type":"string","description":"Deprecated, use inv_code instead."},"member":{"type":"string","description":"An ID which identifies the member selling the impression."},"keywords":{"type":"array","minItems":1,"items":{"type":"object","description":"A key with one or more values associated with it. These are used in buy-side segment targeting.","properties":{"key":{"type":"string"},"value":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["key"]}},"traffic_source_code":{"type":"string","description":"Specifies the third-party source of this impression."},"trafficSourceCode":{"type":"string","description":"Deprecated, use traffic_source_code instead."},"reserve":{"type":"number","description":"The minimium acceptable bid, in CPM, using US Dollars"},"position":{"type":"string","enum":["above","below"],"description":"Specifies the ad unit as above or below the fold"},"use_pmt_rule":{"type":"boolean","description":"Boolean to signal AppNexus to apply the relevant payment rule"},"private_sizes":{"type":"array","items":{"type":"object","properties":{"w":{"type":"integer"},"h":{"type":"integer"}},"required":["w","h"]},"description":"Private sizes (ex: [{"w": 300, "h": 250},{...}]), experimental, may not be supported."}},"oneOf":[{"oneOf":[{"required":["placementId"]},{"required":["placement_id"]}]},{"oneOf":[{"required":["invCode","member"]},{"required":["inv_code","member"]}]}],"not":{"required":["placementId","invCode","member"]}}, "dmx"={"$schema":"http://json-schema.org/draft-04/schema#","title":"District M DMX Adapter Params","description":"A schema which validates params accepted by the DMX adapter","type":"object","properties":{"memberid":{"type":"string","description":"Represent boost MemberId from districtm UI"},"placement_id":{"type":"string","description":"memberid replacement / alternative value or equivalent"},"seller_id":{"type":"string","description":"Represent DMX Partner when you get onboarded, this is for specific setup BURL vs NURL"},"dmxid":{"type":"string","description":"Represent the placement ID dmxid equivalent to 'tagid', this value is optional"},"tagid":{"type":"string","description":"Represent the placement ID tagid equivalent to 'dmxid', this value is optional"},"bidfloor":{"type":"number","description":"The minimum price acceptable for a bid, this is optional since we do get the one from the original openrtb request"}},"required":["memberid"]}, "emx_digital"={"$schema":"http://json-schema.org/draft-04/schema#","title":"EMX Digital Adapter Params","description":"A schema which validates params accepted by the EMX Digital adapter","type":"object","properties":{"tagid":{"type":"string","description":"The id of an inventory target"},"bidfloor":{"type":"string","description":"The minimum price acceptable for a bid"}},"required":["tagid"]}, "engagebdr"={"$schema":"http://json-schema.org/draft-04/schema#","title":"EngageBDR Adapter Params","description":"A schema which validates params accepted by the EngageBDR adapter","type":"object","properties":{"sspid":{"type":"string","description":"SSPID parameter","pattern":"^[0-9]+$"}},"required":["sspid"]}, "eplanning"={"$schema":"https://json-schema.org/draft-04/schema#","title":"EPlanning Adapter Params","description":"A schema which validates params accepted by the EPlanning adapter","type":"object","properties":{"ci":{"type":["string"],"description":"Client ID to use."},"adunit_code":{"type":["string"],"description":"Adunit Code."}},"required":["ci"]}, "epom"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Epom Adapter Params","description":"A schema which validates params accepted by the Epom adapter","type":"object","properties":{}}, "gamma"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Gamma Adapter Params","description":"A schema which validates params accepted by Gamma adapter","type":"object","properties":{"id":{"type":"string","description":"Partner ID"},"zid":{"type":"string","description":"Zone ID"},"wid":{"type":"string","description":"Web ID"}},"required":["id","zid","wid"]}, "gamoshi"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Gamoshi Adapter Params","description":"A schema which validates params accepted by Gamoshi adapter","type":"object","properties":{"supplyPartnerId":{"type":"string","description":"Supply partner id to use."},"favoredMediaType":{"type":"string","description":"favored media type"}},"required":["supplyPartnerId"]}, "grid"={"$schema":"http://json-schema.org/draft-04/schema#","title":"TheMediaGrid Adapter Params","description":"A schema which validates params accepted by TheMediaGrid adapter","type":"object","properties":{"uid":{"type":"integer","description":"An ID which identifies this placement of the impression"}},"required":[]}, "gumgum"={"$schema":"http://json-schema.org/draft-04/schema#","title":"GumGum Adapter Params","description":"A schema which validates params accepted by the GumGum adapter","type":"object","properties":{"zone":{"type":"string","description":"A tracking id used to identify GumGum zone.","minLength":8},"pubId":{"type":"integer","description":"A tracking id used to identify GumGum publisher"},"irisid":{"type":"string","description":"A hashed IRIS.TV Content ID"}},"anyOf":[{"required":["zone"]},{"required":["pubId"]}]}, "improvedigital"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Improve Digital Adapter Params","description":"A schema which validates params accepted by Improve Digital adapter","type":"object","properties":{"placementId":{"type":"integer","minimum":1,"description":"An ID which identifies this placement of the impression"},"publisherId":{"type":"integer","minimum":1,"description":"An ID which identifies publisher. Required when using a placementKey"},"placementKey":{"type":"string","description":"An uniq name which identifies this placement of the impression. Must be used with publisherId"},"keyValues":{"type":"object","description":"Contains one or more key-value pairings for key-value targeting"},"size":{"type":"object","properties":{"w":{"type":"integer"},"h":{"type":"integer"}},"required":["w","h"],"description":"Placement size"}},"oneOf":[{"required":["placementId"]},{"required":["publisherId","placementKey"]}]}, "inmobi"={"$schema":"http://json-schema.org/draft-04/schema#","title":"InMobi Adapter Params","description":"A schema which validates params accepted by the InMobi adapter","type":"object","properties":{"plc":{"type":["string"],"description":"An ID corresponding to the placement selling the impression"}},"required":["plc"]}, "invibes"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Invibes Adapter Params","description":"A schema which validates params accepted by the Invibes adapter","type":"object","properties":{"placementId":{"type":"string","minLength":1,"description":"An ID which identifies the site selling the impression"},"domainId":{"type":"integer","description":"Ad domain id"},"debug":{"type":"object","properties":{"testBvid":{"type":"string"},"testLog":{"type":"boolean"}},"description":"Parameters used for debugging purposes"}},"required":["placementId"]}, "ix"={"$schema":"http://json-schema.org/draft-04/schema#","title":"ix Adapter Params","description":"A schema which validates params accepted by the ix adapter","type":"object","properties":{"siteId":{"type":"string","description":"An ID which identifies the site selling the impression"},"size":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2,"description":"An array of two integer containing the dimension"}},"required":["siteId"]}, "jixie"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Jixie Adapter Params","description":"A schema which validates params accepted by the Jixie adapter","type":"object","properties":{"unit":{"type":"string","description":"The unit code of an inventory target","minLength":18},"accountid":{"type":"string","description":"The accountid of an inventory target"},"jxprop1":{"type":"string","description":"jxprop1 of an inventory target"},"jxprop2":{"type":"string","description":"jxprop2 of an inventory target"}},"required":["unit"]}, "kidoz"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Kidoz Adapter Params","description":"A schema which validates params accepted by the Kidoz adapter","type":"object","properties":{"access_token":{"type":"string","minLength":1,"description":"Kidoz access_token"},"publisher_id":{"type":"string","minLength":1,"description":"Kidoz publisher_id"}},"required":["access_token","publisher_id"]}, "krushmedia"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Krushmedia Adapter Params","description":"A schema which validates params accepted by the Krushmedia adapter","type":"object","properties":{"key":{"type":"string","description":"ssp key"}},"required":["key"]}, "kubient"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Kubient Adapter Params","description":"A schema which validates params accepted by the Kubient adapter","type":"object","properties":{"zoneid":{"type":"string","description":"Zone ID identifies Kubient placement ID.","minLength":1}}}, "lifestreet"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Lifestreet Adapter Params","description":"A schema which validates params accepted by the Lifestreet adapter","type":"object","properties":{"slot_tag":{"type":"string","description":"A tag which identifies the ad slot"}},"required":["slot_tag"]}, "lockerdome"={"$schema":"http://json-schema.org/draft-04/schema#","title":"LockerDome Adapter Params","description":"A schema which validates params accepted by the LockerDome adapter","type":"object","properties":{"adUnitId":{"type":"string","description":"A tag which identifies the LockerDome ad unit by adUnitId"}},"required":["adUnitId"]}, "logicad"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Logicad Adapter Params","description":"A schema which validates params accepted by the Logicad adapter","type":"object","properties":{"tid":{"type":"string","description":"Logicad for Publishers placement ID"}},"required":["tid"]}, "loopme"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Loopme Adapter Params","description":"A schema which validates params accepted by the Loopme adapter","type":"object","properties":{"accountId":{"type":"string","description":"Account ID"}},"required":["accountId"]}, "lunamedia"={"$schema":"http://json-schema.org/draft-04/schema#","title":"LunaMedia Adapter Params","description":"A schema which validates params accepted by the LunaMedia adapter","type":"object","properties":{"pubid":{"type":"string","description":"An id used to identify LunaMedia publisher.","minLength":8},"placement":{"type":"string","description":"A placement created on adserver."}},"required":["pubid"]}, "marsmedia"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Marsmedia Adapter Params","description":"A schema which validates params accepted by the Marsmedia adapter","type":"object","properties":{"zone":{"type":"string","description":"Zone ID to use."}},"required":["zone"]}, "mediafuse"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adtelligent Adapter Params","description":"A schema which validates params accepted by the Adtelligent adapter","type":"object","properties":{"placementId":{"type":"integer","description":"An ID which identifies this placement of the impression"},"siteId":{"type":"integer","description":"An ID which identifies the site selling the impression"},"aid":{"type":"integer","description":"An ID which identifies the channel"},"bidFloor":{"type":"number","description":"BidFloor, US Dollars"}},"required":["aid"]}, "mgid"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Mgid Params","description":"A schema which validates params accepted by the Mgid","type":"object","properties":{"accountId":{"type":"string","description":"Internal Mgid account ID"},"placementId":{"type":"string","description":"optional internal Mgid Placement ID"},"cur":{"type":"string","description":"optional bidfloor currency"},"currency":{"type":"string","description":"optional bidfloor currency"},"bidfloor":{"type":"number","description":"optional minimum acceptable bid, in CPM, USD by default"},"bidFloor":{"type":"number","description":"optional minimum acceptable bid, in CPM, USD by default"}},"required":["accountId"]}, "mobfoxpb"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Mobfox Adapter Params","description":"A schema which validates params accepted by the Mobfox adapter","type":"object","properties":{"TagID":{"type":"string","minLength":1,"description":"An ID which identifies the mobfox ad tag"},"key":{"type":"string","minLength":1,"description":"An ID which identifies the mobfox adexchange partner"}},"oneOf":[{"required":["TagID"]},{"required":["key"]}]}, "mobilefuse"={"$schema":"http://json-schema.org/draft-04/schema#","title":"MobileFuse Adapter Params","description":"A schema which validates params accepted by the MobileFuse adapter","type":"object","properties":{"placement_id":{"type":"integer","description":"An ID which identifies this specific inventory placement"},"pub_id":{"type":"integer","description":"An ID which identifies the publisher selling the inventory."},"tagid_src":{"type":"string","description":"ext if passing publisher's ids, empty if passing MobileFuse IDs in placement_id field. Defaults to empty"}},"required":["placement_id","pub_id"]}, "nanointeractive"={"$schema":"http://json-schema.org/draft-04/schema#","title":"NanoInteractive Adapter Params","description":"A schema which validates params accepted by the NanoInteractive adapter","type":"object","properties":{"pid":{"type":"string","description":"Placement id"},"nq":{"type":"array","items":{"type":"string"},"description":"search queries"},"category":{"type":"string","description":"IAB Category"},"subId":{"type":"string","description":"any segment value provided by publisher"},"ref":{"type":"string","description":"referer"}},"required":["pid"]}, "ninthdecimal"={"$schema":"http://json-schema.org/draft-04/schema#","title":"NinthDecimal Adapter Params","description":"A schema which validates params accepted by the NinthDecimal adapter","type":"object","properties":{"pubid":{"type":"string","description":"An id used to identify NinthDecimal publisher.","minLength":8},"placement":{"type":"string","description":"A placement created on adserver."}},"required":["pubid"]}, "nobid"={"$schema":"http://json-schema.org/draft-04/schema#","title":"NoBid Adapter Params","description":"A schema which validates params accepted by the NoBid adapter","type":"object","properties":{"siteId":{"type":"integer","description":"A Required ID which identifies the NoBid site. The siteId parameter is provided by your NoBid account manager."},"placementId":{"type":"integer","description":"An optional ID which identifies an adunit in a site. The placementId parameter is provided by your NoBid account manager."}},"required":["siteId"]}, "onetag"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Onetag Adapter Params","description":"A schema which validates params accepted by the Onetag adapter","type":"object","properties":{"pubId":{"type":"string","minLength":1,"description":"The publisherโ€™s ID provided by OneTag"},"ext":{"type":"object","description":"A set of custom key-value pairs"}},"required":["pubId"]}, "openx"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Openx Adapter Params","description":"A schema which validates params accepted by the Openx adapter","type":"object","properties":{"unit":{"type":"string","description":"The ad unit id.","pattern":"^[0-9]+$"},"delDomain":{"type":"string","description":"The delivery domain for the customer.","pattern":"\.[a-zA-Z]{2,3}$","format":"hostname"},"platform":{"type":"string","description":"The platform id for the customer.","format":"uuid"},"customFloor":{"type":"number","description":"The minimum CPM price in USD.","minimum":0},"customParams":{"type":"object","description":"User-defined targeting key-value pairs."}},"required":["unit"],"anyOf":[{"required":["delDomain"]},{"required":["platform"]}]}, "orbidder"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Orbidder Adapter Params","description":"A schema which validates params accepted by the Orbidder adapter","type":"object","properties":{"accountId":{"type":"string","description":"The marketer's accountId."},"placementId":{"type":"string","description":"The placementId of the ad unit."},"bidfloor":{"type":"number","description":"The minimum CPM price in EUR.","minimum":0}},"required":["accountId","placementId"]}, "outbrain"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Outbrain Adapter Params","description":"A schema which validates params accepted by the Outbrain adapter","type":"object","properties":{"publisher":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string"}},"required":["id"]},"tagid":{"type":"string"},"bcat":{"type":"array","items":{"type":"string"}},"badv":{"type":"array","items":{"type":"string"}}},"required":["publisher"]}, "pangle"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pangle Adapter Params","description":"A schema which validates params accepted by the Pangle adapter","type":"object","properties":{"token":{"type":"string","description":"Access Token","pattern":".+"}},"required":["token"]}, "pubmatic"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pubmatic Adapter Params","description":"A schema which validates params accepted by the Pubmatic adapter","type":"object","properties":{"publisherId":{"type":"string","description":"An ID which identifies the publisher"},"adSlot":{"type":"string","description":"An ID which identifies the ad slot"},"wrapper":{"type":"object","description":"Specifies pubmatic openwrap configuration for a publisher","properties":{"profile":{"type":"integer","description":"An ID which identifies the openwrap profile of publisher"},"version":{"type":"integer","description":"An ID which identifies version of the openwrap profile"}},"required":["profile"]},"keywords":{"type":"array","minItems":1,"items":{"type":"object","description":"A key with one or more values associated with it. These are used in buy-side segment targeting.","properties":{"key":{"type":"string"},"value":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["key","value"]}}},"required":["publisherId"]}, "pubnative"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pubnative Adapter Params","description":"A schema which validates params accepted by the Pubnative adapter","type":"object","properties":{"zone_id":{"type":"integer","description":"The ad zone identifier"},"app_auth_token":{"type":"string","description":"The app's authentication token"}},"required":["zone_id","app_auth_token"]}, "pulsepoint"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pulsepoint Adapter Params","description":"A schema which validates params accepted by the Pulsepoint adapter","type":"object","properties":{"cp":{"type":"integer","description":"An ID which identifies the publisher selling the impression"},"ct":{"type":"integer","description":"An ID which identifies the ad slot being sold"}},"required":["cp","ct"]}, "revcontent"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Revcontent Adapter Params","description":"A schema which validates params accepted by the Revcontent adapter","type":"object","properties":{},"required":[]}, "rhythmone"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Rhythmone Adapter Params","description":"A schema which validates params accepted by the Rhythmone adapter","type":"object","properties":{"placementId":{"type":"string","description":"An ID which is used to frame Rhythmone ad tag","minLength":1},"path":{"type":"string","description":"An ID which is used to frame Rhythmone ad tag","minLength":1},"zone":{"type":"string","description":"An ID which is used to frame Rhythmone ad tag","minLength":1}},"required":["placementId","path","zone"]}, "rtbhouse"={"$schema":"http://json-schema.org/draft-04/schema#","title":"RTB House Adapter Params","description":"A schema which validates params accepted by the RTB House adapter","type":"object","properties":{"publisherId":{"type":"string","description":"The publisherโ€™s ID provided by RTB House"}},"required":["publisherId"]}, "rubicon"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Rubicon Adapter Params","description":"A schema which validates params accepted by the Rubicon adapter","type":"object","properties":{"accountId":{"type":"integer","minimum":1,"description":"An ID which identifies the publisher's account"},"siteId":{"type":"integer","minimum":1,"description":"An ID which identifies the site selling the impression"},"zoneId":{"type":"integer","minimum":1,"description":"An ID which identifies the sub-section of the site where the impression is located"},"inventory":{"type":"object","description":"An object defining arbitrary targeting key/value pairs related to the page","additionalProperties":{"type":"array"}},"visitor":{"type":"object","description":"An object defining arbitrary targeting key/value pairs related to the visitor","additionalProperties":{"type":"array"}},"pchain":{"type":"string","description":"A payment ID chain string"},"video":{"type":"object","description":"An object defining additional Rubicon video parameters","properties":{"language":{"type":"string","description":"Language of the ad - should match content video"},"playerHeight":{"type":["integer","string"],"description":"Height in pixels of the video player"},"playerWidth":{"type":["integer","string"],"description":"Width in pixels of the video player"},"size_id":{"type":"integer","description":"Rubicon size_id, used to describe type of video ad (preroll, postroll, etc)"},"skip":{"type":"integer","description":"Can this ad be skipped ( 0 = no, 1 = yes)"},"skipDelay":{"type":"integer","description":"number of seconds until the ad can be skipped"}}}},"required":["accountId","siteId","zoneId"]}, "sharethrough"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Sharethrough Adapter Params","description":"A schema which validates params accepted by the Sharethrough","type":"object","properties":{"pkey":{"type":"string","description":"placement key to use."},"iframe":{"type":"boolean","description":"whether or not to stay in iframe","default":false},"iframeSize":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"integer"},"description":"iframe dimensions","default":[0,0]},"bidfloor":{"type":"number","description":"The floor price, or minimum amount, a publisher will accept for an impression, given in CPM in USD"}},"required":["pkey"]}, "silvermob"={"$schema":"http://json-schema.org/draft-04/schema#","title":"SilverMob Adapter Params","description":"A schema which validates params accepted by the SilverMob adapter","type":"object","properties":{"zoneid":{"type":"string","description":"Zone ID"},"host":{"type":"string","description":"Host"}},"required":["zoneid","host"]}, "smaato"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Smaato Adapter Params","description":"A schema which validates params accepted by the Smaato adapter","type":"object","properties":{"publisherId":{"type":"string","description":"A unique identifier for this impression within the context of the bid request"},"adspaceId":{"type":"string","description":"Identifier for specific ad placement is SOMA adspaceId"}},"required":["publisherId","adspaceId"]}, "smartadserver"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Smartadserver Adapter Params","description":"A schema which validates params accepted by the Smartadserver adapter","type":"object","properties":{"siteId":{"type":"integer","description":"The site id.","minimum":1},"pageId":{"type":"integer","description":"The page id.","minimum":1},"formatId":{"type":"integer","description":"The format id.","minimum":1},"networkId":{"type":"integer","description":"The network id.","minimum":1}},"dependencies":{"siteId":{"required":["pageId","formatId"]},"pageId":{"required":["siteId","formatId"]},"formatId":{"required":["siteId","pageId"]}},"required":["networkId"]}, "smartrtb"={"$schema":"http://json-schema.org/draft-04/schema#","title":"SmartRTB Adapter Params","description":"A schema which validates params accepted by SmartRTB adapter","type":"object","properties":{"pub_id":{"type":"string","description":"Assigned publisher ID","minLength":4},"med_id":{"type":"string","description":"Property ID not zone ID not provided"},"zone_id":{"type":"string","description":"Specific zone ID for this placement, belonging to app/site","minLength":20},"force_bid":{"type":"boolean","description":"Force bids with a test creative"}},"required":["pub_id"]}, "smartyads"={"$schema":"http://json-schema.org/draft-04/schema#","title":"SmartyAds Adapter Params","description":"A schema which validates params accepted by the SmartyAds adapter","type":"object","properties":{"host":{"type":"string","description":"Network host to send request"},"sourceid":{"type":"string","description":"Partner id"},"accountid":{"type":"string","description":"Account id"}},"required":["host","sourceid","accountid"]}, "somoaudience"={"$schema":"http://json-schema.org/draft-04/schema#","title":"SomoAudience Adapter Params","description":"A schema which validates params accepted by the SomoAudience adapter","type":"object","properties":{"placement_hash":{"type":"string","description":"A hash defining the placement selling the impression"},"bid_floor":{"type":"number","description":"Bid Floor for Impression","minimum":0}},"required":["placement_hash"]}, "sonobi"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Sonobi Adapter Params","description":"A schema which validates params accepted by the Sonobi adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies /ad/unit/code or the sonobi placement_id"}},"required":["TagID"]}, "sovrn"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Sovrn Adapter Params","description":"A schema which validates params accepted by the Sovrn adapter","type":"object","properties":{"tagid":{"type":"string","description":"An ID which identifies the sovrn ad tag"},"tagId":{"type":"string","description":"An ID which identifies the sovrn ad tag (DEPRECATED, use "tagid" instead)"},"bidfloor":{"type":"number","description":"The minimum acceptable bid, in CPM, using US Dollars"}},"oneOf":[{"required":["tagid"]},{"required":["tagId"]}]}, "synacormedia"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Synacormedia Adapter Params","description":"A schema which validates params accepted by the Synacormedia adapter","type":"object","properties":{"seatId":{"type":"string","description":"The seat id."},"tagId":{"type":"string","description":"The tag id."}},"required":["seatId"]}, "tappx"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Tappx Adapter Params","description":"A schema which validates params accepted by the Tappx adapter","type":"object","properties":{"host":{"type":"string","description":"Tappx host"},"tappxkey":{"type":"string","description":"An ID which identifies the adunit"},"endpoint":{"type":"string","description":"Endpoint provided to publisher"},"bidfloor":{"type":"number","description":"Minimum bid for this impression expressed in CPM (USD)"}},"required":["host","tappxkey","endpoint"]}, "telaria"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Telaria Adapter Params","description":"A schema which validates params accepted by the Telaria adapter","type":"object","properties":{"adCode":{"type":"string","description":"The Ad Unit Code."},"seatCode":{"type":"string","description":"Your Seat Code."},"originalPublisherid":{"type":"string","description":"publisher ID from the original request"}},"required":["seatCode"]}, "triplelift"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Triplelift Adapter Params","description":"A schema which validates params accepted by the Triplelift adapter","type":"object","properties":{"inventoryCode":{"type":"string","description":"TripleLift inventory code for this ad unit (provided to you by your partner manager)"},"floor":{"type":"number","description":"the bid floor"}},"required":["inventoryCode"]}, "triplelift_native"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Triplelift Adapter Params","description":"A schema which validates params accepted by the Triplelift adapter","type":"object","properties":{"inventoryCode":{"type":"string","description":"TripleLift inventory code for this ad unit (provided to you by your partner manager)"},"floor":{"description":"the bid floor, in usd","type":"number"}},"required":["inventoryCode"]}, "ttx"={"$schema":"http://json-schema.org/draft-04/schema#","title":"33Across Adapter Params","description":"A schema which validates params accepted by the 33Across adapter","type":"object","properties":{"productId":{"type":"string","description":"Product type"},"siteId":{"type":"string","description":"Site Id"},"zoneId":{"type":"string","description":"Zone Id"}},"required":["productId","siteId"]}, "ucfunnel"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Ucfunnel Adapter Params","description":"A schema which validates params accepted by the Ucfunnel adapter","type":"object","properties":{"adunitid":{"type":"string","description":"ID for ad unit"},"partnerid":{"type":"string","description":"ID for partner"}},"required":["partnerid"]}, "unicorn"={"$schema":"http://json-schema.org/draft-04/schema#","title":"UNICORN Adapter Params","description":"A schema which validates params accepted by the UNICORN adapter","type":"object","properties":{"placementId":{"type":"string","description":"In Application, if placementId is empty, prebid server configuration id will be used as placementId."},"publisherId":{"type":"integer","description":"Account specific publisher id"},"mediaId":{"type":"string","description":"Publisher specific media id"},"accountId":{"type":"integer","description":"Account ID for charge request"}},"required":["mediaId","accountId"]}, "unruly"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Unruly Adapter Params","description":"A schema which validates params accepted by the Unruly adapter","type":"object","properties":{"uuid":{"type":"string","description":"uuid"},"siteid":{"type":"string","description":"ID for publisher site"}},"required":["uuid","siteid"]}, "valueimpression"={"$schema":"http://json-schema.org/draft-04/schema#","title":"ValueImpression Adapter Params","description":"Schema to validate params accepted by the ValueImpression adapter","type":"object","properties":{"siteId":{"type":"string","description":"Site ID"}},"required":["siteId"]}, "verizonmedia"={"$schema":"http://json-schema.org/draft-04/schema#","title":"VerizonMedia Adapter Params","description":"A schema which validates params accepted by the VerizonMedia adapter","type":"object","properties":{"dcn":{"type":"string","description":"Site ID provided by One Mobile"},"pos":{"type":"string","description":"Placement ID"}},"required":["dcn","pos"]}, "visx"={"$schema":"http://json-schema.org/draft-04/schema#","title":"VIS.X Adapter Params","description":"A schema which validates params accepted by VIS.X adapter","type":"object","properties":{"uid":{"type":"integer","description":"An ID which identifies this placement of the impression"},"size":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2,"description":"An array of two integer containing the dimension"}},"required":["uid"]}, "vrtcal"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Vrtcal Adapter Params","description":"A schema which validates params accepted by the Vrtcal adapter","type":"object","properties":{"just_an_unused_vrtcal_param":{"type":"string","description":"We only have this param as the prebid server crashes without at least 1 custom param; Not set to required to achieve parameter-less custom functionality"}},"required":[]}, "yeahmobi"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yeahmobi Adapter Params","description":"A schema which validates params accepted by the Yeahmobi adapter","type":"object","properties":{"pubId":{"type":"string","description":"Publisher ID","minLength":1},"zoneId":{"type":"string","description":"Zone Id","minLength":1}},"required":["pubId","zoneId"]}, "yieldlab"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yieldlab Adapter Params","description":"A schema which validates params accepted by the Yieldlab adapter","type":"object","properties":{"adslotId":{"type":"string","description":"Yieldlab ID of the ad slot"},"supplyId":{"type":"string","description":"Yieldlab ID of the supply"},"adSize":{"type":"string","description":"Size of the adslot in pixel, e.g. 200x50"},"extId":{"type":"string","description":"External ID used for reporting"},"targeting":{"type":"object","description":"Targeting information in key value pairs"}},"required":["adslotId","supplyId","adSize"]}, "yieldmo"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yieldmo Adapter Params","description":"A schema which validates params accepted by the Yieldmo adapter","type":"object","properties":{"placementId":{"type":"string","description":"Internal Yieldmo Placement ID"}},"required":["placementId"]}, "yieldone"={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yieldone Adapter Params","description":"A schema which validates params accepted by the Yieldone adapter","type":"object","properties":{"placementId":{"type":"string","description":"Internal Yieldone Placement ID"}},"required":["placementId"]}, "zeroclickfraud"={"$schema":"http://json-schema.org/draft-04/schema#","title":"ZeroClickFraud Adapter Params","description":"A schema which validates params accepted by the ZeroClickFraud adapter","type":"object","properties":{"sourceId":{"type":"integer","minimum":1,"description":"Website Source Id"},"host":{"type":"string","description":"Network Host to request from"}},"required":["host","sourceId"]}}>
to contain:
<[avocet={"$schema":"http://json-schema.org/draft-04/schema#","title":"Avocet Adapter Params","description":"A schema which validates params accepted by the Avocet adapter","type":"object","properties":{"placement":{"type":"string","description":"An Avocet placement ID"},"placement_code":{"type":"string","description":"An Avocet placement external code"}},"oneOf":[{"required":["placement"]},{"required":["placement_code"]}]},
rtbhouse={"$schema":"http://json-schema.org/draft-04/schema#","title":"RTB House Adapter Params","description":"A schema which validates params accepted by the RTB House adapter","type":"object","properties":{"publisherId":{"type":"string","description":"The publisherโ–’s ID provided by RTB House"}},"required":["publisherId"]},
lunamedia={"$schema":"http://json-schema.org/draft-04/schema#","title":"LunaMedia Adapter Params","description":"A schema which validates params accepted by the LunaMedia adapter","type":"object","properties":{"pubid":{"type":"string","description":"An id used to identify LunaMedia publisher.","minLength":8},"placement":{"type":"string","description":"A placement created on adserver."}},"required":["pubid"]},
mgid={"$schema":"http://json-schema.org/draft-04/schema#","title":"Mgid Params","description":"A schema which validates params accepted by the Mgid","type":"object","properties":{"accountId":{"type":"string","description":"Internal Mgid account ID"},"placementId":{"type":"string","description":"optional internal Mgid Placement ID"},"cur":{"type":"string","description":"optional bidfloor currency"},"currency":{"type":"string","description":"optional bidfloor currency"},"bidfloor":{"type":"number","description":"optional minimum acceptable bid, in CPM, USD by default"},"bidFloor":{"type":"number","description":"optional minimum acceptable bid, in CPM, USD by default"}},"required":["accountId"]},
somoaudience={"$schema":"http://json-schema.org/draft-04/schema#","title":"SomoAudience Adapter Params","description":"A schema which validates params accepted by the SomoAudience adapter","type":"object","properties":{"placement_hash":{"type":"string","description":"A hash defining the placement selling the impression"},"bid_floor":{"type":"number","description":"Bid Floor for Impression","minimum":0}},"required":["placement_hash"]},
dmx={"$schema":"http://json-schema.org/draft-04/schema#","title":"District M DMX Adapter Params","description":"A schema which validates params accepted by the DMX adapter","type":"object","properties":{"memberid":{"type":"string","description":"Represent boost MemberId from districtm UI"},"placement_id":{"type":"string","description":"memberid replacement / alternative value or equivalent"},"seller_id":{"type":"string","description":"Represent DMX Partner when you get onboarded, this is for specific setup BURL vs NURL"},"dmxid":{"type":"string","description":"Represent the placement ID dmxid equivalent to 'tagid', this value is optional"},"tagid":{"type":"string","description":"Represent the placement ID tagid equivalent to 'dmxid', this value is optional"},"bidfloor":{"type":"number","description":"The minimum price acceptable for a bid, this is optional since we do get the one from the original openrtb request"}},"required":["memberid"]},
outbrain={"$schema":"http://json-schema.org/draft-04/schema#","title":"Outbrain Adapter Params","description":"A schema which validates params accepted by the Outbrain adapter","type":"object","properties":{"publisher":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"domain":{"type":"string"}},"required":["id"]},"tagid":{"type":"string"},"bcat":{"type":"array","items":{"type":"string"}},"badv":{"type":"array","items":{"type":"string"}}},"required":["publisher"]},
appnexus={"$schema":"http://json-schema.org/draft-04/schema#","title":"Appnexus Adapter Params","description":"A schema which validates params accepted by the AppNexus adapter","type":"object","properties":{"placement_id":{"type":"integer","description":"An ID which identifies this placement of the impression"},"placementId":{"type":"integer","description":"Deprecated, use placement_id instead."},"inv_code":{"type":"string","description":"A code identifying the inventory of this placement."},"invCode":{"type":"string","description":"Deprecated, use inv_code instead."},"member":{"type":"string","description":"An ID which identifies the member selling the impression."},"keywords":{"type":"array","minItems":1,"items":{"type":"object","description":"A key with one or more values associated with it. These are used in buy-side segment targeting.","properties":{"key":{"type":"string"},"value":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["key"]}},"traffic_source_code":{"type":"string","description":"Specifies the third-party source of this impression."},"trafficSourceCode":{"type":"string","description":"Deprecated, use traffic_source_code instead."},"reserve":{"type":"number","description":"The minimium acceptable bid, in CPM, using US Dollars"},"position":{"type":"string","enum":["above","below"],"description":"Specifies the ad unit as above or below the fold"},"use_pmt_rule":{"type":"boolean","description":"Boolean to signal AppNexus to apply the relevant payment rule"},"private_sizes":{"type":"array","items":{"type":"object","properties":{"w":{"type":"integer"},"h":{"type":"integer"}},"required":["w","h"]},"description":"Private sizes (ex: [{"w": 300, "h": 250},{...}]), experimental, may not be supported."}},"oneOf":[{"oneOf":[{"required":["placementId"]},{"required":["placement_id"]}]},{"oneOf":[{"required":["invCode","member"]},{"required":["inv_code","member"]}]}],"not":{"required":["placementId","invCode","member"]}},
sharethrough={"$schema":"http://json-schema.org/draft-04/schema#","title":"Sharethrough Adapter Params","description":"A schema which validates params accepted by the Sharethrough","type":"object","properties":{"pkey":{"type":"string","description":"placement key to use."},"iframe":{"type":"boolean","description":"whether or not to stay in iframe","default":false},"iframeSize":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"integer"},"description":"iframe dimensions","default":[0,0]},"bidfloor":{"type":"number","description":"The floor price, or minimum amount, a publisher will accept for an impression, given in CPM in USD"}},"required":["pkey"]},
advangelists={"$schema":"http://json-schema.org/draft-04/schema#","title":"Advangelists Adapter Params","description":"A schema which validates params accepted by the Advangelists adapter","type":"object","properties":{"pubid":{"type":"string","description":"An id used to identify Advangelists publisher.","minLength":8},"placement":{"type":"string","description":"An id used to identify placements."}},"required":["pubid"]},
pulsepoint={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pulsepoint Adapter Params","description":"A schema which validates params accepted by the Pulsepoint adapter","type":"object","properties":{"cp":{"type":"integer","description":"An ID which identifies the publisher selling the impression"},"ct":{"type":"integer","description":"An ID which identifies the ad slot being sold"}},"required":["cp","ct"]},
smartyads={"$schema":"http://json-schema.org/draft-04/schema#","title":"SmartyAds Adapter Params","description":"A schema which validates params accepted by the SmartyAds adapter","type":"object","properties":{"host":{"type":"string","description":"Network host to send request"},"sourceid":{"type":"string","description":"Partner id"},"accountid":{"type":"string","description":"Account id"}},"required":["host","sourceid","accountid"]},
between={"$schema":"http://json-schema.org/draft-04/schema#","title":"BetweenDigital Adapter Params","description":"A schema which validates params accepted by the BetweenDigital adapter","type":"object","properties":{"host":{"type":"string","description":"Network Host to request from","enum":["lbs-eu1.ads","lbs-ru1.ads","lbs-us-east1.ads","lbs-asia1.ads"]},"publisher_id":{"type":"string","description":"Publisher ID from Between Exchange control panel"},"bid_floor":{"type":"number","description":"The minimum price acceptable for a bid"},"bid_floor_cur":{"type":"string","description":"Currency of bid floor","enum":["USD","EUR","RUB"]}},"required":["host","publisher_id"]},
nanointeractive={"$schema":"http://json-schema.org/draft-04/schema#","title":"NanoInteractive Adapter Params","description":"A schema which validates params accepted by the NanoInteractive adapter","type":"object","properties":{"pid":{"type":"string","description":"Placement id"},"nq":{"type":"array","items":{"type":"string"},"description":"search queries"},"category":{"type":"string","description":"IAB Category"},"subId":{"type":"string","description":"any segment value provided by publisher"},"ref":{"type":"string","description":"referer"}},"required":["pid"]},
kidoz={"$schema":"http://json-schema.org/draft-04/schema#","title":"Kidoz Adapter Params","description":"A schema which validates params accepted by the Kidoz adapter","type":"object","properties":{"access_token":{"type":"string","minLength":1,"description":"Kidoz access_token"},"publisher_id":{"type":"string","minLength":1,"description":"Kidoz publisher_id"}},"required":["access_token","publisher_id"]},
improvedigital={"$schema":"http://json-schema.org/draft-04/schema#","title":"Improve Digital Adapter Params","description":"A schema which validates params accepted by Improve Digital adapter","type":"object","properties":{"placementId":{"type":"integer","minimum":1,"description":"An ID which identifies this placement of the impression"},"publisherId":{"type":"integer","minimum":1,"description":"An ID which identifies publisher. Required when using a placementKey"},"placementKey":{"type":"string","description":"An uniq name which identifies this placement of the impression. Must be used with publisherId"},"keyValues":{"type":"object","description":"Contains one or more key-value pairings for key-value targeting"},"size":{"type":"object","properties":{"w":{"type":"integer"},"h":{"type":"integer"}},"required":["w","h"],"description":"Placement size"}},"oneOf":[{"required":["placementId"]},{"required":["publisherId","placementKey"]}]},
krushmedia={"$schema":"http://json-schema.org/draft-04/schema#","title":"Krushmedia Adapter Params","description":"A schema which validates params accepted by the Krushmedia adapter","type":"object","properties":{"key":{"type":"string","description":"ssp key"}},"required":["key"]},
invibes={"$schema":"http://json-schema.org/draft-04/schema#","title":"Invibes Adapter Params","description":"A schema which validates params accepted by the Invibes adapter","type":"object","properties":{"placementId":{"type":"string","minLength":1,"description":"An ID which identifies the site selling the impression"},"domainId":{"type":"integer","description":"Ad domain id"},"debug":{"type":"object","properties":{"testBvid":{"type":"string"},"testLog":{"type":"boolean"}},"description":"Parameters used for debugging purposes"}},"required":["placementId"]},
yieldmo={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yieldmo Adapter Params","description":"A schema which validates params accepted by the Yieldmo adapter","type":"object","properties":{"placementId":{"type":"string","description":"Internal Yieldmo Placement ID"}},"required":["placementId"]},
ix={"$schema":"http://json-schema.org/draft-04/schema#","title":"ix Adapter Params","description":"A schema which validates params accepted by the ix adapter","type":"object","properties":{"siteId":{"type":"string","description":"An ID which identifies the site selling the impression"},"size":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2,"description":"An array of two integer containing the dimension"}},"required":["siteId"]},
valueimpression={"$schema":"http://json-schema.org/draft-04/schema#","title":"ValueImpression Adapter Params","description":"Schema to validate params accepted by the ValueImpression adapter","type":"object","properties":{"siteId":{"type":"string","description":"Site ID"}},"required":["siteId"]},
audienceNetwork={"$schema":"http://json-schema.org/draft-04/schema#","title":"Facebook Audience Network Adapter Params","description":"A schema which validates params accepted by the Facebook Audience Network adapter","type":"object","properties":{"placementId":{"type":"string","description":"An ID which identifies the placement selling the impression"}},"required":["placementId"]},
33across={"$schema":"http://json-schema.org/draft-04/schema#","title":"33Across Adapter Params","description":"A schema which validates params accepted by the 33Across adapter","type":"object","properties":{"productId":{"type":"string","description":"Product type"},"siteId":{"type":"string","description":"Site Id"},"zoneId":{"type":"string","description":"Zone Id"}},"required":["productId","siteId"]},
deepintent={"$schema":"http://json-schema.org/draft-04/schema#","title":"Deepintent Adapter Params","description":"A schema which validates params accepted by the Deepintent adapter","type":"object","properties":{"tagId":{"type":"string","description":"An ID which identifies the deepintent ad tag"}},"required":["tagId"]},
verizonmedia={"$schema":"http://json-schema.org/draft-04/schema#","title":"VerizonMedia Adapter Params","description":"A schema which validates params accepted by the VerizonMedia adapter","type":"object","properties":{"dcn":{"type":"string","description":"Site ID provided by One Mobile"},"pos":{"type":"string","description":"Placement ID"}},"required":["dcn","pos"]},
conversant={"$schema":"http://json-schema.org/draft-04/schema#","title":"Conversant Adapter Params","description":"A schema which validates params accepted by the Conversant adapter.","type":"object","properties":{"site_id":{"type":"string","description":"A Conversant specific ID which identifies the site."},"secure":{"type":"integer","description":"Override http/https context on ad markup."},"bidfloor":{"type":"number","description":"Minimum bid price that will be considered."},"tag_id":{"type":"string","description":"Identifies specific ad placement."},"position":{"type":"integer","description":"Ad position on screen."},"mimes":{"type":"array","description":"Array of content MIME types. For videos only.","items":{"type":"string"}},"maxduration":{"type":"integer","description":"Maximum duration in seconds. For videos only."},"api":{"type":"array","description":"Array of supported API frameworks. For videos only.","items":{"type":"integer"}},"protocols":{"type":"array","description":"Array of supported video protocols. For videos only.","items":{"type":"integer"}}},"required":[]},
openx={"$schema":"http://json-schema.org/draft-04/schema#","title":"Openx Adapter Params","description":"A schema which validates params accepted by the Openx adapter","type":"object","properties":{"unit":{"type":"string","description":"The ad unit id.","pattern":"^[0-9]+$"},"delDomain":{"type":"string","description":"The delivery domain for the customer.","pattern":"\.[a-zA-Z]{2,3}$","format":"hostname"},"platform":{"type":"string","description":"The platform id for the customer.","format":"uuid"},"customFloor":{"type":"number","description":"The minimum CPM price in USD.","minimum":0},"customParams":{"type":"object","description":"User-defined targeting key-value pairs."}},"required":["unit"],"anyOf":[{"required":["delDomain"]},{"required":["platform"]}]},
zeroclickfraud={"$schema":"http://json-schema.org/draft-04/schema#","title":"ZeroClickFraud Adapter Params","description":"A schema which validates params accepted by the ZeroClickFraud adapter","type":"object","properties":{"sourceId":{"type":"integer","minimum":1,"description":"Website Source Id"},"host":{"type":"string","description":"Network Host to request from"}},"required":["host","sourceId"]},
revcontent={"$schema":"http://json-schema.org/draft-04/schema#","title":"Revcontent Adapter Params","description":"A schema which validates params accepted by the Revcontent adapter","type":"object","properties":{},"required":[]},
triplelift_native={"$schema":"http://json-schema.org/draft-04/schema#","title":"Triplelift Adapter Params","description":"A schema which validates params accepted by the Triplelift adapter","type":"object","properties":{"inventoryCode":{"type":"string","description":"TripleLift inventory code for this ad unit (provided to you by your partner manager)"},"floor":{"description":"the bid floor, in usd","type":"number"}},"required":["inventoryCode"]},
marsmedia={"$schema":"http://json-schema.org/draft-04/schema#","title":"Marsmedia Adapter Params","description":"A schema which validates params accepted by the Marsmedia adapter","type":"object","properties":{"zone":{"type":"string","description":"Zone ID to use."}},"required":["zone"]},
vrtcal={"$schema":"http://json-schema.org/draft-04/schema#","title":"Vrtcal Adapter Params","description":"A schema which validates params accepted by the Vrtcal adapter","type":"object","properties":{"just_an_unused_vrtcal_param":{"type":"string","description":"We only have this param as the prebid server crashes without at least 1 custom param; Not set to required to achieve parameter-less custom functionality"}},"required":[]},
adform={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adform Adapter Params","description":"A schema which validates params accepted by the Adform adapter","type":"object","properties":{"mid":{"type":["integer","string"],"description":"An ID which identifies the placement selling the impression"},"priceType":{"type":"string","enum":["gross","net"],"description":"An expected price type (net or gross) of bids."},"mkv":{"type":"string","description":"Comma-separated key-value pairs. Forbidden symbols: &. Example: mkv='color:blue,length:350'","pattern":"^(\s
|((\s*[^,:&\\s]+\s*:[^,:&])(,\s[^,:&\\s]+\s*:[^,:&])))$"},"mkw":{"type":"string","description":"Comma-separated keywords. Forbidden symbols: &.","pattern":"^[^&]$"},"cdims":{"type":"string","description":"Comma-separated creative dimensions.","pattern":"(^\d+x\d+)(,\d+x\d+)$"},"minp":{"type":"number","description":"The minimum CPM price.","minimum":0},"url":{"type":"string","description":"Custom URL for targeting."}},"required":["mid"]},
aja={"$schema":"http://json-schema.org/draft-04/schema#","title":"AJA Adapter Params","description":"A schema which validates params accepted by the AJA adapter","type":"object","properties":{"asi":{"type":"string","description":"Ad spot ID"}},"required":["asi"]},
inmobi={"$schema":"http://json-schema.org/draft-04/schema#","title":"InMobi Adapter Params","description":"A schema which validates params accepted by the InMobi adapter","type":"object","properties":{"plc":{"type":["string"],"description":"An ID corresponding to the placement selling the impression"}},"required":["plc"]},
ucfunnel={"$schema":"http://json-schema.org/draft-04/schema#","title":"Ucfunnel Adapter Params","description":"A schema which validates params accepted by the Ucfunnel adapter","type":"object","properties":{"adunitid":{"type":"string","description":"ID for ad unit"},"partnerid":{"type":"string","description":"ID for partner"}},"required":["partnerid"]},
kubient={"$schema":"http://json-schema.org/draft-04/schema#","title":"Kubient Adapter Params","description":"A schema which validates params accepted by the Kubient adapter","type":"object","properties":{"zoneid":{"type":"string","description":"Zone ID identifies Kubient placement ID.","minLength":1}}},
gamoshi={"$schema":"http://json-schema.org/draft-04/schema#","title":"Gamoshi Adapter Params","description":"A schema which validates params accepted by Gamoshi adapter","type":"object","properties":{"supplyPartnerId":{"type":"string","description":"Supply partner id to use."},"favoredMediaType":{"type":"string","description":"favored media type"}},"required":["supplyPartnerId"]},
beachfront={"$schema":"http://json-schema.org/draft-04/schema#","title":"Beachfront Adapter Params","description":"A schema which validates params accepted by the Beachfront adapter","type":"object","properties":{"appId":{"type":"string","description":"The id of an inventory target. This can only be used in requests that contain one media type. It will be applied to all imps in the request."},"appIds":{"type":"object","description":"An object that specifies appIds for specific media types. This can be used for either single media type requests or multiple.","properties":{"video":{"type":"string","description":"An appId string that will be applied to video requests in this imp."},"banner":{"type":"string","description":"An appId string that will be applied to banner requests in this imp."}}},"bidfloor":{"type":"number","description":"The price floor for the bid."},"videoResponseType":{"type":"string","description":"By default the video response will be an AdM element containing VAST 3.0 markup including tracking, click through, and mediafile elements pointing to mp4, webm or other playable media files or Vpaid media as configured for the exchange at beachfront.io. Optionally, set this to 'nurl' to receive a URI pointing to VAST 3.0 markup which will contain a mediafile pointing to a beachfront neptune javascript video player which will load your video and take care of tracking, etc. Regardless of which format is selected, the id of the returned impression will be the provided impression id (imp[{'id'...},...] in the request) with the format appended. The impression id will be returned unchanged as 'impid'. So if you indicate 'nurl', and an impression id 'someImp', the returned impression will have an 'impid' value of 'someImp', and the 'id' value 'someImpNurlVideo'. This is to differentiate the object in the case that a request includes both video and banner elements. Setting videoResponseType to any other string will have no effect and the default format (AdM) will be returned."}},"required":["bidfloor"],"oneOf":[{"required":["appId"]},{"required":["appIds"]}]},
adot={"$schema":"http://json-schema.org/draft-04/schema#","title":"The Adot Adapter Params","description":"A schema which validates params accepted by Adot adapter","type":"object","properties":{"placementId":{"type":"string","description":"An ID which identifies this placement of the impression"},"parallax":{"type":"boolean","description":"It determines if the wanted advertising format is a parallax."}},"required":[]},
logicad={"$schema":"http://json-schema.org/draft-04/schema#","title":"Logicad Adapter Params","description":"A schema which validates params accepted by the Logicad adapter","type":"object","properties":{"tid":{"type":"string","description":"Logicad for Publishers placement ID"}},"required":["tid"]},
telaria={"$schema":"http://json-schema.org/draft-04/schema#","title":"Telaria Adapter Params","description":"A schema which validates params accepted by the Telaria adapter","type":"object","properties":{"adCode":{"type":"string","description":"The Ad Unit Code."},"seatCode":{"type":"string","description":"Your Seat Code."},"originalPublisherid":{"type":"string","description":"publisher ID from the original request"}},"required":["seatCode"]},
pubnative={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pubnative Adapter Params","description":"A schema which validates params accepted by the Pubnative adapter","type":"object","properties":{"zone_id":{"type":"integer","description":"The ad zone identifier"},"app_auth_token":{"type":"string","description":"The app's authentication token"}},"required":["zone_id","app_auth_token"]},
visx={"$schema":"http://json-schema.org/draft-04/schema#","title":"VIS.X Adapter Params","description":"A schema which validates params accepted by VIS.X adapter","type":"object","properties":{"uid":{"type":"integer","description":"An ID which identifies this placement of the impression"},"size":{"type":"array","items":{"type":"integer"},"minItems":2,"maxItems":2,"description":"An array of two integer containing the dimension"}},"required":["uid"]},
adyoulike={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdYouLike Adapter Params","description":"A schema which validates params accepted by the AdYouLike adapter","type":"object","properties":{"placement":{"type":"string","description":"Placement Id"},"campaign":{"type":"string","description":"Id of a forced campaign"},"track":{"type":"string","description":"Id of a forced Track"},"creative":{"type":"string","description":"Id of a forced creative"},"source":{"type":"string","description":"context of the campaign"},"debug":{"type":"string","description":"Arbitrary id used for debug purpose"}},"required":["placement"]},
districtm={"$schema":"http://json-schema.org/draft-04/schema#","title":"Appnexus Adapter Params","description":"A schema which validates params accepted by the AppNexus adapter","type":"object","properties":{"placement_id":{"type":"integer","description":"An ID which identifies this placement of the impression"},"placementId":{"type":"integer","description":"Deprecated, use placement_id instead."},"inv_code":{"type":"string","description":"A code identifying the inventory of this placement."},"invCode":{"type":"string","description":"Deprecated, use inv_code instead."},"member":{"type":"string","description":"An ID which identifies the member selling the impression."},"keywords":{"type":"array","minItems":1,"items":{"type":"object","description":"A key with one or more values associated with it. These are used in buy-side segment targeting.","properties":{"key":{"type":"string"},"value":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["key"]}},"traffic_source_code":{"type":"string","description":"Specifies the third-party source of this impression."},"trafficSourceCode":{"type":"string","description":"Deprecated, use traffic_source_code instead."},"reserve":{"type":"number","description":"The minimium acceptable bid, in CPM, using US Dollars"},"position":{"type":"string","enum":["above","below"],"description":"Specifies the ad unit as above or below the fold"},"use_pmt_rule":{"type":"boolean","description":"Boolean to signal AppNexus to apply the relevant payment rule"},"private_sizes":{"type":"array","items":{"type":"object","properties":{"w":{"type":"integer"},"h":{"type":"integer"}},"required":["w","h"]},"description":"Private sizes (ex: [{"w": 300, "h": 250},{...}]), experimental, may not be supported."}},"oneOf":[{"oneOf":[{"required":["placementId"]},{"required":["placement_id"]}]},{"oneOf":[{"required":["invCode","member"]},{"required":["inv_code","member"]}]}],"not":{"required":["placementId","invCode","member"]}},
grid={"$schema":"http://json-schema.org/draft-04/schema#","title":"TheMediaGrid Adapter Params","description":"A schema which validates params accepted by TheMediaGrid adapter","type":"object","properties":{"uid":{"type":"integer","description":"An ID which identifies this placement of the impression"}},"required":[]},
consumable={"$schema":"http://json-schema.org/draft-04/schema#","title":"Consumable Adapter Params","description":"A schema which validates params accepted by the Consumable adapter","type":"object","properties":{"siteId":{"type":"number","description":"The site ID from Consumable","pattern":"^[0-9]+$"},"networkId":{"type":"number","description":"The network ID from Consumable","pattern":"^[0-9]+$"},"unitId":{"type":"number","description":"The unit ID from Consumable","pattern":"^[0-9]+$"},"unitName":{"type":"string","description":"The unit name from Consumable (expected to be a valid CSS class name)","pattern":"^-?[_a-zA-Z]+[_a-zA-Z0-9-]*$"}},"required":["siteId","networkId","unitId"]},
tappx={"$schema":"http://json-schema.org/draft-04/schema#","title":"Tappx Adapter Params","description":"A schema which validates params accepted by the Tappx adapter","type":"object","properties":{"host":{"type":"string","description":"Tappx host"},"tappxkey":{"type":"string","description":"An ID which identifies the adunit"},"endpoint":{"type":"string","description":"Endpoint provided to publisher"},"bidfloor":{"type":"number","description":"Minimum bid for this impression expressed in CPM (USD)"}},"required":["host","tappxkey","endpoint"]},
unicorn={"$schema":"http://json-schema.org/draft-04/schema#","title":"UNICORN Adapter Params","description":"A schema which validates params accepted by the UNICORN adapter","type":"object","properties":{"placementId":{"type":"string","description":"In Application, if placementId is empty, prebid server configuration id will be used as placementId."},"publisherId":{"type":"integer","description":"Account specific publisher id"},"mediaId":{"type":"string","description":"Publisher specific media id"},"accountId":{"type":"integer","description":"Account ID for charge request"}},"required":["mediaId","accountId"]},
adprime={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adprime Adapter Params","description":"A schema which validates params accepted by the Adprime adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies the adprime ad tag"}},"required":["TagID"]},
gamma={"$schema":"http://json-schema.org/draft-04/schema#","title":"Gamma Adapter Params","description":"A schema which validates params accepted by Gamma adapter","type":"object","properties":{"id":{"type":"string","description":"Partner ID"},"zid":{"type":"string","description":"Zone ID"},"wid":{"type":"string","description":"Web ID"}},"required":["id","zid","wid"]},
silvermob={"$schema":"http://json-schema.org/draft-04/schema#","title":"SilverMob Adapter Params","description":"A schema which validates params accepted by the SilverMob adapter","type":"object","properties":{"zoneid":{"type":"string","description":"Zone ID"},"host":{"type":"string","description":"Host"}},"required":["zoneid","host"]},
algorix={"$schema":"http://json-schema.org/draft-04/schema#","title":"AlgoriX Adapter Params","description":"A schema which validates params accepted by the AlgoriX adapter","type":"object","properties":{"sid":{"type":"string","description":"Your Sid"},"token":{"type":"string","description":"Your Token"}},"required":["sid","token"]},
triplelift={"$schema":"http://json-schema.org/draft-04/schema#","title":"Triplelift Adapter Params","description":"A schema which validates params accepted by the Triplelift adapter","type":"object","properties":{"inventoryCode":{"type":"string","description":"TripleLift inventory code for this ad unit (provided to you by your partner manager)"},"floor":{"type":"number","description":"the bid floor"}},"required":["inventoryCode"]},
adhese={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adhese Adapter Parameters","description":"Validation for parameters handled by the Adhese adapter","type":"object","properties":{"account":{"type":"string","description":"Your Adhese account name. If unknown, please contact your sales rep"},"location":{"type":"string","description":"The location you want to refer to for a specific section or page, as defined in your Adhese inventory"},"format":{"type":"string","description":"The format you accept for this unit, as defined in your Adhese inventory"},"targets":{"type":"object","description":"Target params, as defined in your Adhese setup."}},"required":["account","location","format"]},
lifestreet={"$schema":"http://json-schema.org/draft-04/schema#","title":"Lifestreet Adapter Params","description":"A schema which validates params accepted by the Lifestreet adapter","type":"object","properties":{"slot_tag":{"type":"string","description":"A tag which identifies the ad slot"}},"required":["slot_tag"]},
adocean={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdOcean Adapter Params","description":"A schema which validates params accepted by the AdOcean adapter","type":"object","properties":{"emiter":{"type":"string","description":"AdOcean emiter","pattern":".+"},"masterId":{"type":"string","description":"Master's id","pattern":"^[\w.]+$"},"slaveId":{"type":"string","description":"Slave's id","pattern":"^adocean[\w.]+$"}},"required":["emiter","masterId","slaveId"]},
acuityads={"$schema":"http://json-schema.org/draft-04/schema#","title":"AcuityAds Adapter Params","description":"A schema which validates params accepted by the AcuityAds adapter","type":"object","properties":{"host":{"type":"string","description":"Network host to send request","minLength":1},"accountid":{"type":"string","description":"Account id","minLength":1}},"required":["host","accountid"]},
decenterads={"$schema":"http://json-schema.org/draft-04/schema#","title":"DecenterAds Adapter Params","description":"A schema which validates params accepted by the DecenterAds adapter","type":"object","properties":{"placementId":{"type":"string","minLength":1,"description":"An ID which identifies the DecenterAds placement"},"customParams":{"type":"object","description":"User-defined targeting key-value pairs."}},"required":["placementId"]},
mobilefuse={"$schema":"http://json-schema.org/draft-04/schema#","title":"MobileFuse Adapter Params","description":"A schema which validates params accepted by the MobileFuse adapter","type":"object","properties":{"placement_id":{"type":"integer","description":"An ID which identifies this specific inventory placement"},"pub_id":{"type":"integer","description":"An ID which identifies the publisher selling the inventory."},"tagid_src":{"type":"string","description":"ext if passing publisher's ids, empty if passing MobileFuse IDs in placement_id field. Defaults to empty"}},"required":["placement_id","pub_id"]},
smaato={"$schema":"http://json-schema.org/draft-04/schema#","title":"Smaato Adapter Params","description":"A schema which validates params accepted by the Smaato adapter","type":"object","properties":{"publisherId":{"type":"string","description":"A unique identifier for this impression within the context of the bid request"},"adspaceId":{"type":"string","description":"Identifier for specific ad placement is SOMA adspaceId"}},"required":["publisherId","adspaceId"]},
adpone={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adpone Adapter Params","description":"A schema which validates params accepted by the adpone adapter","type":"object","properties":{"placementId":{"type":"string","description":"Placement Id"}},"required":[]},
adf={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adf Adapter Params","description":"A schema which validates params accepted by the adf adapter","type":"object","properties":{"mid":{"type":["integer","string"],"pattern":"^\d+$","description":"An ID which identifies the placement selling the impression"}},"required":["mid"]},
adgeneration={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdGeneration Adapter Params","description":"A schema which validates params accepted by the AdGeneration adapter","type":"object","properties":{"id":{"type":"string","description":"Ad ID registered by AdGeneration."}},"required":["id"]},
loopme={"$schema":"http://json-schema.org/draft-04/schema#","title":"Loopme Adapter Params","description":"A schema which validates params accepted by the Loopme adapter","type":"object","properties":{"accountId":{"type":"string","description":"Account ID"}},"required":["accountId"]},
sonobi={"$schema":"http://json-schema.org/draft-04/schema#","title":"Sonobi Adapter Params","description":"A schema which validates params accepted by the Sonobi adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies /ad/unit/code or the sonobi placement_id"}},"required":["TagID"]},
yeahmobi={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yeahmobi Adapter Params","description":"A schema which validates params accepted by the Yeahmobi adapter","type":"object","properties":{"pubId":{"type":"string","description":"Publisher ID","minLength":1},"zoneId":{"type":"string","description":"Zone Id","minLength":1}},"required":["pubId","zoneId"]},
engagebdr={"$schema":"http://json-schema.org/draft-04/schema#","title":"EngageBDR Adapter Params","description":"A schema which validates params accepted by the EngageBDR adapter","type":"object","properties":{"sspid":{"type":"string","description":"SSPID parameter","pattern":"^[0-9]+$"}},"required":["sspid"]},
adtelligent={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adtelligent Adapter Params","description":"A schema which validates params accepted by the Adtelligent adapter","type":"object","properties":{"placementId":{"type":"integer","description":"An ID which identifies this placement of the impression"},"siteId":{"type":"integer","description":"An ID which identifies the site selling the impression"},"aid":{"type":"integer","description":"An ID which identifies the channel"},"bidFloor":{"type":"number","description":"BidFloor, US Dollars"}},"required":["aid"]},
eplanning={"$schema":"https://json-schema.org/draft-04/schema#","title":"EPlanning Adapter Params","description":"A schema which validates params accepted by the EPlanning adapter","type":"object","properties":{"ci":{"type":["string"],"description":"Client ID to use."},"adunit_code":{"type":["string"],"description":"Adunit Code."}},"required":["ci"]},
adkernelAdn={"$schema":"http://json-schema.org/draft-04/schema#","title":"AdkernelAdn Adapter Params","description":"A schema which validates params accepted by the AdkernelAdn adapter","type":"object","properties":{"pubId":{"type":"integer","minimum":1,"description":"Publisher Id to use."},"host":{"type":"string","description":"Network host to send request"}},"required":["pubId"]},
cpmstar={"$schema":"http://json-schema.org/draft-04/schema#","title":"Cpmstar Adapter Params","description":"Schema to validate params accepted by the Cpmstar adapter","type":"object","properties":{"placementId":{"type":"integer","description":"Cpmstar-specific ID for ad pool"},"subpoolId":{"type":"integer","description":"Cpmstar-specific ID for ad subpool"}},"required":["placementId"]},
ninthdecimal={"$schema":"http://json-schema.org/draft-04/schema#","title":"NinthDecimal Adapter Params","description":"A schema which validates params accepted by the NinthDecimal adapter","type":"object","properties":{"pubid":{"type":"string","description":"An id used to identify NinthDecimal publisher.","minLength":8},"placement":{"type":"string","description":"A placement created on adserver."}},"required":["pubid"]},
rhythmone={"$schema":"http://json-schema.org/draft-04/schema#","title":"Rhythmone Adapter Params","description":"A schema which validates params accepted by the Rhythmone adapter","type":"object","properties":{"placementId":{"type":"string","description":"An ID which is used to frame Rhythmone ad tag","minLength":1},"path":{"type":"string","description":"An ID which is used to frame Rhythmone ad tag","minLength":1},"zone":{"type":"string","description":"An ID which is used to frame Rhythmone ad tag","minLength":1}},"required":["placementId","path","zone"]},
synacormedia={"$schema":"http://json-schema.org/draft-04/schema#","title":"Synacormedia Adapter Params","description":"A schema which validates params accepted by the Synacormedia adapter","type":"object","properties":{"seatId":{"type":"string","description":"The seat id."},"tagId":{"type":"string","description":"The tag id."}},"required":["seatId"]},
emx_digital={"$schema":"http://json-schema.org/draft-04/schema#","title":"EMX Digital Adapter Params","description":"A schema which validates params accepted by the EMX Digital adapter","type":"object","properties":{"tagid":{"type":"string","description":"The id of an inventory target"},"bidfloor":{"type":"string","description":"The minimum price acceptable for a bid"}},"required":["tagid"]},
yieldlab={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yieldlab Adapter Params","description":"A schema which validates params accepted by the Yieldlab adapter","type":"object","properties":{"adslotId":{"type":"string","description":"Yieldlab ID of the ad slot"},"supplyId":{"type":"string","description":"Yieldlab ID of the supply"},"adSize":{"type":"string","description":"Size of the adslot in pixel, e.g. 200x50"},"extId":{"type":"string","description":"External ID used for reporting"},"targeting":{"type":"object","description":"Targeting information in key value pairs"}},"required":["adslotId","supplyId","adSize"]},
pubmatic={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pubmatic Adapter Params","description":"A schema which validates params accepted by the Pubmatic adapter","type":"object","properties":{"publisherId":{"type":"string","description":"An ID which identifies the publisher"},"adSlot":{"type":"string","description":"An ID which identifies the ad slot"},"wrapper":{"type":"object","description":"Specifies pubmatic openwrap configuration for a publisher","properties":{"profile":{"type":"integer","description":"An ID which identifies the openwrap profile of publisher"},"version":{"type":"integer","description":"An ID which identifies version of the openwrap profile"}},"required":["profile"]},"keywords":{"type":"array","minItems":1,"items":{"type":"object","description":"A key with one or more values associated with it. These are used in buy-side segment targeting.","properties":{"key":{"type":"string"},"value":{"type":"array","minItems":1,"items":{"type":"string"}}},"required":["key","value"]}}},"required":["publisherId"]},
rubicon={"$schema":"http://json-schema.org/draft-04/schema#","title":"Rubicon Adapter Params","description":"A schema which validates params accepted by the Rubicon adapter","type":"object","properties":{"accountId":{"type":"integer","minimum":1,"description":"An ID which identifies the publisher's account"},"siteId":{"type":"integer","minimum":1,"description":"An ID which identifies the site selling the impression"},"zoneId":{"type":"integer","minimum":1,"description":"An ID which identifies the sub-section of the site where the impression is located"},"inventory":{"type":"object","description":"An object defining arbitrary targeting key/value pairs related to the page","additionalProperties":{"type":"array"}},"visitor":{"type":"object","description":"An object defining arbitrary targeting key/value pairs related to the visitor","additionalProperties":{"type":"array"}},"pchain":{"type":"string","description":"A payment ID chain string"},"video":{"type":"object","description":"An object defining additional Rubicon video parameters","properties":{"language":{"type":"string","description":"Language of the ad - should match content video"},"playerHeight":{"type":["integer","string"],"description":"Height in pixels of the video player"},"playerWidth":{"type":["integer","string"],"description":"Width in pixels of the video player"},"size_id":{"type":"integer","description":"Rubicon size_id, used to describe type of video ad (preroll, postroll, etc)"},"skip":{"type":"integer","description":"Can this ad be skipped ( 0 = no, 1 = yes)"},"skipDelay":{"type":"integer","description":"number of seconds until the ad can be skipped"}}}},"required":["accountId","siteId","zoneId"]},
adkernel={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adkernel Adapter Params","description":"A schema which validates params accepted by the Adkernel adapter","type":"object","properties":{"zoneId":{"type":"integer","minimum":1,"description":"Publisher Id to use."},"host":{"type":"string","description":"Network host to send request"}},"required":["host","zoneId"]},
lockerdome={"$schema":"http://json-schema.org/draft-04/schema#","title":"LockerDome Adapter Params","description":"A schema which validates params accepted by the LockerDome adapter","type":"object","properties":{"adUnitId":{"type":"string","description":"A tag which identifies the LockerDome ad unit by adUnitId"}},"required":["adUnitId"]},
mobfoxpb={"$schema":"http://json-schema.org/draft-04/schema#","title":"Mobfox Adapter Params","description":"A schema which validates params accepted by the Mobfox adapter","type":"object","properties":{"TagID":{"type":"string","minLength":1,"description":"An ID which identifies the mobfox ad tag"},"key":{"type":"string","minLength":1,"description":"An ID which identifies the mobfox adexchange partner"}},"oneOf":[{"required":["TagID"]},{"required":["key"]}]},
unruly={"$schema":"http://json-schema.org/draft-04/schema#","title":"Unruly Adapter Params","description":"A schema which validates params accepted by the Unruly adapter","type":"object","properties":{"uuid":{"type":"string","description":"uuid"},"siteid":{"type":"string","description":"ID for publisher site"}},"required":["uuid","siteid"]},
smartrtb={"$schema":"http://json-schema.org/draft-04/schema#","title":"SmartRTB Adapter Params","description":"A schema which validates params accepted by SmartRTB adapter","type":"object","properties":{"pub_id":{"type":"string","description":"Assigned publisher ID","minLength":4},"med_id":{"type":"string","description":"Property ID not zone ID not provided"},"zone_id":{"type":"string","description":"Specific zone ID for this placement, belonging to app/site","minLength":20},"force_bid":{"type":"boolean","description":"Force bids with a test creative"}},"required":["pub_id"]},
gumgum={"$schema":"http://json-schema.org/draft-04/schema#","title":"GumGum Adapter Params","description":"A schema which validates params accepted by the GumGum adapter","type":"object","properties":{"zone":{"type":"string","description":"A tracking id used to identify GumGum zone.","minLength":8},"pubId":{"type":"integer","description":"A tracking id used to identify GumGum publisher"},"irisid":{"type":"string","description":"A hashed IRIS.TV Content ID"}},"anyOf":[{"required":["zone"]},{"required":["pubId"]}]},
pangle={"$schema":"http://json-schema.org/draft-04/schema#","title":"Pangle Adapter Params","description":"A schema which validates params accepted by the Pangle adapter","type":"object","properties":{"token":{"type":"string","description":"Access Token","pattern":".+"}},"required":["token"]},
adtarget={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adtarget Adapter Params","description":"A schema which validates params accepted by the Adtarget adapter","type":"object","properties":{"placementId":{"type":"integer","description":"An ID which identifies this placement of the impression"},"siteId":{"type":"integer","description":"An ID which identifies the site selling the impression"},"aid":{"type":"integer","description":"An ID which identifies the channel"},"bidFloor":{"type":"number","description":"BidFloor, US Dollars"}},"required":["aid"]},
orbidder={"$schema":"http://json-schema.org/draft-04/schema#","title":"Orbidder Adapter Params","description":"A schema which validates params accepted by the Orbidder adapter","type":"object","properties":{"accountId":{"type":"string","description":"The marketer's accountId."},"placementId":{"type":"string","description":"The placementId of the ad unit."},"bidfloor":{"type":"number","description":"The minimum CPM price in EUR.","minimum":0}},"required":["accountId","placementId"]},
amx={"$schema":"http://json-schema.org/draft-04/schema#","title":"AMX RTB Adapter Params","description":"A schema to validate params accepted by the AMX adapter","type":"object","properties":{"tagId":{"type":"string","description":"Set a tagId (overrides site.publisher.id, or app.publisher.id)"},"adUnitId":{"type":"string","description":"Override imp.tagid value to provide a custom value in AMX ad unit ID reporting"}}},
smartadserver={"$schema":"http://json-schema.org/draft-04/schema#","title":"Smartadserver Adapter Params","description":"A schema which validates params accepted by the Smartadserver adapter","type":"object","properties":{"siteId":{"type":"integer","description":"The site id.","minimum":1},"pageId":{"type":"integer","description":"The page id.","minimum":1},"formatId":{"type":"integer","description":"The format id.","minimum":1},"networkId":{"type":"integer","description":"The network id.","minimum":1}},"dependencies":{"siteId":{"required":["pageId","formatId"]},"pageId":{"required":["siteId","formatId"]},"formatId":{"required":["siteId","pageId"]}},"required":["networkId"]},
adman={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adman Adapter Params","description":"A schema which validates params accepted by the Adman adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies the adman ad tag"}},"required":["TagID"]},
onetag={"$schema":"http://json-schema.org/draft-04/schema#","title":"Onetag Adapter Params","description":"A schema which validates params accepted by the Onetag adapter","type":"object","properties":{"pubId":{"type":"string","minLength":1,"description":"The publisherโ–’s ID provided by OneTag"},"ext":{"type":"object","description":"A set of custom key-value pairs"}},"required":["pubId"]},
brightroll={"$schema":"http://json-schema.org/draft-04/schema#","title":"Brightroll Adapter Params","description":"A schema which validates params accepted by the Brightroll adapter","type":"object","properties":{"publisher":{"type":"string","description":"Publisher Name to use."}},"required":["publisher"]},
admixer={"$schema":"http://json-schema.org/draft-04/schema#","title":"Admixer Adapter Params","description":"A schema which validates params accepted by the Admixer adapter","type":"object","properties":{"zone":{"type":"string","description":"Zone ID.","pattern":"^([a-fA-F\d\-]{36})$"},"customFloor":{"type":"number","description":"The minimum CPM price in USD.","minimum":0},"customParams":{"type":"object","description":"User-defined targeting key-value pairs."}},"required":["zone"]},
mediafuse={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adtelligent Adapter Params","description":"A schema which validates params accepted by the Adtelligent adapter","type":"object","properties":{"placementId":{"type":"integer","description":"An ID which identifies this placement of the impression"},"siteId":{"type":"integer","description":"An ID which identifies the site selling the impression"},"aid":{"type":"integer","description":"An ID which identifies the channel"},"bidFloor":{"type":"number","description":"BidFloor, US Dollars"}},"required":["aid"]},
beintoo={"$schema":"http://json-schema.org/draft-04/schema#","title":"Beintoo Adapter Params","description":"A schema which validates params accepted by the Beintoo adapter","type":"object","properties":{"tagid":{"type":"string","description":"The id of an inventory target"},"bidfloor":{"type":"string","description":"The minimum price acceptable for a bid"}},"required":["tagid"]},
sovrn={"$schema":"http://json-schema.org/draft-04/schema#","title":"Sovrn Adapter Params","description":"A schema which validates params accepted by the Sovrn adapter","type":"object","properties":{"tagid":{"type":"string","description":"An ID which identifies the sovrn ad tag"},"tagId":{"type":"string","description":"An ID which identifies the sovrn ad tag (DEPRECATED, use "tagid" instead)"},"bidfloor":{"type":"number","description":"The minimum acceptable bid, in CPM, using US Dollars"}},"oneOf":[{"required":["tagid"]},{"required":["tagId"]}]},
nobid={"$schema":"http://json-schema.org/draft-04/schema#","title":"NoBid Adapter Params","description":"A schema which validates params accepted by the NoBid adapter","type":"object","properties":{"siteId":{"type":"integer","description":"A Required ID which identifies the NoBid site. The siteId parameter is provided by your NoBid account manager."},"placementId":{"type":"integer","description":"An optional ID which identifies an adunit in a site. The placementId parameter is provided by your NoBid account manager."}},"required":["siteId"]},
adoppler={"$schema":"http://json-schema.org/draft-04/schema#","title":"Adoppler Adapter Params","description":"A schema which validates params accepted by the Adoppler adapter","type":"object","properties":{"adunit":{"type":"string","description":"AdUnit to bid against to."},"client":{"type":"string","description":"Client name."}},"required":["adunit"]},
epom={"$schema":"http://json-schema.org/draft-04/schema#","title":"Epom Adapter Params","description":"A schema which validates params accepted by the Epom adapter","type":"object","properties":{}},
colossus={"$schema":"http://json-schema.org/draft-04/schema#","title":"Colossus Adapter Params","description":"A schema which validates params accepted by the Colossus adapter","type":"object","properties":{"TagID":{"type":"string","description":"An ID which identifies the colossus ad tag"}},"required":["TagID"]},
yieldone={"$schema":"http://json-schema.org/draft-04/schema#","title":"Yieldone Adapter Params","description":"A schema which validates params accepted by the Yieldone adapter","type":"object","properties":{"placementId":{"type":"string","description":"Internal Yieldone Placement ID"}},"required":["placementId"]},
applogy={"$schema":"http://json-schema.org/draft-04/schema#","title":"Applogy Adapter Params","description":"A schema which validates params accepted by Applogy adapter","type":"object","properties":{"token":{"type":"string","description":"Token"}},"required":["token"]},
jixie={"$schema":"http://json-schema.org/draft-04/schema#","title":"Jixie Adapter Params","description":"A schema which validates params accepted by the Jixie adapter","type":"object","properties":{"unit":{"type":"string","description":"The unit code of an inventory target","minLength":18},"accountid":{"type":"string","description":"The accountid of an inventory target"},"jxprop1":{"type":"string","description":"jxprop1 of an inventory target"},"jxprop2":{"type":"string","description":"jxprop2 of an inventory target"}},"required":["unit"]},
datablocks={"$schema":"http://json-schema.org/draft-04/schema#","title":"Datablocks Adapter Params","description":"A schema which validates params accepted by the Datablocks adapter","type":"object","properties":{"sourceId":{"type":"integer","minimum":1,"description":"Website Source Id"},"host":{"type":"string","description":"Network Host to request from"}},"required":["host","sourceId"]},
connectad={"$schema":"http://json-schema.org/draft-04/schema#","title":"ConnectAd S2S dapter Params","description":"A schema which validates params accepted by the ConnectAd Adapter","type":"object","properties":{"networkId":{"type":"integer","description":"NetworkId"},"siteId":{"type":"integer","description":"SiteId"},"bidfloor":{"type":"number","description":"Requests Floorprice"}},"required":["networkId","siteId"]},
ttx={"$schema":"http://json-schema.org/draft-04/schema#","title":"33Across Adapter Params","description":"A schema which validates params accepted by the 33Across adapter","type":"object","properties":{"productId":{"type":"string","description":"Product type"},"siteId":{"type":"string","description":"Site Id"},"zoneId":{"type":"string","description":"Zone Id"}},"required":["productId","siteId"]}]>
but could not find:
<[rtbhouse={"$schema":"http://json-schema.org/draft-04/schema#","title":"RTB House Adapter Params","description":"A schema which validates params accepted by the RTB House adapter","type":"object","properties":{"publisherId":{"type":"string","description":"The publisherโ–’s ID provided by RTB House"}},"required":["publisherId"]},
onetag={"$schema":"http://json-schema.org/draft-04/schema#","title":"Onetag Adapter Params","description":"A schema which validates params accepted by the Onetag adapter","type":"object","properties":{"pubId":{"type":"string","minLength":1,"description":"The publisherโ–’s ID provided by OneTag"},"ext":{"type":"object","description":"A set of custom key-value pairs"}},"required":["pubId"]}]>

[ERROR] Errors:
[ERROR] SanityTest.run โ–’ IllegalState Failed to load ApplicationContext
[INFO]
[ERROR] Tests run: 3764, Failures: 1, Errors: 1, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 01:14 min
[INFO] Finished at: 2021-06-04T09:24:12-07:00
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project prebid-server: There are test failures.
[ERROR]
[ERROR] Please refer to C:\DEV\GIT\external\prebid-server-java\target\surefire-reports for the individual test results.
[ERROR] Please refer to dump files (if any exist) [date].dump, [date]-jvmRun[N].dump and [date].dumpstream.
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

There is detailed doc for this project ?

First, This is a good project for ad, and is useful for us, I can run project and execute some http request, but I had not exactly understood the doc, so, this is more detailed doc? thanks a lot.

Failing tests on latest build

Getting a lot of errors trying to build the latest version using Java 1.8

[ERROR] Failures: 
[ERROR]   ApplicationTest.auctionShouldRespondWithBidsFromAdform:315 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   ApplicationTest.auctionShouldRespondWithBidsFromAppnexusAlias:258 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   ApplicationTest.auctionShouldRespondWithBidsFromRubiconAndAppnexus:379 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   ApplicationTest.eventHandlerShouldRespondWithJPGTrackingPixel:605 
Expecting:
 <X-Powered-By=Express
Accept-Ranges=bytes
Content-Type=text/html; charset=UTF-8
ETag=W/"794-UB50IUnoMR3/XIi4KYsfcY3KqHk"
Vary=Accept-Encoding
Content-Encoding=gzip
Date=Tue, 16 Apr 2019 22:32:25 GMT
Connection=keep-alive
Transfer-Encoding=chunked>
to contain:
 <[content-type=image/jpeg]>
but could not find:
 <[content-type=image/jpeg]>

[ERROR]   ApplicationTest.infoBidderDetailsShouldReturnMetadataForBidder:592 1 expectation failed.
Response body doesn't match expectation.
Expected: "{\"enabled\":true,\"maintainer\":{\"email\":\"[email protected]\"},\"capabilities\":{\"app\":{\"mediaTypes\":[\"banner\"]},\"site\":{\"mediaTypes\":[\"banner\",\"video\"]}},\"vendors\":[\"activeview\",\"adform\",\"comscore\",\"doubleverify\",\"integralads\",\"moat\",\"sizemek\",\"whiteops\"],\"gdpr\":{\"vendorId\":52,\"enforced\":true}}"
  Actual: <!DOCTYPE html>
<html lang="en">
<head>
  <base href="/">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
  <meta name="theme-color" content="#00C389">
  <link rel="icon" href="./favicon.ico?v=3">
  <link rel="stylesheet" type="text/css" href="./vendor.css" />
  <title>Freestar Dashboard</title>
  <script>
    if (window.navigator && navigator.serviceWorker) {
      navigator.serviceWorker.getRegistrations()
        .then(function(registrations) {
          for(let registration of registrations) {
            registration.unregister();
          }
        });
    }
    window.appEnv = 'prod';
    if (window.location.hostname === 'dev-dashboard.freestar.io') {
      window.appEnv = 'dev';
    } else if (window.location.hostname === 'localhost') {
      window.appEnv = 'local';
    }
  </script>
<link href="/app.js" rel="preload" as="script"></head>

<body>
  <noscript>
    <strong>We're sorry but sample doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->

  <script src="./vendor.js"></script>
  <script>
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    var isLocal = window.location.hostname.indexOf('localhost') > -1;
    ga('create', 'UA-91235006-1', 'auto');
    ga('set', 'forceSSL', isLocal === true ? false : true);
  </script>
  <script>
    var _hsq = window._hsq = window._hsq || [];
    _hsq.push(['setPath', window.location.pathname]);
  </script>
  <script type="text/javascript" id="hs-script-loader" async defer src="https://js.hs-scripts.com/3894644.js"></script>
  <script async src="https://www.google-analytics.com/analytics.js"></script>
<script type="text/javascript" src="/app.js"></script></body>

</html>


[ERROR]   ApplicationTest.optionsRequestShouldRespondWithOriginalPolicyHeaders:549 expected:<"true"> but was:<null>
[ERROR]   ApplicationTest.optoutShouldSetOptOutFlagAndRedirectToOptOutUrl:414 expected:<[301]> but was:<[404]>
[ERROR]   ApplicationTest.statusShouldReturnReadyWithinResponseBodyAndHttp200Ok:395 
Expecting:
  <[200,
    "<!DOCTYPE html>
<html lang="en">
<head>
  <base href="/">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
  <meta name="theme-color" content="#00C389">
  <link rel="icon" href="./favicon.ico?v=3">
  <link rel="stylesheet" type="text/css" href="./vendor.css" />
  <title>Freestar Dashboard</title>
  <script>
    if (window.navigator && navigator.serviceWorker) {
      navigator.serviceWorker.getRegistrations()
        .then(function(registrations) {
          for(let registration of registrations) {
            registration.unregister();
          }
        });
    }
    window.appEnv = 'prod';
    if (window.location.hostname === 'dev-dashboard.freestar.io') {
      window.appEnv = 'dev';
    } else if (window.location.hostname === 'localhost') {
      window.appEnv = 'local';
    }
  </script>
<link href="/app.js" rel="preload" as="script"></head>

<body>
  <noscript>
    <strong>We're sorry but sample doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->

  <script src="./vendor.js"></script>
  <script>
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    var isLocal = window.location.hostname.indexOf('localhost') > -1;
    ga('create', 'UA-91235006-1', 'auto');
    ga('set', 'forceSSL', isLocal === true ? false : true);
  </script>
  <script>
    var _hsq = window._hsq = window._hsq || [];
    _hsq.push(['setPath', window.location.pathname]);
  </script>
  <script type="text/javascript" id="hs-script-loader" async defer src="https://js.hs-scripts.com/3894644.js"></script>
  <script async src="https://www.google-analytics.com/analytics.js"></script>
<script type="text/javascript" src="/app.js"></script></body>

</html>
"]>
to contain only:
  <[200, "ok"]>
elements not found:
  <["ok"]>
and elements not expected:
  <["<!DOCTYPE html>
<html lang="en">
<head>
  <base href="/">
  <meta charset="utf-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=0"/>
  <meta name="theme-color" content="#00C389">
  <link rel="icon" href="./favicon.ico?v=3">
  <link rel="stylesheet" type="text/css" href="./vendor.css" />
  <title>Freestar Dashboard</title>
  <script>
    if (window.navigator && navigator.serviceWorker) {
      navigator.serviceWorker.getRegistrations()
        .then(function(registrations) {
          for(let registration of registrations) {
            registration.unregister();
          }
        });
    }
    window.appEnv = 'prod';
    if (window.location.hostname === 'dev-dashboard.freestar.io') {
      window.appEnv = 'dev';
    } else if (window.location.hostname === 'localhost') {
      window.appEnv = 'local';
    }
  </script>
<link href="/app.js" rel="preload" as="script"></head>

<body>
  <noscript>
    <strong>We're sorry but sample doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
  </noscript>
  <div id="app"></div>
  <!-- built files will be auto injected -->

  <script src="./vendor.js"></script>
  <script>
    window.ga=window.ga||function(){(ga.q=ga.q||[]).push(arguments)};ga.l=+new Date;
    var isLocal = window.location.hostname.indexOf('localhost') > -1;
    ga('create', 'UA-91235006-1', 'auto');
    ga('set', 'forceSSL', isLocal === true ? false : true);
  </script>
  <script>
    var _hsq = window._hsq = window._hsq || [];
    _hsq.push(['setPath', window.location.pathname]);
  </script>
  <script type="text/javascript" id="hs-script-loader" async defer src="https://js.hs-scripts.com/3894644.js"></script>
  <script async src="https://www.google-analytics.com/analytics.js"></script>
<script type="text/javascript" src="/app.js"></script></body>

</html>
"]>
[ERROR]   ConversantTest.auctionShouldRespondWithBidsFromConversant:120 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   FacebookTest.auctionShouldRespondWithBidsFromFacebook:84 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   IxTest.auctionShouldRespondWithBidsFromIx:89 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   LifestreetTest.auctionShouldRespondWithBidsFromLifestreet:89 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   PubmaticTest.auctionShouldRespondWithBidsFromPubmatic:88 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   PulsepointTest.auctionShouldRespondWithBidsFromPulsepoint:84 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR]   SovrnTest.auctionShouldRespondWithBidsFromSovrn:100 expected:<"no-cache, no-store, must-revalidate"> but was:<null>
[ERROR] Errors: 
[ERROR]   AdkernelAdnTest.openrtb2AuctionShouldRespondWithBidsFromAdkerneladn:70 ยป JSON ...
[ERROR]   AdtelligentTest.openrtb2AuctionShouldRespondWithBidsFromAdtelligent:56 ยป JSON ...
[ERROR]   ApplicationTest.ampShouldReturnTargeting:228 ยป JSON Unparsable JSON string: <!...
[ERROR]   ApplicationTest.biddersParamsShouldReturnBidderSchemas:568 ยป JSON Unparsable J...
[ERROR]   ApplicationTest.cookieSyncShouldReturnBidderStatusWithExpectedUsersyncInfo:460 ยป JsonParse
[ERROR]   ApplicationTest.getuidsShouldReturnJsonWithUids:535 ยป JSON Unparsable JSON str...
[ERROR]   ApplicationTest.infoBiddersShouldReturnRegisteredBidderNames:582 ยป JSON Unpars...
[ERROR]   ApplicationTest.openrtb2AuctionShouldRespondWithBidsFromAdform:126 ยป JSON Unpa...
[ERROR]   ApplicationTest.openrtb2AuctionShouldRespondWithBidsFromRubiconAndAppnexus:186 ยป JSON
[ERROR]   ApplicationTest.setuidShouldUpdateRubiconUidInUidCookie:507 NullPointer
[ERROR]   ApplicationTest.shouldAskExchangeWithUpdatedSettingsFromCache:644 ยป JSON Unpar...
[ERROR]   BeachfrontTest.openrtb2AuctionShouldRespondWithBidsFromBeachfront:58 ยป JSON Un...
[ERROR]   BrightrollTest.openrtb2AuctionShouldRespondWithBidsFromBrightroll:62 ยป JSON Un...
[ERROR]   ConsumableTest.openrtb2AuctionShouldRespondWithBidsFromConsumable:69 ยป JSON Un...
[ERROR]   ConversantTest.openrtb2AuctionShouldRespondWithBidsFromConversant:57 ยป JSON Un...
[ERROR]   ConversantTest.openrtb2AuctionShouldRespondWithBidsFromConversantAlias:91 ยป JSON
[ERROR]   EplanningTest.openrtb2AuctionShouldRespondWithBidsFromEplanning:65 ยป JSON Unpa...
[ERROR]   FacebookTest.openrtb2AuctionShouldRespondWithBidsFromFacebook:55 ยป JSON Unpars...
[ERROR]   GamoshiTest.openrtb2AuctionShouldRespondWithBidsFromGamoshi:61 ยป JSON Unparsab...
[ERROR]   GridTest.openrtb2AuctionShouldRespondWithBidsFromTheMediaGrid:52 ยป JSON Unpars...
[ERROR]   GungumTest.openrtb2AuctionShouldRespondWithBidsFromGumGum:52 ยป JSON Unparsable...
[ERROR]   IxTest.openrtb2AuctionShouldRespondWithBidsFromIx:60 ยป JSON Unparsable JSON st...
[ERROR]   LifestreetTest.openrtb2AuctionShouldRespondWithBidsFromLifestreet:60 ยป JSON Un...
[ERROR]   OpenxTest.openrtb2AuctionShouldRespondWithBidsFromOpenx:64 ยป JSON Unparsable J...
[ERROR]   PubmaticTest.openrtb2AuctionShouldRespondWithBidsFromPubmatic:59 ยป JSON Unpars...
[ERROR]   PulsepointTest.openrtb2AuctionShouldRespondWithBidsFromPulsepoint:55 ยป JSON Un...
[ERROR]   RhythmoneTest.openrtb2AuctionShouldRespondWithBidsFromRhythmone:55 ยป JSON Unpa...
[ERROR]   SomoaudienceTest.openrtb2AuctionShouldRespondWithBidsFromSomoaudience:94 ยป JSON
[ERROR]   SonobiTest.openrtb2AuctionShouldRespondWithBidsFromSonobi:57 ยป JSON Unparsable...
[ERROR]   SovrnTest.openrtb2AuctionShouldRespondWithBidsFromSovrn:64 ยป JSON Unparsable J...
[ERROR]   TtxTest.openrtb2AuctionShouldRespondWithBidsFrom33Across:52 ยป JSON Unparsable ...
[ERROR]   YieldmoTest.openrtb2AuctionShouldRespondWithBidsFromYieldmo:52 ยป JSON Unparsab...
[INFO] 
[ERROR] Tests run: 1847, Failures: 15, Errors: 32, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 38.177 s
[INFO] Finished at: 2019-04-16T15:32:31-07:00
[INFO] Final Memory: 35M/633M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project prebid-server: There are test failures.
[ERROR] 

Edit: It looks like I am only getting these errors locally, not in our CI/CD. I am thinking maybe my laptop can't handle the parallelization?

Rubicon-adapter: Integration questions

Hi,

Can you point me to the right documentation or the person to answer a question regarding rubicon adapter integration?

We got the following config for s2s adapter at client side

pbjsConfig.s2sConfig = {
    accountId: '1',
    bidders: ["rubicon"],
    enabled: true,
    timeout: Settings.prebidBidderTimeoutMS,
    adapter: 'prebidServer',
    endpoint: 'https://pbs.xxxxxxxx.com:8080/openrtb2/auction',
    cookieSet: false
};

The server forwards it correctly, but receives a http 400 from rubicon. I guess we need syncEndpoint or cookieSetUrl specified as well. What is the correct value for that?

Secondly, we get some errors back from Rubicon. Is this the right place to discuss that or should we go through the account manager route?

Cookie sync 500 response when bidder is not enabled

Expected behaviour

Cookie sync should work even when a bidder is part of the s2sConfig.bidders that is not yet active on prebid server.

Actual behaviour

/cookie_sync returns a 500.

Unexpected setuid processing error: null

Steps to reproduce

  1. On the prebid server deactive one of them
adapters:
  appnexus:
    enabled: true
  rubicon:
    enabled: false
  1. Fire a cookie sync request, e.g. http://localhost:8000/cookie_sync with this json body
{"uuid":"8675c874-ec89-4bff-8d2d-4b23b530680e","bidders":["appnexus","rubicon"],"account":"1","gdpr":1,"gdpr_consent":"CPBHEa4PBHEa4AGABCENBLCgAP_AAH_AAAYgHBtf_X9fb2_j-_5999t0eY1f9_63v-wzjgeNs-8NyZ_X_L4Xt2MyvB34pq4KmR4Eu3LBAQdlHGHcTQmQwIkVqTLsak2Mr7NKJ7JEilMbe2dYGH9vn8XT_ZKY70_____7_3-_____77YAAIAAAAAAAAAAgZeAQYAAoAAAIIAAgQKEQgAAhDEgAAAACKEQCASQAJFAAMrgIpAAIAEBiAhAgBACChBgEAAgAASQBACAFAgEABEAgABAAIAQAAIAAQWAEgIAAAIASEABEAEIEBBEABByGBARAEEAKACAqMgKgAUABUAEMAJgAXABHADLAGpAPsA_ACMAEcAKWAVsA3gCYgE2ALRAWwAwIBh4DIhEBsAFQAVgAuACGAGQAMsAagA2QB-AEAAIwAUsAp4BrAD5AIbAQ6Ai8BIgCbAE7AKRAXIAwIBhIDDwGTiQAIADhAAEBdASCOAAgABcAFAAVAAyABwADwAIAARAAqABhADQANQAeQBDAEUAJkAVQBWACwAFwAN4AcwA9ACGgEQARIAlgBNAClAGGAMgAZcA1ADVAGyAO8AewA-IB9gH6AQAAjABHAClgFPAL8AYoA1gBtADcAG8APQAfIBDYCHQEVAIvASIAmIBMoCbAE7AKHAUiAsUBbAC5AF3gMCAYMAwkBhoDDwGRAMkAZOAy4KABAGEEABgDNAXkAyMNAfABUAFYALgAhgBkADLAGoANkAfgBAACCgEYAKWAU-AtAC0gGsAN4AfIBDYCHQEXgJEATYAnYBSIC5AGBAMJAYeAxgBk4cACAA4MABAXQKgLgAUABUAEMAJgAXABHADLAGoAPwAjABHAClwFoAWkA3gCQQExAJsAU2AtgBcgDAgGHgMiHQUQAFwAUABUADIAHAAQAAiABVADAAMYAaABqADwAH0AQwBFACZAFUAVgAsABcADEAGYAN4AcwA9ACGAEQAJYATAAmgBRgClAFiAMMAZAAygBogDUAGyAN8Ad4A9oB9gH6ARYAjABHACUgFPALFAWgBaQC5gF5AL8AYoA2gBuIDpgOoAegBDYCHQERAIvASCAkQBNgCdgFDgKaAVYAsWBbAFsgLgAXIAu0Bd4DCQGGgMPAYkAxgBjwDJAGTgMqAZcPAAgIqHABwAHAAXAGaARkAuoB8gEyEIFwACwAKAAZABEACoAGIAQwAmABVAC4AGIAMwAbwA9ACOAFiAMoAagA3wB3wD7APwAjABHACUgFDAKfAWgBaQC_AGKANoAdQA9ACQQEiAJsAU0AsUBaMC2ALaAXAAuQBdoDDwGJAMiAZOQAAgEZJQKgAEAALAAoABkADgAIoAYABiADwAIgATAAqgBcADEAGYANoAhoBEAESAKMAUoAwgBlADVAGyAO8AfgBGACOAFPgLQAtIBigDcAHUAQ6Ai8BIgCbAFigLYAXaAw8BkQDJyYAEBFRIAGABcAjIBPikD0ABcAFAAVAAyABwAEAAIgAVQAwADGAGgAagA8gCGAIoATAApABVACwAFwAMQAZgA5gCGAEQAKMAUoAsQBlADRAGqANkAd8A-wD9AIsARgAjgBKQChgFbALmAXkA2gBuAD0AIdAReAkQBNgCdgFDgKaAVsAsUBbAC4AFyALtAYaAw8BjADIgGSAMnAZcUABAAXAJEAA.YAAAAAAAAAAA"}

If you want to replicate this with a prebid.js distribution you need to add bidder to the s2sConfig that is not active in prebid.js

s2sConfig: {
  bidders: [ appnexusAst, rubicon ]
}

Research

The NPE appears here:

.filter(publisherRestriction -> publisherRestriction.getVendorIds().contains(vendorId))

as the vendorId is null and the com.iabtcf.utils.IntIterable#contains method takes an int, not and Integer.

The vendorId is null as the bidder is not marked as active here.

private Integer resolveAliasVendorIdViaCatalog(String alias) {
final String bidderName = resolveBidder(alias);
return bidderCatalog.isActive(bidderName) ? bidderCatalog.vendorIdByName(bidderName) : null;

Suggestion

If the vendorId is null the restriction type is NOT_ALLOWED as the bidder is marked inactive and thus shouldn't be allowed to drop cookies. WDYT?

Unit test bug related to GDPR=false

So, when I try to run maven package with GDPR set to false, I am getting unit test failure(s). Is this expected unit test behavior?

[ERROR] Failures: [ERROR] ApplicationTest.cookieSyncShouldReturnBidderStatusWithExpectedUsersyncInfo:362 Expecting: <[BidderUsersyncStatus(bidder=adform, error=null, noCookie=true, usersync=UsersyncInfo(url=//adform-usersynchttp%3A%2F%2Flocalhost%3A8000%2Fsetuid%3Fbidder%3Dadform%26gdpr%3D1%26gdpr_consent%3DBO4C5JrO4C5JrAAAAAktBPoAAAAGRAAAAAgAAIAAAAAAAAA%26us_privacy%3D1YNN%26uid%3D%24UID, type=redirect, supportCORS=false)), BidderUsersyncStatus(bidder=appnexus, error=null, noCookie=true, usersync=UsersyncInfo(url=//usersync-url/getuid?http%3A%2F%2Flocalhost%3A8000%2Fsetuid%3Fbidder%3Dadnxs%26gdpr%3D1%26gdpr_consent%3DBO4C5JrO4C5JrAAAAAktBPoAAAAGRAAAAAgAAIAAAAAAAAA%26us_privacy%3D1YNN%26uid%3D%24UID, type=redirect, supportCORS=false)), BidderUsersyncStatus(bidder=rubicon, error=null, noCookie=true, usersync=UsersyncInfo(url=http://localhost:8000/setuid?bidder=rubicon&gdpr=1&gdpr_consent=BO4C5JrO4C5JrAAAAAktBPoAAAAGRAAAAAgAAIAAAAAAAAA&us_privacy=1YNN&uid=host-cookie-uid, type=redirect, supportCORS=false))]> to contain only: <[BidderUsersyncStatus(bidder=rubicon, error=null, noCookie=true, usersync=UsersyncInfo(url=http://localhost:8000/setuid?bidder=rubicon&gdpr=1&gdpr_consent=BO4C5JrO4C5JrAAAAAktBPoAAAAGRAAAAAgAAIAAAAAAAAA&us_privacy=1YNN&uid=host-cookie-uid, type=redirect, supportCORS=false)), BidderUsersyncStatus(bidder=appnexus, error=null, noCookie=true, usersync=UsersyncInfo(url=//usersync-url/getuid?http%3A%2F%2Flocalhost%3A8000%2Fsetuid%3Fbidder%3Dadnxs%26gdpr%3D1%26gdpr_consent%3DBO4C5JrO4C5JrAAAAAktBPoAAAAGRAAAAAgAAIAAAAAAAAA%26us_privacy%3D1YNN%26uid%3D%24UID, type=redirect, supportCORS=false)), BidderUsersyncStatus(bidder=adform, error=Rejected by TCF, noCookie=null, usersync=null)]> elements not found: <[BidderUsersyncStatus(bidder=adform, error=Rejected by TCF, noCookie=null, usersync=null)]> and elements not expected: <[BidderUsersyncStatus(bidder=adform, error=null, noCookie=true, usersync=UsersyncInfo(url=//adform-usersynchttp%3A%2F%2Flocalhost%3A8000%2Fsetuid%3Fbidder%3Dadform%26gdpr%3D1%26gdpr_consent%3DBO4C5JrO4C5JrAAAAAktBPoAAAAGRAAAAAgAAIAAAAAAAAA%26us_privacy%3D1YNN%26uid%3D%24UID, type=redirect, supportCORS=false))]> [ERROR] Errors: [ERROR] ApplicationTest.openrtb2AuctionShouldRespondWithBidsFromRubiconAndAppnexus:136->IntegrationTest.lambda$openrtbCacheDebugComparator$1:171 ยป Runtime [INFO] [ERROR] Tests run: 2874, Failures: 1, Errors: 1, Skipped: 0 [INFO]

GDPR: make /openrtb2/{auction,amp} endpoints GDPR-aware

  1. Add property for each adapter pdbs-enforces-gdpr, where true value means that pbs server should handle gdpr logic, and false that adapter is aware about gdpr and responsible to handle it, in this case original request without any gdpr changes should be sent to adapter.
  2. If at least one adapter has pbs-enforces-gdpr as true, check gdpr flag and consent string. If gdpr flag has value 0, request without gdpr changes should be sent to adapters. If flag was not defined, try to find it with geolookup, if was not found, set internal-gdpr to gdpr.default-value property.
  3. If gdpr has value 1, parse consent string Check if consent string has purposes 1 and 3. If consent does not contains these purposes, remove buyeruid and mask ip address for adapters with pbs-enforces-gdpr property value True. If purposes are in place, check that adapters vendor id is present in consent vendor list. For adapters, which vendor id is present in list, send request to them without changes, for others remove buyeruid and mask ip address before passing the request.

CurrencyConversionService does not fetch external "exchange" data

CurrencyConversionService's method populatesLatestCurrencyRates does not actually fire the request, the end() is missing, and thus latestCurrencyRates is always null

private void populatesLatestCurrencyRates() {
        httpClient.getAbs(currencyServerUrl, this::handleResponse)
                .exceptionHandler(CurrencyConversionService::handleException);
    }

Add a flag to configure whether AMP cache will be populated with winning bids only

In order to decide what bids have to be cached or not, a nice to have feature could be a flag to store only winning bids. This was an existing behaviour in the past and we think it could be interesting to recover it.

To activate this feature, we could add auction.cache.only-winning-bids (or similar) as a new execution parameter when launching the JVM. In addition to this, we could also be able to change configuration file properly.

Add influxDb tags

Sometimes influxDb tags can come in handy to split data by region, hostname etc.
I find there is no tagging in current prebid-server-java.
As dropwizard-metrics-influxdb already has tags support, I suggest this simple implementation.

PR: #615

Startup error related to HttpClient changes

Getting an error starting up on my local machine (Mac OS Mojave), starting with commit 46da2b0

It seems to be having an issue initializing the CurrencyConversionService bean. All unit tests are passing.

2018-11-21 08:50:32.626  INFO 14437 --- [           main] s.c.a.AnnotationConfigApplicationContext : Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@32ee6fee: startup date [Wed Nov 21 08:50:32 MST 2018]; root of context hierarchy
2018-11-21 08:50:34.560  INFO 14437 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'springConfiguration' of type [org.prebid.server.spring.config.SpringConfiguration$$EnhancerBySpringCGLIB$$3a3233e5] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-11-21 08:50:34.582  INFO 14437 --- [           main] trationDelegate$BeanPostProcessorChecker : Bean 'conversionService' of type [org.springframework.core.convert.support.DefaultConversionService] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2018-11-21 08:50:38.438  WARN 14437 --- [-thread-checker] io.vertx.core.impl.BlockedThreadChecker  : Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 2431 ms, time limit is 2000
2018-11-21 08:50:39.441  WARN 14437 --- [-thread-checker] io.vertx.core.impl.BlockedThreadChecker  : Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 3435 ms, time limit is 2000
2018-11-21 08:50:40.445  WARN 14437 --- [-thread-checker] io.vertx.core.impl.BlockedThreadChecker  : Thread Thread[vert.x-eventloop-thread-0,5,main] has been blocked for 4439 ms, time limit is 2000
2018-11-21 08:50:41.012  WARN 14437 --- [           main] s.c.a.AnnotationConfigApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webConfiguration.AdminServerConfiguration': Unsatisfied dependency expressed through field 'currencyRatesHandler'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'currencyRatesHandler' defined in class path resource [org/prebid/server/spring/config/WebConfiguration$AdminServerConfiguration.class]: Unsatisfied dependency expressed through method 'currencyRatesHandler' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'currencyConversionRates' defined in class path resource [org/prebid/server/spring/config/ServiceConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.prebid.server.currency.CurrencyConversionService]: Factory method 'currencyConversionRates' threw exception; nested exception is java.lang.RuntimeException: Action has not completed within defined timeout 5000 ms
2018-11-21 08:50:41.211  INFO 14437 --- [           main] utoConfigurationReportLoggingInitializer : 

Error starting ApplicationContext. To display the auto-configuration report re-run your application with 'debug' enabled.
2018-11-21 08:50:41.224 ERROR 14437 --- [           main] o.s.boot.SpringApplication               : Application startup failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'webConfiguration.AdminServerConfiguration': Unsatisfied dependency expressed through field 'currencyRatesHandler'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'currencyRatesHandler' defined in class path resource [org/prebid/server/spring/config/WebConfiguration$AdminServerConfiguration.class]: Unsatisfied dependency expressed through method 'currencyRatesHandler' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'currencyConversionRates' defined in class path resource [org/prebid/server/spring/config/ServiceConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.prebid.server.currency.CurrencyConversionService]: Factory method 'currencyConversionRates' threw exception; nested exception is java.lang.RuntimeException: Action has not completed within defined timeout 5000 ms
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:588)
	at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:366)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1264)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:761)
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:867)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:543)
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:693)
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:360)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:303)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1118)
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1107)
	at org.prebid.server.Application.main(Application.java:11)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
	at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
	at org.springframework.boot.loader.JarLauncher.main(JarLauncher.java:51)
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'currencyRatesHandler' defined in class path resource [org/prebid/server/spring/config/WebConfiguration$AdminServerConfiguration.class]: Unsatisfied dependency expressed through method 'currencyRatesHandler' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'currencyConversionRates' defined in class path resource [org/prebid/server/spring/config/ServiceConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.prebid.server.currency.CurrencyConversionService]: Factory method 'currencyConversionRates' threw exception; nested exception is java.lang.RuntimeException: Action has not completed within defined timeout 5000 ms
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:467)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:585)
	... 26 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'currencyConversionRates' defined in class path resource [org/prebid/server/spring/config/ServiceConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.prebid.server.currency.CurrencyConversionService]: Factory method 'currencyConversionRates' threw exception; nested exception is java.lang.RuntimeException: Action has not completed within defined timeout 5000 ms
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:599)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202)
	at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:208)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1138)
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1066)
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:835)
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:741)
	... 39 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.prebid.server.currency.CurrencyConversionService]: Factory method 'currencyConversionRates' threw exception; nested exception is java.lang.RuntimeException: Action has not completed within defined timeout 5000 ms
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
	... 52 common frames omitted
Caused by: java.lang.RuntimeException: Action has not completed within defined timeout 5000 ms
	at org.prebid.server.vertx.ContextRunner.runOnContext(ContextRunner.java:80)
	at org.prebid.server.vertx.ContextRunner.runOnServiceContext(ContextRunner.java:50)
	at org.prebid.server.spring.config.ServiceConfiguration.currencyConversionRates(ServiceConfiguration.java:322)
	at org.prebid.server.spring.config.ServiceConfiguration$$EnhancerBySpringCGLIB$$81cbb55.CGLIB$currencyConversionRates$1(<generated>)
	at org.prebid.server.spring.config.ServiceConfiguration$$EnhancerBySpringCGLIB$$81cbb55$$FastClassBySpringCGLIB$$e9e88d1e.invoke(<generated>)
	at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
	at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:358)
	at org.prebid.server.spring.config.ServiceConfiguration$$EnhancerBySpringCGLIB$$81cbb55.currencyConversionRates(<generated>)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
	... 53 common frames omitted

If I raise vertx.init-timeout-ms to 20000:

io.vertx.core.VertxException: Thread blocked
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:213)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:372)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1173)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1067)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:513)
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:483)
	at org.springframework.beans.factory.support.AbstractBeanFactory$2.getObject(AbstractBeanFactory.java:345)
	at org.springframework.context.support.SimpleThreadScope.get(SimpleThreadScope.java:72)
	at org.prebid.server.spring.config.VertxContextScope.get(VertxContextScope.java:24)
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:340)
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
	at org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192)
	at com.sun.proxy.$Proxy49.get(Unknown Source)
	at org.prebid.server.currency.CurrencyConversionService.populatesLatestCurrencyRates(CurrencyConversionService.java:76)
	at org.prebid.server.currency.CurrencyConversionService.initialize(CurrencyConversionService.java:59)
	at org.prebid.server.spring.config.ServiceConfiguration.lambda$currencyConversionRates$0(ServiceConfiguration.java:323)
	at org.prebid.server.spring.config.ServiceConfiguration$$Lambda$60/923013679.handle(Unknown Source)
	at org.prebid.server.vertx.ContextRunner.lambda$runOnContext$2(ContextRunner.java:70)
	at org.prebid.server.vertx.ContextRunner$$Lambda$63/280223635.handle(Unknown Source)
	at io.vertx.core.impl.ContextImpl.lambda$wrapTask$2(ContextImpl.java:339)
	at io.vertx.core.impl.ContextImpl$$Lambda$64/3392189.run(Unknown Source)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute$$$capture(AbstractEventExecutor.java:163)
	at io.netty.util.concurrent.AbstractEventExecutor.safeExecute(AbstractEventExecutor.java)
	at io.netty.util.concurrent.SingleThreadEventExecutor.runAllTasks(SingleThreadEventExecutor.java:404)
	at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:463)
	at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:886)
	at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
	at java.lang.Thread.run(Thread.java:748)

Enable compression between PBS and bidders

We have found that Vert.x HttpClient supports compression in responses. We think that we could configure BasicHttpClient to use this feature.

Once activated, we expect a performance improvement between PBS and bidders.

BTW, do you think this feature should be configurable?

Implement geolocation service as a fallback for determining GDPR applicability

  1. Create GeolocationService interface to allow other services to get geo location information based on ip address. Currently only country is required.
  2. Use GeolcationService in /setuid and /openrtb2/* handlers to determine if the call is in GDPR scope or not if it is not specified in request (no "gdpr" parameter) before applying default configured by the host.
  3. Add knobs to turn on of off usage of GeolocationService in
    • /setuid
    • /openrtb2/* endpoints
  4. Make country-to-region mapping configurable

Proposed PBS-Java default account config change

As a follow up prebid/prebid-server#1426, we plan to change the default account configuration syntax.

Having the overall default account config in JSON simplifies mapping it to the Account object since it can be unmarshalled directly from JSON.

Instead of current the YAML format like this:

settings:  
  default-account-config:
    events-enabled: true
    enforce-ccpa: true
    gdpr: '{"enabled": true}'
    analytics-sampling-factor: 1
    default-integration: pbjs
    analytics-config: '{"auction-events":{"amp":true}}'

we'd like to use JSON format for default-account-config section:

settings:  
  default-account-config: >
    {
      "eventsEnabled": true,
      "enforceCcpa": true,
      "gdpr": {
        "enabled": true
      },
      "analyticsSamplingFactor": 1,
      "defaultIntegration": "pbjs"
    }

The PR is #1142

Enhance verification that the host has consent to set cookies in /setuid handler

First iteration of GDPR support for /setuid (#62 ) implies that PBS host has consent to set cookies if consent string allows Purpose 1 and Vendor {id} (where id is configurable by the PBS host company).

This task is to add second verification step - PBS host must declare itself as using Purpose 1 in the Global Vendor List version encoded by the consent string.

Consideration: it might be the case that the version of the GVL encoded in the consent string is "not valid" (couldn't be downloaded from https://vendorlist.consensu.org). We might be interested in tracking such requests so a new metric should be created to count them.

License?

Great project! Could you provide a license file please.

MaxMindGeoLocationService database specified as GeoLite2-City.mmdb while tar file from maxmind contains country file

Not sure whether this is intentional or a bug.
while starting the server, the following error comes up

2019-12-03 16:02:42.182  INFO 92129 --- [ntloop-thread-3] o.p.server.execution.RemoteFileSyncer    : Existing file /var/tmp/prebid/GeoLite2-Country.tar.gz cant be processed by service, try to download after removal
io.vertx.core.impl.NoStackTraceThrowable: Database file GeoLite2-City.mmdb not found in /var/tmp/prebid/GeoLite2-Country.tar.gz archive
ERROR 92129 --- [ntloop-thread-3] o.p.server.execution.RemoteFileSyncer    : Service cant process file /var/tmp/prebid/GeoLite2-Country.tar.gz and still unavailable.

Looking into the issue
MaxMindGeoLocationService has got database specified as GeoLite2-City.mmdb while tar file from maxmind is the country db

  1. https://github.com/rubicon-project/prebid-server-java/blob/0307690bf0b608767857e3813e5b838bedfdf4d3/src/main/java/org/prebid/server/geolocation/MaxMindGeoLocationService.java#L31
  2. https://github.com/rubicon-project/prebid-server-java/blob/30e872b0f1f79de2caa85ecf1929b544adf22671/src/main/resources/application.yaml#L92
prebid> wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz
2019-12-03 16:10:29 (10.1 MB/s) - GeoLite2-Country.tar.gz saved [2031113/2031113]
โžœ  prebid> tar -xvf GeoLite2-Country.tar.gz
x GeoLite2-Country_20191126/
x GeoLite2-Country_20191126/LICENSE.txt
x GeoLite2-Country_20191126/COPYRIGHT.txt
x GeoLite2-Country_20191126/GeoLite2-Country.mmdb

Changing to private static final String DATABASE_FILE_NAME = "GeoLite2-Country.mmdb"; brings up the server without any errors.

Is this intentional?

Allow wider AMP endpoint decoration

In order to customize the key values in the AMP response with more flexibility, the AMP response post processor could receive values stored by the bid response post processor in the request context.

Multisize and stored requests in AMP

In Pubmatic, each ad slot has a fixed size inside its id. For example, "123456@300x600" corresponds to an ad slot of width 300 and height 600.

Our stored requests for AMP contain all the supported bidders in imp[0].ext. For example (only the relevant fragments provided):

{
  "id": "tag_id",
  "imp": [
    {
      "id": "1",
      "banner": {
        "format": [
          {
            "w": 300,
            "h": 600
          },
          {
            "w": 300,
            "h": 250
          },
          {
            "w": 320,
            "h": 50
          }
        ]
      },
      "ext": {
        "rubicon": {
          "placementId": 99999
        },
        "pubmatic": {
          "publisherId": "11111",
          "adSlot": "123456@300x600"
        }
      }
    }
  ]
}

Each AMP page knows which sizes fit in each of its placements, and add the proper ms parameter to each /openrtb2/amp call. For the sake of simplicity, only ms will be mentioned below, but the same applies to sibling parameters like oh, h, etc. For example:

https://.../openrtb2/amp?tag_id=tag_id&ms=300x250,320x50

Upon receiving this call, Prebid Server is retrieving the stored request above, which includes all three formats and the Pubmatic ext because the ApplicationSettings interface does not offer hinting which sizes are being requested. This should not be a problem, because the format values are properly overwritten if the ms parameter is provided.

However, the Pubmatic adapter is using the adslot attribute to generate a bid request like this (only relevant fragment provided):

{
  "id": "tag_id",
  "imp": [
    {
      "id": "1",
      "banner": {
        "format": [
          {
            "w": 300,
            "h": 250
          },
          {
            "w": 320,
            "h": 50
          }
        ],
        "w": 300,
        "h": 600
      },
      "tagId": "123456"
    }
  ]
}

So, the format does contain the suitable values from the ms parameter, but the unsuitable size from the ad slot id. Pubmatic is ignoring the sizes in format and caring only about the banner's width and height, which leads to 300x600 creativities being displayed in positions where only 300x250 or 320x50 are expected.

Should different stored requests be created for slots supporting each set of sizes (ie, one stored request for 300x600, 300x250 and 320x50, another for 300x250 and 320x50, another for 300x600 and 300x250, and so on for all possible combinations)? Leaving aside the scalability concerns, than what would be the purpose of the ms parameter?

Or perhaps Prebid Server should have some kind of control, like for example discarding bid requests provided by adapters if format and w/h do not match?

This following comment by Mike Chowla may be relevant: prebid/Prebid.js#3618 (comment)

New config value added, not documented

A new field was added cache.path which is not documented and does not have a default value in application.yaml, causing failed startups when running off the latest master.

BidderUsersyncStatus never has no_cookie=false

Hi,

The /cookie_sync endpoint always returns no_cookie: true for all bidders. It seems that there's no possible code path that sets this to false, deactivating user syncs.

private BidderUsersyncStatus bidderStatusFor(String bidder,
RoutingContext context,
UidsCookie uidsCookie,
RejectedBidders rejectedBidders,
Privacy privacy) {
final boolean isNotAlias = !bidderCatalog.isAlias(bidder);
final Set<String> biddersRejectedByTcf = rejectedBidders.getRejectedByTcf();
final Set<String> biddersRejectedByCcpa = rejectedBidders.getRejectedByCcpa();
if (isNotAlias && !bidderCatalog.isValidName(bidder)) {
return bidderStatusBuilder(bidder)
.error("Unsupported bidder")
.build();
} else if (isNotAlias && !bidderCatalog.isActive(bidder)) {
return bidderStatusBuilder(bidder)
.error(String.format("%s is not configured properly on this Prebid Server deploy. "
+ "If you believe this should work, contact the company hosting the service "
+ "and tell them to check their configuration.", bidder))
.build();
} else if (isNotAlias && biddersRejectedByTcf.contains(bidder)) {
return bidderStatusBuilder(bidder)
.error(REJECTED_BY_TCF)
.build();
} else if (isNotAlias && biddersRejectedByCcpa.contains(bidder)) {
return bidderStatusBuilder(bidder)
.error(REJECTED_BY_CCPA)
.build();
} else {
final Usersyncer usersyncer = bidderCatalog.usersyncerByName(bidderNameFor(bidder));
if (StringUtils.isEmpty(usersyncer.getUsersyncUrl())) {
// there is nothing to sync
return null;
}
final UsersyncInfo hostBidderUsersyncInfo = hostBidderUsersyncInfo(context, privacy, usersyncer);
if (hostBidderUsersyncInfo != null || !uidsCookie.hasLiveUidFrom(usersyncer.getCookieFamilyName())) {
return bidderStatusBuilder(bidder)
.noCookie(true)
.usersync(ObjectUtils.defaultIfNull(
hostBidderUsersyncInfo,
UsersyncInfoAssembler.from(usersyncer).withPrivacy(privacy).assemble()))
.build();
}
}
return null;
}

Is this a bug or am I missing something very obvious here ๐Ÿ˜‚

Any plans to add a CI integration?

This is more of a feature request :-) . Not sure whether the need for CI was discussed before in the community. Couldn't find a corresponding issue-ticket and hence raising this.

I was having a look at the prebid-server-java recently. Appreciate the good work that you all are doing and the efforts taken to open source it to the community. While having a play around, two things which I thought could be beneficial for the project.

  1. Need for a CI
  2. Need to have a discussion list or similar documentation

The reason why I would stress for a CI is that the tests on master branch were broken for few days which could have picked up on a CI quicker. In this instance the culprit was a non-UTC date in one of the tests. Saw the usages of new Date() in the code which should be ideally avoided since we have java.time packages from java8 and there are fixed clocks which could be used for tests.

The reason for a discussion list or similar is to improve the knowledge/feedback on bidders/ adapters when someone is facing an issue. Maybe adding extra documentation would also help.

If there is an appetite for these then I could take a look and maybe talk to free services for open source. (for example https://circleci.com/open-source/). If there are already services in place satisfying these requirements then please point me in that direction.

Unify criteria when creating BidderSeatBid object whether is built by HttpBidderRequester or HttpAdapterRequester

While testing/debuging I came across a difference between how HttpBidderRequester and HttpAdapterRequester create BidderSeatBid objects.
The former creates it in its method toBidderSeatBid (using errors method) and aside from BidderBid's errors it ALSO takes into account HttpCall s errors, while the later (HttpAdapterRequester) in its method toBidderSeatBid only takes into account BidderBid's errors, and not AdapterResponse's BidderStatus/timedOut info

Actually I am not sure if this could be considered a bug or not, but I think that this difference worth creating an issue

Allow following HTTP redirections

org.prebid.server.vertx.http.BasicHttpClient is not following redirections (HTTP status code 30x). This behaviour is probably fine in the general scenario, but some SSPs (eg, eplanning) sometimes do return redirections when bidding.

Therefore, the ability to enable them should be configurable.

Set E-Plannning's vendor id

E-Planning's adapter has 0 as its vendor's id, while it should be 90 (Teroa S.A.).

Additionally:

  • When there aren't active campaigns, responses contain null lists that have to be gently handled.
  • If a parameter ct=1 is not present in the adapter's request, a redirection to a URL with the missing parameter happens.
  • When an ad units lacks name in the bid request, the request is properly generated but the bid extraction fails.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.