Developer · Pixel API

Pixel API endpoints reference

Every endpoint, with the scope it needs and the parameters it takes. Paths are relative to https://admaxxer.com/api/v1; your workspace always comes from the API key, and every report and write call names the website with website_id.

JSON in, JSON out · Workspace from the key · Filters on six reports · Cursor pagination

All endpoints

Paths are relative to https://admaxxer.com/api/v1.
MethodPathScopeWhat it does
GET/meAny keyThe key's name, scopes and workspace ID. Returned without the usual wrapper.
GET/pixel/websitespixel:readYour websites, newest first. Paginated with limit and cursor.
GET/pixel/analytics/metadatapixel:readThe same websites as a single list (websites, workspace_id), up to limit.
GET/pixel/analytics/pagespixel:readTop pages with views, sessions, bounces, bounce rate and average time. Dates required; filters apply.
GET/pixel/analytics/referrerspixel:readWhere visitors came from. mode picks the grouping: referrer (default), utm_source, utm_campaign, keyword or channel. Dates required; filters apply.
GET/pixel/analytics/campaignspixel:readOne row per UTM campaign, with its main source and medium. Visits without a campaign show as (none). Dates required.
GET/pixel/analytics/hostnamespixel:readReferring hosts, with common variants folded together (every facebook.com subdomain counts as facebook.com) and your own domains left out. Dates required.
GET/pixel/analytics/countriespixel:readTraffic by country (ISO-2 code). Dates required; filters apply.
GET/pixel/analytics/devicespixel:readTraffic by device type. Dates required; filters apply.
GET/pixel/analytics/browserspixel:readTraffic by browser. Dates required; filters apply.
GET/pixel/analytics/operating-systemspixel:readTraffic by operating system. Dates required; filters apply.
GET/pixel/analytics/timeseriespixel:readOne metric over time (metric, default visitors). Covers the last 30 days unless you pass dates.
GET/pixel/analytics/timeseries/breakdownpixel:readThe same series with metric=revenue by default, including new, renewal and refund revenue columns.
GET/pixel/analytics/realtimepixel:readThe last five minutes: live events, live visitors and sparklines in five-second steps.
GET/pixel/analytics/realtime/mappixel:readThe last five minutes by country: visitors and events per country.
GET/pixel/analytics/overviewpixel:readA tracking check: how many events arrived in the last five minutes, and when the latest one landed.
GET/pixel/visitors/{visitor_id}pixel:readThat visitor's most recent goal conversions (up to 100): time, goal name, details and session.
GET/pixel/goals/{goal_name}/metadatapixel:readHow a goal's text properties break down: distinct visitors per property and value. revenue_sum is always 0 — goals don't carry revenue.
GET/pixel/segmentspixel:readSaved segments for one website.
POST/pixel/segments/{id}/applypixel:readReturns a saved segment's filters object.
POST/pixel/segmentspixel:writeSave a segment.
PATCH/pixel/segments/{id}pixel:writeRename a segment or replace its filters.
DELETE/pixel/segments/{id}pixel:writeDelete a segment.
POST/pixel/goalspixel:writeRecord one goal conversion.
POST/pixel/paymentspixel:writeRecord one payment.
POST/pixel/eventspixel:writeRecord one pageview or custom event.
POST/pixel/identifypixel:writeAttach your own identifier to a pixel visitor.

Region and city breakdowns

/pixel/analytics/regions and /pixel/analytics/cities exist but always return 503, because visitor location is recorded at country level only. Use /pixel/analytics/countries, and don't retry those two.

A lower-level GET /pixel/metrics/{report} endpoint also exists for advanced integrations. The named endpoints above cover the common reports — if you need one that isn't listed, email support@admaxxer.com.

Report parameters

ParameterUsed byNotes
website_idEvery report, visitor history and goal metadataRequired. Your admx_ website ID. If it isn't one of your workspace's websites the call returns 403 forbidden.
from_date, to_datePages, referrers, campaigns, hostnames, countries, devices, browsers, operating systemsRequired on these. Whole days as YYYY-MM-DD; both days are included. Leaving either out returns 400 from_date_and_to_date_required. Optional on time series. Goal metadata reads from_date only and covers all time without it.
limitReports and website listsMaximum rows, up to 1,000. The default depends on the report — 100 for most, 250 for countries.
modeReferrersreferrer (default), utm_source, utm_campaign, keyword or channel.
metricTime seriesvisitors, sessions, pageviews, conversions, revenue, bounce_rate, session_time or conversion_rate. Anything else returns 400 invalid_metric.
granularityTime serieshour, day (default), week or month.
lookback_daysTime seriesHow many days back from today to cover when you don't pass both dates. Default 30.
tzTime seriesTime zone used to bucket the series, for example America/New_York. Default UTC.

