The two paths
Path A: Pre-rendered (default, recommended)
Include the creative directly in your bid response underad_data. The SSP serves it as-is when you win and never calls your render endpoint for that bid.
Path B: Render endpoint
Return onlybid + bidId in the bid response. If you win the auction, the SSP calls your /render-ad endpoint with the bidId and clearing price; you respond with the creative there.
When to use which
| Situation | Recommended path |
|---|---|
| You have static, pre-built creatives in a catalog | Pre-rendered — fastest path, no reason to defer. |
| Your creative is templated and cheap to produce per-bid | Pre-rendered — render cost is negligible vs the extra round-trip. |
| Your creative requires a per-impression LLM call or expensive generation | Render endpoint — defer the work until you’ve won. |
| You need to know the clearing price before finalising the creative | Render endpoint — realizedPrice is only available on render. |
| You’re under tight latency budget and your creative is ready | Pre-rendered — saves one HTTP hop on every win. |
Strict validation applies to both paths
Whichever path you choose, the SSP validates the creative against the same schema:ad_datain the bid response (Path A)datain the render response (Path B)
extra="forbid") and reject unknown fields. A failed validation drops the bid — no second chance, even if your bid was the highest. See the API Reference for the exact field schemas.
Mixing paths
You can choose per-bid. Some bids can includead_data, others can omit it and rely on /render-ad. The SSP decides per response: if ad_data is present and valid, render is skipped; otherwise it calls /render-ad.
This means you can:
- Default to pre-rendering for cheap creatives.
- Fall back to the render endpoint only for bids that need just-in-time generation.

