> ## Documentation Index
> Fetch the complete documentation index at: https://docs.thrads.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Overview

> OpenRTB 2.6 integration with Thrad SSP.

## Integration

Thrad SSP supports OpenRTB 2.6 with Native 1.2.

Expose one HTTPS bid endpoint. The SSP calls it with a standard BidRequest on every auction. Respond with a BidResponse — or 204 for no-bid. Win/loss/billing outcomes are communicated via `nurl`, `lurl`, and `burl` you supply in the response.

Authentication is Bearer token. Full request/response specs in the [Bid API reference](/dsp/api-reference/ortb-bid).

## End-to-end flow

```mermaid theme={null}
sequenceDiagram
  autonumber
  participant P as Publisher
  participant S as Thrad SSP
  participant D as Your DSP

  P->>S: POST /ssp/bid-request
  Note over S: Translate → OpenRTB 2.6 BidRequest
  S->>D: POST /openrtb/bid
  alt bid
    D-->>S: 200 BidResponse (price, adm, nurl, lurl, burl)
  else no bid
    D-->>S: 204
  end
  Note over S: First-price auction

  alt win
    S-)D: GET nurl (${AUCTION_PRICE})
    S->>P: Deliver creative from adm
    P-->>S: Impression confirmed
    S-)D: GET burl
  else loss
    S-)D: GET lurl (${AUCTION_LOSS})
  end
```

* `nurl` fires on win, after the winning creative is committed for render. Does not confirm impression.
* `burl` fires on impression confirmation. Use this for spend recognition.
* `lurl` fires on loss with reason code. Does not block winner path. Fires for **both** cross-DSP losers and in-response losers — see [Multi-bid responses](#multi-bid-responses) below.

## First-Price Auction

The SSP runs a first-price auction across all DSP responses:

* Highest bid wins
* Winner pays their own bid amount (first-price)
* Bids below the floor price are rejected
* In case of a tie (multiple DSPs bid the same amount), the winner is picked randomly

## Multi-bid responses

You may return multiple `seatbid` entries and multiple `bid[]` per seatbid in a single BidResponse — useful when your DSP fronts several buyers or evaluates several creatives per opportunity.

The SSP handles multi-bid responses in two stages:

1. **In-response pick.** Across every bid in your response, the SSP selects the **highest-priced bid** as your DSP's representative for the cross-DSP auction. Ties are broken by first-encountered (stable). Bids with `bid.cur` set to anything other than `"USD"` or with no `price` are dropped before this step.
2. **Cross-DSP auction.** All representatives — one per DSP — are entered into a first-price auction. Highest price wins.

### Loss notifications across both stages

Every bid that does not become the final auction winner receives an `lurl` GET (when set on the bid) with reason code `102` ("lost to higher bid"):

| Loser type            | When it happens                                                                                                     | `lurl` fired?                                                                                                                                           |
| --------------------- | ------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **Cross-DSP loser**   | Your representative bid lost to another DSP's representative                                                        | Yes, reason `102`                                                                                                                                       |
| **In-response loser** | A non-winning bid in your own response — you sent multiple bids; only the highest-priced became your representative | Yes, reason `102` — fires for **every** in-response losing bid that has `lurl` set, regardless of whether your representative won the cross-DSP auction |

This means even when your DSP wins the overall auction, the *other* bids you submitted in the same response still get a loss notice — they lost inside your own seatbid pick. This lets pacing/learning systems treat every submitted bid uniformly.

**Today only `102` is fired.** Other rejection paths — below-floor (`100`), invalid bid response (`3`), invalid `adm` (`7`) — currently drop the bid silently without notifying your endpoint. Wiring those rejections to fire `lurl` with the appropriate reason code is on the v2 roadmap. Your endpoint should be ready to receive any spec-defined code, but in practice you'll see only `102` until v2 ships. See the [Bid API reference](/dsp/api-reference/ortb-bid#notifications) for the full code table.

### Buyer seat (`seatbid[].seat`)

If your DSP fronts multiple buyers (agencies, advertisers, trading desks), populate `seatbid[].seat` with the buyer id. The winning bid's seat is recorded in Thrad analytics and surfaced per impression — useful for slicing revenue and quality metrics by buyer rather than only by DSP. If you have no seat concept, omit it or send empty.

## Pricing & Commission

### Bid Rounding

Bids should be specified with **2 decimal places** (e.g., `7.50`, `12.34`). If you submit a bid with more than 2 decimals, the SSP will automatically round it using **`ROUND_HALF_UP`** — the standard "round half away from zero" rule:

* `7.125` → `7.13`
* `7.135` → `7.14`
* `7.145` → `7.15`

Bid values below the 2nd decimal that are not exactly `.5` round normally (`7.124` → `7.12`, `7.126` → `7.13`).

### SSP Commission

**Commission Rate**: 10% of your bid

* The SSP takes a 10% commission directly from your bid
* Your actual payout is **bid amount × 0.90**
* Commission is deducted before payment reaches the advertiser
* The floor price check is on the **gross bid** (before commission)

**Example**:

* You bid: \$10.00 CPM
* SSP commission (10%): \$1.00
* Net to advertiser: \$9.00 CPM

## Timeouts

Your endpoint must respond within strict time limits:

| Endpoint | Timeout   | Recommended Target |
| -------- | --------- | ------------------ |
| **Bid**  | 2 seconds | \< 1s              |

## Payment and Billing

At the end of each calendar month, Thrad will send you an invoice for the amount due based on your winning bids.

### How It Works

1. **Monthly Calculation**: We calculate your total winning bid amount for the calendar month
2. **Commission Deduction**: The 10% SSP commission is deducted from your gross bids
3. **Invoice**: You receive an invoice with the net amount due to the publisher
4. **Payment**: Payment terms will be agreed upon during integration setup

**Example**:

* Total winning bids for the month: \$10,000
* SSP commission (10%): -\$1,000
* **Net amount due to publisher**: \$9,000

<Note>
  The invoice will include detailed reporting of all winning auctions, impressions, and any applicable adjustments.
</Note>
