HomeBook a Demo

Revenue reports

Pull your organization's daily revenue for each publisher: fields, dates, when numbers change, how often to pull, pagination, and errors.

The Partner API is in private preview and available by invitation. If you're a partner interested in early access, contact support@getinline.io.

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.

FieldMeaning
dateThe UTC date.
publisher_idThe publisher's Inline ID.
primary_domainThe publisher's primary domain, such as example.com. Revenue from the publisher's other domains is included in this row.
gross_revenueWhat ad partners paid, before the revenue share.
net_revenueYour share of gross_revenue.
impressionsPaid ad impressions reported by ad partners.
currencyAn ISO 4217 code. Always USD today.
is_finaltrue when ad partners will not revise that date. See when numbers change.
  • Store rows by date and publisher_id. Use primary_domain to 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_date and end_date are UTC dates in YYYY-MM-DD form. Both are included, so start_date=2026-10-01&end_date=2026-10-07 is seven days.
  • end_date cannot be before start_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

  • limit sets the rows per page, from 1 to 1000. The default is 1000.
  • When meta.next_cursor is null, you have the last page. Otherwise, send it as cursor, 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: a publisher_id your token cannot see.
  • 503 unavailable: the report took too long. Retry with backoff. If it keeps failing, ask for fewer days or one publisher_id.

See errors for every code.