Each time-series row has ts, value, revenue_new, revenue_renewal and revenue_refund (the revenue columns are 0 unless the metric is revenue). Revenue is in major currency units — 89.5, not 8950 — and is summed as recorded, without currency conversion.

If from_date falls before the earliest day your plan's data retention keeps, the report starts at that day instead.

Filtering reports

Add filters to the query string of the pages, referrers, countries, devices, browsers and operating-systems reports. Each filter narrows the result further. The other reports don't apply them.

FilterNarrows by
countryCountry (ISO-2 code, e.g. US)
deviceDevice type (desktop / mobile / tablet)
browserBrowser
osOperating system
referrer (also ref)Referring domain, for example google.com
pagePage path (e.g. /pricing)
utm_sourceUTM source
utm_mediumUTM medium
utm_campaignUTM campaign
utm_termUTM term
utm_contentUTM content

Choose how a filter matches with a prefix on its value. Separate several values with commas (up to 20 per filter). Matching is case-sensitive.

A filter the API can't apply is rejected with 400 unsupported_filter instead of being silently ignored, so you never get unfiltered numbers by mistake:

Not supportedWhy, and what to use
regionNot recorded — location is captured at country level. Use country.
cityNot recorded — location is captured at country level. Use country.
sourceAmbiguous. Use utm_source for the campaign source or referrer for the referring site.
viaAmbiguous. Use referrer.
entry_pageEntry page is worked out per session, so it can't filter individual rows.
hostnameUse the /pixel/analytics/hostnames report, or filter by referrer.

400 response for ?region=California

{
  "status": "error",
  "error": {
    "code": "unsupported_filter",
    "message": "region is not tracked at the pageview level. Filter by `country` instead.",
    "details": {
      "filter": "region",
      "supported": [
        "country",
        "device",
        "browser",
        "os",
        "referrer",
        "page",
        "utm_source",
        "utm_medium",
        "utm_campaign",
        "utm_term",
        "utm_content"
      ]
    }
  },
  "meta": {
    "request_id": "req_…"
  }
}

Pagination

GET /pixel/websites returns up to limit websites (default 100, maximum 1,000), newest first. While pagination.has_more is true, send pagination.next_cursor back as cursor to get the next page. Treat cursors as opaque; an invalid cursor starts again from the first page.

Sending data from your server

Use the write endpoints where the browser pixel can't run. To tie a server-side record to the visitor the pixel saw, read the visitor ID in the browser with window.admaxxer.getVisitorId(), pass it to your server with the order or sign-up, and send it as visitor_id. Without a visitor_id, Admaxxer creates a new visitor for that record.

Copy website_id exactly

Write calls don't check website_id against your workspace. A record sent with a mistyped website ID is accepted but won't appear in any report, so copy the ID from GET /pixel/websites.

accepted: true means the record was queued for writing; it shows up in reports shortly afterwards. Timestamps take Unix time in milliseconds or an ISO-8601 string, and default to the time of the request.

POST /pixel/payments

FieldTypeNotes
website_idstring, requiredYour admx_ website ID.
transaction_idstring, required (1–255)Your order or charge ID. Payments are de-duplicated on it, so re-sending the same payment doesn't count it twice.
amountnumber, requiredIn major currency units — 89.5, not 8950.
currencystring, 3 lettersISO code such as USD. Default USD.
visitor_idstring, up to 128The pixel visitor ID, so the payment can be attributed to the visit behind it.
timestampnumber or stringUnix milliseconds or ISO-8601. Default: now.

Returns accepted, visitor_id and transaction_id.

POST /pixel/goals

FieldTypeNotes
website_idstring, requiredYour admx_ website ID.
goal_namestring, required (1–255)The conversion's name, for example signup.
visitor_idstring, up to 128The pixel visitor ID.
propertiesobjectExtra detail about the conversion. Text values can be broken down with GET /pixel/goals/{goal_name}/metadata.
timestampnumber or stringUnix milliseconds or ISO-8601. Default: now.

Returns accepted, visitor_id and goal_name.

POST /pixel/events

FieldTypeNotes
website_idstring, requiredYour admx_ website ID.
namepageview (default) or customTo record a payment, use POST /pixel/payments — its transaction_id keeps every payment distinct.
pathstring, up to 2,048Page path. Default /.
referrerstring, up to 2,048The referring URL.
visitor_id, session_idstring, up to 128Generated for you if left out.
tsnumber or stringUnix milliseconds or ISO-8601. Default: now.
propertiesobjectFor custom events: goal_name sets the conversion's name (default custom_event), and the whole object is kept as its details.
utm_source, utm_medium, utm_campaign, utm_term, utm_contentstring, up to 255Campaign tags.

