API Reference

Analytics read API endpoints are available under /v1/analytics/ for organization-scoped queries and /v1/analytics/{projectId}/ for service-scoped queries, where {projectId} is the Moneat service identifier. They require an authenticated dashboard session JWT via the Authorization: Bearer {token} header.

Authentication

Include the dashboard session JWT in every request:

HTTP
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...

Analytics read endpoints do not currently use the scoped API tokens documented on the API Tokens page.

Common parameters

These query parameters are accepted by all endpoints (unless noted otherwise):

ParameterTypeDefaultDescription
periodstring30dDate range preset: today, 7d, 30d, month, 6mo, 12mo, custom
date_fromstring-Start date in YYYY-MM-DD format. Required when period=custom.
date_tostring-End date in YYYY-MM-DD format. Required when period=custom.
comparisonstringprevious_periodComparison mode: previous_period, year_over_year, none
filters[]string[]-Filter expressions in property:operator:value format. See Filtering.
limitinteger100Maximum number of results for breakdown endpoints.

Endpoints

GET /overview

Returns top-level KPI metrics for the selected period.

Response:

JSON
{
  "uniqueVisitors": 12450,
  "totalPageviews": 34200,
  "bounceRate": 42.5,
  "avgVisitDuration": 185,
  "viewsPerVisit": 2.75,
  "comparison": {
    "uniqueVisitors": 11200,
    "totalPageviews": 30100,
    "bounceRate": 45.1,
    "avgVisitDuration": 170,
    "viewsPerVisit": 2.69
  }
}
FieldTypeDescription
uniqueVisitorsintegerDistinct visitors in the period
totalPageviewsintegerTotal page loads
bounceRatefloatPercentage of single-pageview sessions (0–100)
avgVisitDurationintegerAverage session duration in seconds
viewsPerVisitfloatAverage pageviews per session
comparisonobjectSame fields for the comparison period (absent if comparison=none)

GET /timeseries

Returns time-bucketed data for charting visitors and pageviews over time.

Response:

JSON
[
  { "timestamp": "2025-01-01T00:00:00Z", "visitors": 142, "pageviews": 380 },
  { "timestamp": "2025-01-02T00:00:00Z", "visitors": 156, "pageviews": 425 },
  ...
]
FieldTypeDescription
timestampstringISO 8601 timestamp for the start of the bucket
visitorsintegerUnique visitors in this bucket
pageviewsintegerTotal pageviews in this bucket

Bucket size is determined automatically by the period (hourly for today, daily for 7d/30d, weekly for 6mo, monthly for 12mo).


GET /pages

Top pages ranked by visitor count.

Response:

JSON
[
  {
    "name": "/pricing",
    "visitors": 3200,
    "pageviews": 4100,
    "bounceRate": 35.2,
    "avgDuration": 210,
    "percentage": 25.7
  },
  ...
]
FieldTypeDescription
namestringPage URL path
visitorsintegerUnique visitors
pageviewsintegerTotal views
bounceRatefloatBounce rate for sessions entering on this page
avgDurationintegerAverage session duration in seconds
percentagefloatShare of total visitors (0–100)

GET /entry-pages

Top entry (landing) pages - the first page visitors see when they arrive.

Response: Same structure as /pages.


GET /exit-pages

Top exit pages - the last page visitors see before leaving.

Response:

JSON
[
  {
    "name": "/checkout",
    "visitors": 1800,
    "pageviews": 2400,
    "percentage": 14.5
  },
  ...
]

GET /sources

Traffic sources (referrers) ranked by visitor count.

Response:

JSON
[
  { "name": "Google", "visitors": 5400, "pageviews": 14200, "percentage": 43.4 },
  { "name": "Direct", "visitors": 3100, "pageviews": 7800, "percentage": 24.9 },
  { "name": "twitter.com", "visitors": 1200, "pageviews": 2800, "percentage": 9.6 },
  ...
]

GET /utm/{param}

Breakdown by a specific UTM parameter.

Path Parameters:

ParameterValues
paramsource, medium, campaign, term, content

Example:

HTTP
GET /v1/analytics/1/utm/campaign?period=30d

Response:

JSON
[
  { "name": "spring-sale", "visitors": 2400, "pageviews": 5600, "percentage": 38.0 },
  { "name": "newsletter-jan", "visitors": 1100, "pageviews": 2300, "percentage": 17.5 },
  ...
]

GET /locations

Geographic breakdown of visitors by country.

Response:

JSON
[
  { "name": "US", "visitors": 5200, "pageviews": 14000, "percentage": 41.8 },
  { "name": "GB", "visitors": 1800, "pageviews": 4200, "percentage": 14.5 },
  { "name": "DE", "visitors": 1400, "pageviews": 3600, "percentage": 11.2 },
  ...
]

The name field contains the ISO 3166-1 alpha-2 country code. Requires GeoIP database to be configured.


GET /devices

Device, browser, or OS breakdown.

Query Parameters:

ParameterRequiredValues
typeYesbrowser, os, device

Example:

HTTP
GET /v1/analytics/1/devices?type=browser&period=30d

Response:

JSON
[
  { "name": "Chrome", "visitors": 6800, "pageviews": 18400, "percentage": 54.6 },
  { "name": "Safari", "visitors": 2400, "pageviews": 5800, "percentage": 19.3 },
  { "name": "Firefox", "visitors": 1600, "pageviews": 4200, "percentage": 12.9 },
  ...
]

GET /events

Custom event names and occurrence counts.

Response:

JSON
[
  { "name": "Signup", "visitors": 840, "pageviews": 920, "percentage": 6.7 },
  { "name": "Download", "visitors": 420, "pageviews": 580, "percentage": 3.4 },
  ...
]
The pageviews field represents total occurrences of the event (not actual pageviews) for custom events.

GET /realtime

Current number of active visitors (last 5 minutes).

No query parameters - this endpoint does not accept period or filter parameters.

Response:

JSON
{
  "currentVisitors": 24
}

GET /funnel

Funnel analysis for ordered event sequences.

Query Parameters:

ParameterRequiredDescription
steps[]YesOrdered funnel steps. Use pageview:/path for pageviews or EventName for custom events.

Example:

HTTP
GET /v1/analytics/1/funnel?steps[]=pageview:/pricing&steps[]=Start Trial&steps[]=Complete Signup&period=30d

Response:

JSON
{
  "steps": [
    { "name": "pageview:/pricing", "visitors": 1200, "conversionRate": 100.0, "dropoffRate": 0.0 },
    { "name": "Start Trial", "visitors": 840, "conversionRate": 70.0, "dropoffRate": 30.0 },
    { "name": "Complete Signup", "visitors": 504, "conversionRate": 42.0, "dropoffRate": 40.0 }
  ],
  "overallConversionRate": 42.0
}

See Funnel Analysis for detailed usage.


Error responses

Status CodeDescription
401 UnauthorizedMissing or invalid JWT token
403 ForbiddenUser does not have access to this service or organization
404 Not FoundService or organization not found
422 Unprocessable EntityInvalid parameters (e.g., bad date format, unknown filter property)
429 Too Many RequestsRate limit exceeded

Error responses include a JSON body:

JSON
{
  "error": "Invalid filter property: unknown_prop"
}

Rate limits

Analytics API endpoints are rate-limited per organization. Current limits depend on your plan and deployment configuration; see Billing & Plans for the current source of truth.

Rate limit headers are included in every response:

HTTP
X-RateLimit-Limit: 300
X-RateLimit-Remaining: 298
X-RateLimit-Reset: 1706745600