Troubleshooting — Demand Partners


No bids returned / bid requests not arriving

Check endpoint registration

Your endpoint URL must be saved and active in the dashboard.

Check: Demand → your demand source (DSP) → Settings. Endpoint URL should be set and status should be Active.

Check endpoint reachability

Praevis must be able to reach your endpoint. Test from outside your network:

curl -X POST https://your-bidder.example.com/bid \
  -H "Content-Type: application/json" \
  -d '{"id":"test","imp":[{"id":"1"}]}'

Expect HTTP 200 or 204. If you get a connection error, check firewall rules — Praevis sends from DigitalOcean IP ranges (FRA, NYC, LON).

Check response time

Responses must arrive within 150ms (hard timeout). If your endpoint exceeds this, requests are counted as timeouts and trigger the circuit breaker.

Check latency:

GET /api/demand/sources/{DSP_ID}/health

If avg_latency_ms is near or above 100ms, your endpoint is at risk.

Check pool subscriptions

You only receive bid requests from pools you’re subscribed to.

Check: Demand → your demand source → Pools. Subscribe to at least one pool with active publishers.


Low win rate

Bids below floor price

The most common cause. If price in your bid response is below bidfloor in the request, you lose every auction.

Diagnose: Compare imp.bidfloor in incoming requests against your bid price. Increase bids or target higher-floor pools.

Geographic mismatch

Praevis sends bid requests for all geos your pools serve. If you’re bidding $0.50 on CTV inventory in Dubai where floor is $3.00, you’ll lose every auction despite bidding.

Fix: Use targeting in your bidder to skip geos where your bids can’t compete, or use Delegate with geo conditions to only bid where you’re competitive.

Circuit breaker open

If your timeout rate exceeds the threshold, the circuit breaker opens and pauses all bid requests for 60 seconds, then enters half-open recovery mode.

Check:

GET /api/demand/sources/{DSP_ID}/health

If circuit_breaker is "open", requests are paused. Fix the latency issue and manually reset:

POST /api/demand/sources/{DSP_ID}/reset

Budget exhausted (Guide)

If you’ve set a daily_budget, Guide reduces your QPS as you approach it and stops requests when exhausted.

Check: Dashboard → your demand source → see daily budget remaining. Budget resets at midnight UTC.


Delegate strategy not matching

String vs number type mismatch

The most common Delegate issue. All condition values must be strings.

// <span className="praevis-chk">✓</span> Correct
"hour": ["18", "19", "20"]
"device.devicetype": "3"
 
// ❌ Wrong — will never match
"hour": [18, 19, 20]
"device.devicetype": 3

Condition logic — AND between fields, OR within a field

All fields must match simultaneously. If you add geo.country: "AE" and device.devicetype: "3", both must be true.

Within a field, array values use OR: ["AE", "SA"] matches AE or SA.

Content.genre not present

Genre must be set by the publisher. If the publisher hasn’t set a genre on their inventory, content.genre won’t be in the bid request and genre conditions won’t match.

Check: Ask the publisher to verify their content genre is configured, or add a fallback rule with "conditions": {} to capture untagged inventory.

Strategy not saved / not active

After saving a new strategy, it takes up to 30 seconds to propagate across all regions.

Check: Demand → your demand source → Strategy tab → last saved timestamp.


Circuit breaker — understanding state

StateMeaningAction
closedHealthy — all requests flowingNone needed
openToo many timeouts — requests paused for 60sFix latency, then manual reset or wait
half_openRecovery probe — sending 10% of requestsSucceeds → closed; fails → back to open

Thresholds: >5% timeout rate over a 1-minute window triggers open.

Manual reset:

POST /api/demand/sources/{DSP_ID}/reset
X-API-Key: {YOUR_KEY}
⚠️

Resetting the circuit breaker while the underlying latency issue persists will retrigger it within seconds. Fix your endpoint performance first.


Budget depleted early

Guide QPS reduction

Guide reduces QPS as spend approaches the daily budget, using a linear pacing model. If you front-load bids (high CPMs in the morning), budget may exhaust before evening.

Fix: Use a conservative pacing strategy, or set daily_budget higher. You can also set budget per campaign in Delegate strategies.

Wrong timezone assumption

Praevis daily budgets reset at midnight UTC. If your timezone is UTC+4, budget resets at 04:00 local time, not midnight.


Bid response rejected

Praevis validates every bid response. Common rejection reasons:

ReasonFix
price ≤ 0Always send a positive price
impid doesn’t match requestCopy imp[0].id from the request exactly
Missing seatbidReturn proper OpenRTB structure
adm (VAST URL) not resolvingTest your VAST URL is reachable
Response not JSONVerify Content-Type: application/json

Still stuck?

Contact [email protected] with:

  1. Your demand source ID
  2. A sample bid request and your bid response
  3. The timestamp of the issue (UTC)
  4. Health endpoint output: GET /api/demand/sources/{DSP_ID}/health