PHPackages                             visavi/openrtb - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. visavi/openrtb

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

visavi/openrtb
==============

OpenRTB specification

v1.3.1(4y ago)58.6k5GPL-2.0PHPPHP &gt;=7.2CI failing

Since Oct 22Pushed 2y ago3 watchersCompare

[ Source](https://github.com/visavi/openrtb)[ Packagist](https://packagist.org/packages/visavi/openrtb)[ RSS](/packages/visavi-openrtb/feed)WikiDiscussions master Synced today

READMEChangelog (5)Dependencies (1)Versions (6)Used By (0)

OpenRTB
=======

[](#openrtb)

iab, RTB Project, OpenRTB Specification 2.5

Example
-------

[](#example)

```
$imp = new Imp();
$imp->setId('1');

$video = new Video();
$video->setMimes([
        'video/mp4',
        'application/x-shockwave-flash',
        'application/javascript',
        'video/webm',
        'video/mpg',
    ])
    ->setMinduration(1)
    ->setMaxduration(120)
    ->setProtocols([2, 3, 5, 6, 7, 8])
    ->setW(576)
    ->setH(320)
    ->setLinearity(2)
    ->setSkip(1)
    ->setSkipmin(10)
    ->setSkipafter(10)
    ->setSequence(1)
    ->setMaxextended(-1)
    ->setApi([1,2])
    ->setPlacement(3);

$deals = new Deal();
$deals->setId('id')
    ->setBidfloor(120)
    ->setBidfloorcur('RUB')
    ->setAt(3);

$pmp = new Pmp();
$pmp->setPrivate_auction(0)
    ->addDeals($deals);

$imp->setVideo($video)
    ->setBidfloor(100)
    ->setBidfloorcur('RUB')
    ->setSecure(1)
    ->setPmp($pmp);

$site = new Site();
$site->setId('1234')
    ->setDomain('test.ru')
    ->setCat([
        'IAB0',
        'IAB0-0',
    ])
    ->setPublisher((new Publisher())->setId('test'))
    ->setPage('https://test.ru');

$geo = new Geo();
$geo->setLat(47.2361)
    ->setLon(39.7189)
    ->setType(2)
    ->setCountry('RUS')
    ->setRegion('RU-ROS')
    ->setCity('Rostov-on-Don')
    ->setZip('344000');

$device = new Device();
$device->setUa('Mozilla/5.0 (Windows NT 6.2; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0')
    ->setGeo($geo)
    ->setIp('127.0.0.1')
    ->setDevicetype(2)
    ->setMake('unknown')
    ->setModel('unknown')
    ->setOs('Windows')
    ->setLanguage('ru');

$user = new User();
$user->setId('test1')
    ->setBuyeruid('xxxxxxxxx');

$bidRequest = new BidRequest();
$bidRequest
    ->setId('test-3')
    ->addImp($imp)
    ->setSite($site)
    ->setDevice($device)
    ->setUser($user)
    ->setAt(2)
    ->setTmax(300)
    ->setCur(['RUB']);

$request = $bidRequest->getBidRequest();
```

#### Response

[](#response)

```
$object = new BidResponse();

foreach ($responses as $response) {
    /** @var BidResponse $result */
    $result = Hydrator::hydrate(json_decode($response, true), $object);

    /** @var Seatbid $bid */
    $seatBid = $result->getSeatbid()->first();

    /** @var Bid $bid */
    $bid = $seatBid->getBid()->first();

    $nurls[] = $bid->getNurl();
}

// or
$result = json_decode($response, true);
$nurl = $result['seatbid'][0]['bid'][0]['nurl'] ?? null;
```

### Async request

[](#async-request)

```
$bidders = [
    'segmento' => 'https://bider1',
    'weborama' => 'https://bider2',
    'otm'      => 'https://bider3',
];

$promises = (function () use ($bidders) {
    foreach ($bidders as $service => $bidder) {
        $buyer   = $this->getBuyer($service);
        $request = $this->buildRequest($buyer);

        if (!$request) {
            continue;
        }

        yield $this->client->requestAsync('POST', $bidder, ['body' => $request]);
    }
})();

$responses = [];

if (!$promises) {
    return '';
}

$each = new EachPromise($promises, [
    'concurrency' => 4,
    'fulfilled' => static function (ResponseInterface $response) use (&$responses) {

        $content = (string) $response->getBody();

        if ($content && 200 === $response->getStatusCode()) {
            $responses[] = $content;
        }
    },
]);

$each->promise()->wait();

var_dump($responses);
```

Install
-------

[](#install)

`composer require visavi/openrtb`

###  Health Score

32

—

LowBetter than 69% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity28

Limited adoption so far

Community13

Small or concentrated contributor base

Maturity57

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 90.9% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~158 days

Total

5

Last Release

1814d ago

PHP version history (2 changes)v1.0.0PHP &gt;=7.2

v1.2.0PHP &gt;=7.1

### Community

Maintainers

![](https://avatars.githubusercontent.com/u/826831?v=4)[Alexander Grigorev](/maintainers/visavi)[@visavi](https://github.com/visavi)

---

Top Contributors

[![visavi](https://avatars.githubusercontent.com/u/826831?v=4)](https://github.com/visavi "visavi (10 commits)")[![GlorySunshine](https://avatars.githubusercontent.com/u/28593913?v=4)](https://github.com/GlorySunshine "GlorySunshine (1 commits)")

---

Tags

openrtb

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/visavi-openrtb/health.svg)

```
[![Health](https://phpackages.com/badges/visavi-openrtb/health.svg)](https://phpackages.com/packages/visavi-openrtb)
```

###  Alternatives

[mzur/kirby-uniform

A versatile Kirby plugin to handle web form actions.

26173.5k20](/packages/mzur-kirby-uniform)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
