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}/healthIf 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}/healthIf circuit_breaker is "open", requests are paused. Fix the latency issue and manually reset:
POST /api/demand/sources/{DSP_ID}/resetBudget 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": 3Condition 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
| State | Meaning | Action |
|---|---|---|
closed | Healthy — all requests flowing | None needed |
open | Too many timeouts — requests paused for 60s | Fix latency, then manual reset or wait |
half_open | Recovery probe — sending 10% of requests | Succeeds → 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:
| Reason | Fix |
|---|---|
price ≤ 0 | Always send a positive price |
impid doesn’t match request | Copy imp[0].id from the request exactly |
Missing seatbid | Return proper OpenRTB structure |
adm (VAST URL) not resolving | Test your VAST URL is reachable |
| Response not JSON | Verify Content-Type: application/json |
Still stuck?
Contact [email protected] with:
- Your demand source ID
- A sample bid request and your bid response
- The timestamp of the issue (UTC)
- Health endpoint output:
GET /api/demand/sources/{DSP_ID}/health