Reporting API

Your statistics with us, by API: requests, bids, wins, impressions and money, by day or hour, in your time zone. The same API works for publishers (SSP) and advertisers (DSP); a key sees only its own feed.

Quick start

curl
curl -X POST 'https://api.gfybid.com/api/v1/report' \
  -H 'X-API-Token: your_api_token_here' \
  -H 'Content-Type: application/json' \
  --data '{
    "date_from": "2026-11-01 00:00:00",
    "date_to": "2026-11-04 23:59:59",
    "group_by": ["EventDate"],
    "metrics": ["Requests", "Bids", "Impression", "Amount", "Ecpm"],
    "timezone": "UTC",
    "order": {"field": "EventDate", "sort": "DESC"},
    "page": {"number": 1, "size": 100}
  }'

Authentication

Every request carries your API key in a header:

Headers
X-API-Token: {your key}
Content-Type: application/json

Endpoint

Endpoint
POST https://api.gfybid.com/api/v1/report

Request body

FieldTypeRequiredDescription
date_fromstringyesStart, Y-m-d H:i:s, in timezone
date_tostringyesEnd, inclusive, Y-m-d H:i:s; at most 31 days after date_from
metricsarrayyes1 to 10 of the metrics
group_byarraynoEventDate, EventHour; none = one total row
timezonestringnoIANA name, e.g. UTC (default), Europe/Berlin
orderobjectno{"field": "<group field or requested metric>", "sort": "ASC" | "DESC"}; default: by time, ascending
pageobjectno{"number": 1, "size": 10}; size 1–100, default 10
wherearraynoFilters are not supported yet: omit it or send []

Unknown fields are refused with 422, so a typo never silently changes your report.

Metrics

MetricPublisher (SSP)Advertiser (DSP)
RequestsBid requests you sent usBid requests we sent you
BidsBids we returned to youBids you returned that we passed on
WinsWin notices you sent usWin notices for your bids
ImpressionBilling notices recordedBilling notices recorded for your bids
AmountWhat we owe you, USDWhat you owe us, USD
EcpmAmount per 1000 impressions, USDSame

Time and freshness

Response

200 OK
{
  "meta": {
    "pagination": {"per_page": 100, "current_page": 1, "has_more": false},
    "role": "ssp",
    "status": true,
    "code": 200,
    "currency": "USD",
    "timezone": "UTC"
  },
  "data": [
    {
      "metric": {
        "Requests": "1250000",
        "Bids": "310000",
        "Impression": "41020",
        "Amount": "1590.776",
        "Ecpm": "0.038781"
      },
      "group": {
        "EventDate": {"id": "2026-11-04", "name": "2026-11-04", "field_name": "EventDate"}
      }
    }
  ]
}

The numbers above are an example, not real data.

Example: hours of one day, in Berlin time

Request body
{
  "date_from": "2026-11-04 00:00:00",
  "date_to": "2026-11-04 23:59:59",
  "group_by": ["EventHour"],
  "metrics": ["Requests", "Impression", "Amount"],
  "timezone": "Europe/Berlin",
  "page": {"number": 1, "size": 24}
}

Limits

Errors

CodeWhen
401Missing, invalid or revoked key
422Invalid request: the error field says what is wrong
429More than 2 requests per second per key (bursts up to 10): retry after Retry-After seconds
500Our error, or the report took too long: retry later, or ask for a shorter period
Error body
{
  "meta": {"status": false, "code": 422},
  "error": "the period must not exceed 31 days"
}

Common 422 messages

MessageFix
date_from and date_to: format Y-m-d H:i:s …Send both dates as 2026-11-04 00:00:00
the period must not exceed 31 daysSplit the period
metrics: 1 to 10 of …Send at least one supported metric
group_by: supported fields are EventDate, EventHourRemove other group fields
timezone: an IANA name …Use names like UTC or Europe/Berlin
order.field: a group_by field or a requested metricOrder by a field you group by or a metric you asked for
page.number must be ≥ 1, page.size 1–100Fix the page object
where: filters are not supported yet; send []Omit where

Questions about the integration? Write to manager@gfybid.com or use the contact form.