Supply API
Manage supply sources (Publishers), pools, and supply configuration programmatically.
Base URL: https://api.praevis.com
Auth: X-API-Key: {YOUR_KEY} on all requests
Supply Sources
List supply sources
GET /api/supply/sourcesQuery params:
| Param | Type | Description |
|---|---|---|
page | int | Page number (default: 1) |
per_page | int | Results per page (default: 50, max: 200) |
status | string | active, sandbox, archived |
Response:
{
"publishers": [
{
"id": "pub-uuid",
"name": "Example CTV Publisher",
"domain": "example.com",
"type": "ctv",
"status": "active",
"sandbox": false,
"pool_id": "pool-uuid",
"floor_price_cpm": 3.00,
"created_at": "2026-01-15T12:00:00Z"
}
],
"total": 12,
"page": 1
}Create supply source
POST /api/supply/sourcesBody:
{
"name": "My CTV Publisher",
"domain": "myapp.example.com",
"type": "ctv",
"floor_price_cpm": 3.00,
"sandbox": false,
"content_genre": "drama",
"pool_id": "pool-uuid"
}| Field | Required | Description |
|---|---|---|
name | ✓ | Display name |
domain | ✓ | App bundle or web domain |
type | ✓ | ctv, mobile, web |
floor_price_cpm | — | Floor in USD CPM (default: 0) |
sandbox | — | true to create in sandbox mode |
content_genre | — | Default genre for all inventory |
pool_id | — | Assign to pool immediately |
Response: 201 Created with the created supply source object.
Get supply source
GET /api/supply/sources/{id}Returns a single supply source object.
Update supply source
PUT /api/supply/sources/{id}Body: Same fields as create supply source. Only fields included are updated (partial update supported).
{
"floor_price_cpm": 4.50,
"content_genre": "sport"
}Archive supply source
DELETE /api/supply/sources/{id}Sets status to archived. Supply source no longer receives auction traffic. Not reversible via API — contact support to restore.
Get supply source metrics
GET /api/supply/sources/{id}/stats?period=24hQuery params:
| Param | Values | Description |
|---|---|---|
period | 1h, 6h, today, 24h, 7d, 30d | Time range |
region | fra, nyc, lon | Filter by region |
Response:
{
"publisher_id": "pub-uuid",
"period": "24h",
"impressions": 142580,
"fill_rate": 0.847,
"revenue_cents": 21087,
"ecpm_cents": 1478,
"bid_requests": 168450,
"p50_ms": 3,
"p95_ms": 14,
"p99_ms": 28
}Pools
List pools
GET /api/supply/poolsResponse:
{
"pools": [
{
"id": "pool-uuid",
"name": "Premium CTV",
"description": "High-quality CTV inventory",
"publisher_count": 8,
"dsp_count": 4,
"floor_price_cpm": 3.00
}
]
}Create pool
POST /api/supply/poolsBody:
{
"name": "Premium CTV",
"description": "High-quality CTV inventory, UAE-first",
"floor_price_cpm": 3.00
}Assign supply source to pool
PUT /api/supply/pools/{pool_id}/assignBody:
{
"publisher_id": "pub-uuid"
}A supply source can only belong to one pool at a time. This replaces any existing assignment.
Get pool stats
GET /api/supply/pools/{pool_id}/stats?period=24hReturns aggregate metrics across all supply sources in the pool.
Webhook events (supply)
Supply-side events can be delivered to a webhook URL registered in Settings:
| Event | Trigger |
|---|---|
publisher.verified | app-ads.txt verification succeeded |
publisher.verification_failed | Verification failed |
publisher.fill_rate_alert | Fill rate dropped below threshold |
pool.dsp_joined | A demand source subscribed to this pool |
Webhooks are delivered as POST with Content-Type: application/json. Respond with HTTP 200 within 5 seconds to acknowledge.
Sellers.json
Praevis publishes an IAB Tech Lab compliant sellers.json file listing all authorized sellers on the exchange.
GET https://api.praevis.com/sellers.jsonResponse:
{
"contact_email": "[email protected]",
"contact_address": "Nucleus AI Pte. Ltd., Singapore",
"version": "1.0",
"identifiers": [{ "name": "TAG-ID", "value": "praevis.com" }],
"sellers": [
{
"seller_id": "publisher-uuid",
"name": "Example Publisher",
"domain": "example.com",
"seller_type": "INTERMEDIARY",
"is_confidential": 0
}
]
}This file is public (no authentication required) and cached for 1 hour. DSPs use it to verify authorized sellers before bidding.