Returns accepted, visitor_id and session_id.

POST /pixel/identify

FieldTypeNotes
website_idstring, requiredYour admx_ website ID.
visitor_idstring, requiredThe pixel visitor ID.
external_idstring, required (up to 512)Your identifier for the person, such as a user ID or email. Admaxxer stores a one-way hash of it, never the raw value.
traitsobjectStored as sent — leave personal data out.

Returns accepted and visitor_id.

Saved segments

Segments are named filter sets you store for a website and fetch back to reuse in report requests. Admaxxer keeps the filters object exactly as you send it.

Segments use the website's id

Segment calls identify the website by its id (a UUID) from GET /pixel/websites — not by the admx_ website ID the reports use. Passing the admx_ ID here returns an error.

Examples

List your websites

curl "https://admaxxer.com/api/v1/pixel/websites?limit=1" \
  -H "Authorization: Bearer $ADMAXXER_API_KEY"
{
  "status": "success",
  "data": [
    {
      "id": "6f1c2a7e-3b4d-4e5f-9a8b-1c2d3e4f5a6b",
      "websiteId": "admx_Xq3vN8kLp2RtY7wZb4cD9eFg",
      "allowedDomains": ["example.com"],
      "createdAt": "2026-04-17T09:30:12.418Z"
    }
  ],
  "meta": { "request_id": "req_2b6f0a3e-5d1c-4e8b-9f7a-0c3d6e9b2a14" },
  "pagination": { "has_more": true, "next_cursor": "eyJ0cyI6…" }
}

Top pages for US visitors, excluding newsletter traffic

curl "https://admaxxer.com/api/v1/pixel/analytics/pages?website_id=admx_your_site_id&from_date=2026-09-01&to_date=2026-09-30&country=US&utm_source=is_not:newsletter&limit=3" \
  -H "Authorization: Bearer $ADMAXXER_API_KEY"
{
  "status": "success",
  "data": {
    "data": [
      { "path": "/", "views": "4210", "sessions": "2984", "bounces": "1702", "bounce_rate": 57.04, "avg_time_seconds": 41.3 },
      { "path": "/pricing", "views": "1388", "sessions": "1017", "bounces": "402", "bounce_rate": 39.53, "avg_time_seconds": 68.9 },
      { "path": "/blog/attribution-guide", "views": "912", "sessions": "804", "bounces": "610", "bounce_rate": 75.87, "avg_time_seconds": 22.4 }
    ],
    "meta": [],
    "rows": 3,
    "statistics": { "elapsed": 0.018, "rows_read": 61505, "bytes_read": 2471088 },
    "data_status": "ok"
  },
  "meta": { "request_id": "req_8e3a1f6c-2b7d-4c09-a5e4-7f1b9d0c3e52" }
}

bounce_rate is a percentage and avg_time_seconds is in seconds. Counts such as views are strings so large values keep full precision.

Record a payment from your server

curl -X POST https://admaxxer.com/api/v1/pixel/payments \
  -H "Authorization: Bearer $ADMAXXER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "website_id": "admx_your_site_id",
    "transaction_id": "order_10482",
    "amount": 89.5,
    "currency": "USD",
    "visitor_id": "3f9c1b2e-8a47-4d1e-9b6a-2c5e7f0d1a93"
  }'
{
  "status": "success",
  "data": {
    "accepted": true,
    "visitor_id": "3f9c1b2e-8a47-4d1e-9b6a-2c5e7f0d1a93",
    "transaction_id": "order_10482"
  },
  "meta": { "request_id": "req_1b7e9d42-6c3a-4f85-a0d2-8e4c7b9f1a36" }
}

Frequently asked questions

Q: Why do some numbers come back as strings?

Counts such as views and sessions are 64-bit integers, which some JSON parsers can't hold exactly, so they're sent as strings. Convert them with your language's number parser. Rates and averages, such as bounce_rate, are ordinary numbers.

Q: Can I send several events in one request?

No — each write call records one goal, payment, event or identity. Writes share the 60-requests-per-minute budget with reads; see Rate limits.

Q: Do filters work on every report?

They narrow the pages, referrers, countries, devices, browsers and operating-systems reports; the other reports don't apply them. Filters the API can't apply at all, such as region or city, return 400 unsupported_filter on every report.

Q: How do I get a visitor ID for server-side records?

In the browser, call window.admaxxer.getVisitorId() once the pixel has loaded, send the value to your server with the order or sign-up, and use it as visitor_id on the write call.

Q: Is the website list paginated?

GET /pixel/websites is — follow pagination.next_cursor while has_more is true. GET /pixel/analytics/metadata returns a single list of up to limit websites with no cursor.