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

# Demand Mediation

> Integrate external demand sources like Criteo into Topsort auctions to increase fill rates and ad revenue

export const ChangelogActions = () => {
  return <>
      <style>{`
        .changelog-actions {
          display: flex;
          justify-content: center;
          gap: 12px;
          margin-top: 2rem;
          padding-top: 1.5rem;
          border-top: 1px solid #e5e7eb;
        }
        
        [data-theme="dark"] .changelog-actions {
          border-top-color: #374151;
        }
        
        .changelog-btn {
          display: inline-flex;
          align-items: center;
          gap: 6px;
          padding: 8px 16px;
          border-radius: 9999px;
          border: 1px solid #d1d5db;
          background: transparent;
          color: #6b7280;
          font-size: 14px;
          cursor: pointer;
          transition: all 0.2s ease;
        }
        
        .changelog-btn:hover {
          border-color: #9ca3af;
          background: #f9fafb;
        }
        
        [data-theme="dark"] .changelog-btn {
          border-color: #4b5563;
          color: #9ca3af;
        }
        
        [data-theme="dark"] .changelog-btn:hover {
          border-color: #6b7280;
          background: #1f2937;
        }
      `}</style>
      <div className="changelog-actions">
        <button className="changelog-btn" onClick={() => {
    const btn = event.target.closest("button");
    btn.innerHTML = "❤️ Like";
    btn.style.borderColor = "#ec4899";
  }}>
          🤍 Like
        </button>
        <button className="changelog-btn" onClick={() => {
    const btn = event.target.closest("button");
    navigator.clipboard.writeText(window.location.href);
    const originalContent = btn.innerHTML;
    btn.innerHTML = "✓ Copied";
    btn.style.borderColor = "#22c55e";
    btn.style.color = "#22c55e";
    setTimeout(() => {
      btn.innerHTML = originalContent;
      btn.style.borderColor = "";
      btn.style.color = "";
    }, 2000);
  }}>
          ↗ Share
        </button>
      </div>
    </>;
};

<div className="cl-badge-group">
  <Badge color="gray" size="sm" icon="calendar">
    February 20, 2026
  </Badge>

  <Badge color="blue" size="sm" icon="server">
    Ad Server
  </Badge>

  <Badge color="green" size="sm" icon="sparkles">
    New Feature
  </Badge>
</div>

<div className="cl-mockup-wrapper">
  <div className="cl-mockup-card" style={{ maxWidth: "620px", background: "linear-gradient(135deg, #F9FAFB 0%, #F0F0FF 50%, #F5F0FF 100%)", padding: "32px 24px" }}>
    <div style={{ textAlign: "center", fontSize: "11px", fontWeight: "700", letterSpacing: "2px", color: "#6B7280", marginBottom: "24px" }}>
      UNIFIED AUCTION FLOW
    </div>

    <div style={{ display: "flex", alignItems: "stretch", gap: "0px", marginBottom: "8px" }}>
      <div style={{ flex: 1 }}>
        <div style={{ fontSize: "10px", fontWeight: "700", letterSpacing: "1.5px", color: "#6B7280", marginBottom: "10px" }}>YOUR SELLERS</div>

        <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
          {[
                              { name: "Brand A", bid: "$1.20" },
                              { name: "Brand B", bid: "$0.85" },
                              { name: "Brand C", bid: "$0.60" }
                            ].map((item, i) => (
                              <div key={i} style={{
                                display: "flex",
                                justifyContent: "space-between",
                                alignItems: "center",
                                padding: "10px 14px",
                                background: "#F0FDF4",
                                border: "1px solid #BBF7D0",
                                borderRadius: "8px"
                              }}>
                                <span style={{ fontSize: "12px", fontWeight: "500", color: "#374151" }}>{item.name}</span>
                                <span style={{ fontSize: "13px", fontWeight: "700", color: "#15803D" }}>{item.bid}</span>
                              </div>
                            ))}
        </div>
      </div>

      <div style={{ display: "flex", alignItems: "center", flex: "0 0 auto", padding: "20px 4px 0" }}>
        <div style={{ display: "flex", alignItems: "center" }}>
          <div style={{ width: "20px", height: "0px", borderTop: "2px dashed #B0B0B0" }} />

          <span style={{ color: "#9CA3AF", fontSize: "11px", lineHeight: 1 }}>▶</span>
        </div>
      </div>

      <div style={{ display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", flex: "0 0 auto", padding: "20px 0 0" }}>
        <div
          style={{
      padding: "16px 14px",
      background: "white",
      border: "1px solid #E5E7EB",
      borderRadius: "10px",
      textAlign: "center",
      boxShadow: "0 1px 3px rgba(0,0,0,0.06)"
    }}
        >
          <div style={{ fontSize: "10px", fontWeight: "800", color: "#1D1D1F", lineHeight: "1.3" }}>TOPSORT</div>
          <div style={{ fontSize: "10px", fontWeight: "800", color: "#1D1D1F", lineHeight: "1.3" }}>AUCTION</div>
        </div>

        <div style={{ fontSize: "9px", fontWeight: "600", letterSpacing: "1px", color: "#9CA3AF", marginTop: "6px" }}>UNIFIED POOL</div>
      </div>

      <div style={{ display: "flex", alignItems: "center", flex: "0 0 auto", padding: "20px 4px 0" }}>
        <div style={{ display: "flex", alignItems: "center" }}>
          <span style={{ color: "#9CA3AF", fontSize: "11px", lineHeight: 1 }}>◀</span>

          <div style={{ width: "20px", height: "0px", borderTop: "2px dashed #B0B0B0" }} />
        </div>
      </div>

      <div style={{ flex: 1 }}>
        <div style={{ fontSize: "10px", fontWeight: "700", letterSpacing: "1.5px", color: "#6B7280", marginBottom: "10px", textAlign: "right" }}>CRITEO</div>

        <div style={{ display: "flex", flexDirection: "column", gap: "8px" }}>
          {[
                              { name: "Global A", bid: "$1.55" },
                              { name: "Global B", bid: "$1.10" },
                              { name: "Global C", bid: "$0.70" }
                            ].map((item, i) => (
                              <div key={i} style={{
                                display: "flex",
                                justifyContent: "space-between",
                                alignItems: "center",
                                padding: "10px 14px",
                                background: "#F5F3FF",
                                border: "1px solid #DDD6FE",
                                borderRadius: "8px"
                              }}>
                                <span style={{ fontSize: "12px", fontWeight: "500", color: "#374151" }}>{item.name}</span>
                                <span style={{ fontSize: "13px", fontWeight: "700", color: "#4338CA" }}>{item.bid}</span>
                              </div>
                            ))}
        </div>
      </div>
    </div>

    <div style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: "8px", marginTop: "4px" }}>
      <div style={{ height: "20px", width: "0px", borderLeft: "2px dashed #B0B0B0" }} />

      <span style={{ color: "#9CA3AF", fontSize: "11px", lineHeight: 1 }}>▼</span>
      <div style={{ fontSize: "11px", fontWeight: "700", letterSpacing: "1.5px", color: "#6B7280" }}>HIGHEST BID WINS</div>

      <div
        style={{
    display: "flex",
    justifyContent: "space-between",
    alignItems: "center",
    padding: "12px 20px",
    background: "white",
    border: "2px solid #22C55E",
    borderRadius: "10px",
    minWidth: "180px",
    gap: "16px"
  }}
      >
        <span style={{ fontSize: "14px", fontWeight: "600", color: "#374151" }}>Global A</span>
        <span style={{ fontSize: "15px", fontWeight: "800", color: "#15803D" }}>\$1.55</span>
      </div>
    </div>
  </div>
