Revenue reports
Pull your organization's daily revenue for each publisher: fields, dates, when numbers change, how often to pull, pagination, and errors.
GET /v1/reports/revenue returns your organization's revenue for each publisher and day. It needs the reporting:read scope. The numbers match a dashboard revenue export made at the same moment.
curl "https://partner-api.getinline.tech/v1/reports/revenue?start_date=2026-10-01&end_date=2026-10-07" \
-H "Authorization: Bearer $INLINE_API_TOKEN"Fields
Each row is one publisher on one UTC date.
| Field | Meaning |
|---|---|
date | The UTC date. |
publisher_id | The publisher's Inline ID. |
primary_domain | The publisher's primary domain, such as example.com. Revenue from the publisher's other domains is included in this row. |
gross_revenue | What ad partners paid, before the revenue share. |
net_revenue | Your share of gross_revenue. |
impressions | Paid ad impressions reported by ad partners. |
currency | An ISO 4217 code. Always USD today. |
is_final | true when ad partners will not revise that date. See when numbers change. |
- Store rows by
dateandpublisher_id. Useprimary_domainto match rows to your own sites; you don't need to keep a map of Inline IDs. - A day with no revenue may have no row. Treat a missing row as zero.
- Amounts are rounded to 6 decimal places.
- There is no breakdown by ad partner.
Dates
start_dateandend_dateare UTC dates inYYYY-MM-DDform. Both are included, sostart_date=2026-10-01&end_date=2026-10-07is seven days.end_datecannot be beforestart_date.- One request covers up to 92 days. For a longer range, make several requests.
- The API works only in UTC. Convert to your time zone after you fetch the rows.
To get one publisher's rows, add publisher_id. A publisher your token cannot see returns 404.
When numbers change
Ad partners report late and sometimes revise their numbers:
is_final: true: the date is at least two UTC days old, and ad partners will not revise it.is_final: false: ad partners can still revise it.
For example, on 2026-10-24, rows for 2026-10-22 and earlier are final. Rows for 2026-10-23 and 2026-10-24 are not.
A change to your revenue share can still change net_revenue for any date, final or not. So when you reconcile, pull the whole range again (for example, the whole month you are closing) and replace the rows you stored.
How often to pull
Pull at most a few times a day. Revenue updates about every four hours, and the same request repeated within 15 minutes returns the same response.
A simple schedule: once or twice a day, pull from the start of the period you reconcile through today. Then replace the rows you stored for that range.
meta.data_through is the latest date with revenue loaded, or null if none has loaded for your range.
Pagination
limitsets the rows per page, from 1 to 1000. The default is 1000.- When
meta.next_cursorisnull, you have the last page. Otherwise, send it ascursor, with the same other parameters, to get the next page. - A cursor sent with different parameters returns
400. - Cursors are opaque. Do not decode or build them.
Sync example
This Python script pages through a report and retries 429, 500, and 503 with backoff. It uses the requests library.
import os
import time
import requests
BASE_URL = "https://partner-api.getinline.tech"
HEADERS = {"Authorization": f"Bearer {os.environ['INLINE_API_TOKEN']}"}
RETRY_STATUSES = {429, 500, 503}
def get_page(path, params):
for attempt in range(6):
resp = requests.get(BASE_URL + path, headers=HEADERS, params=params, timeout=60)
if resp.status_code not in RETRY_STATUSES:
resp.raise_for_status()
return resp.json()
time.sleep(int(resp.headers.get("Retry-After", 2 ** attempt)))
raise RuntimeError(f"{path} kept failing; request ID {resp.headers.get('X-Request-Id')}")
def report_rows(path, params):
cursor = None
while True:
page = get_page(path, {**params, **({"cursor": cursor} if cursor else {})})
yield from page["data"]
cursor = page["meta"]["next_cursor"]
if cursor is None:
return
for row in report_rows("/v1/reports/revenue", {"start_date": "2026-10-01", "end_date": "2026-10-24"}):
print(row["date"], row["primary_domain"], row["gross_revenue"], row["net_revenue"], row["is_final"])Errors
400 invalid_request: a bad date, a range over 92 days, or a cursor reused with different parameters. The message names the parameter.404 not_found: apublisher_idyour token cannot see.503 unavailable: the report took too long. Retry with backoff. If it keeps failing, ask for fewer days or onepublisher_id.
See errors for every code.