API ReferenceSupply Source API

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/sources

Query params:

ParamTypeDescription
pageintPage number (default: 1)
per_pageintResults per page (default: 50, max: 200)
statusstringactive, 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/sources

Body:

{
  "name": "My CTV Publisher",
  "domain": "myapp.example.com",
  "type": "ctv",
  "floor_price_cpm": 3.00,
  "sandbox": false,
  "content_genre": "drama",
  "pool_id": "pool-uuid"
}
FieldRequiredDescription
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=24h

Query params:

ParamValuesDescription
period1h, 6h, today, 24h, 7d, 30dTime range
regionfra, nyc, lonFilter 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/pools

Response:

{
  "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/pools

Body:

{
  "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}/assign

Body:

{
  "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=24h

Returns 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:

EventTrigger
publisher.verifiedapp-ads.txt verification succeeded
publisher.verification_failedVerification failed
publisher.fill_rate_alertFill rate dropped below threshold
pool.dsp_joinedA 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.json

Response:

{
  "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.