</div>

<Note>
  **Why We Built This**

  Marketplaces shouldn't have to choose between demand sources. Demand mediation lets third-party bids compete directly against Topsort demand in a unified auction — more competition means higher fill rates and more revenue per impression.
</Note>

## The Problem

Topsort auctions previously only accepted bids from Topsort sources — vendors within a marketplace or via Toppie. If no Topsort demand existed for a placement, that ad slot went unfilled. Marketplaces with existing relationships with platforms like Criteo had no way to bring that demand into the same auction.

## The Solution

Demand mediation extends the auctions API to accept bids from external demand sources. The marketplace fetches bids from a third-party platform and passes them into the Topsort auction via a new `demandSources` parameter. Topsort compares all bids — internal and external — and the highest bid wins.

**Unified auction.** Topsort and third-party bids compete in the same auction. No separate waterfall logic needed.

**Higher fill rates.** When Topsort demand is low, external bids can fill the gap.

**More revenue.** When both sources have demand, competition drives bids up.

**Criteo first.** The first integrated source is Criteo, with support for additional demand sources via the same `demandSources` parameter.

## How It Works

<Steps>
  <Step title="Fetch external bids">
    On page load, the marketplace fetches bids from Criteo (or another demand source) for the placement.
  </Step>

  <Step title="Pass bids to Topsort">
    Include the external bids in the auction request using the new `demandSources` field.
  </Step>

  <Step title="Topsort runs the auction">
    All bids compete. The response indicates the winning source — `"topsort"` or `"criteo"` — for each slot.
  </Step>

  <Step title="Report events">
    For external winners, report events to both Topsort and the external platform.
  </Step>
</Steps>

## Who Should Use This

**Large US marketplaces.** Major brands bid on retail media via tools like Pacvue and Skai, which bid on Criteo inventory — this unlocks that spend without direct brand integrations.

**Large LATAM marketplaces.** Criteo has significant presence in Latin America, making this a natural fit.

**Any marketplace with existing Criteo relationships.** If you already have a Criteo account, adding demand mediation is straightforward.

## API Changes

The [auctions endpoint](/en/api-reference/examples/auctions) now accepts a `demandSources` array with external bids (up to 100 per request). The response includes a `demandSource` field on each winner indicating whether it came from Topsort or an external source.

For full implementation details, API examples, and error handling, see the [Demand Mediation](/en/knowledge-base/ad-server/auctions/demand-mediation) documentation.

<div
  style={{
margin: "3rem 0",
height: "3px",
background:
  "linear-gradient(to right, transparent, #00ff88 20%, #00d4ff 40%, #8280ff 60%, #ff6b9d 80%, transparent)",
borderRadius: "2px",
opacity: "0.6",
}}
/>

Available now for eligible marketplaces. Contact your Topsort account manager to enable demand mediation for your account.

<ChangelogActions />
