This article shows how to read a site's analytics with the Semantic Model API. A semantic model describes one analytics subject area (such as site traffic, revenue, etc.) and defines the measures, dimensions, and parameters you can query.
SCOPE.DC-ANALYTICS-AND-REPORTS.READ-SITE-ANALYTICS).Base path: https://www.wixapis.com/analytics/semantic-model/v3
| Step | Method | Endpoint |
|---|---|---|
| List models | GET | /semantic-models |
| Get model schema | GET | /semantic-models/{semanticModelId} |
| Query model data | POST | /semantic-models/query-data |
Always follow List → Get → Query. You cannot construct a valid query without first discovering the model's field names from Get Semantic Model.
measures, dimensions, and parameters to find the exact name values to query and their supported filters/sorting.interval, with optional filters, sorting, paging, and formatting.interval is required on every query. There is no way to query without a date range — omitting it fails.interval is start-inclusive, end-exclusive ([start, end)). start is included, end is not. To get all of January 2026, query start: "2026-01-01..." and end: "2026-02-01..." — you get Jan 1–31, and Feb 1 is excluded. Set end to the day after the last day you want.interval.timezone to the site's time zone to match the Wix dashboard. Analytics in the Wix business manager are bucketed by the site's time zone. If interval.timezone is omitted it defaults to UTC, so day boundaries shift and your numbers won't match what the owner sees in the dashboard (and the same goes for using a different time zone). Get the site's IANA time zone from properties.timeZone via Get Site Properties (GET https://www.wixapis.com/site-properties/v4/properties) and pass it through.Get Semantic Model. The fields, filters[].field, and sort.fieldName values must exactly match a name returned by the model schema (e.g. traffic.sessions_count). Do not guess field names.dependencies array is also included in the same query; otherwise it's silently omitted from results (no error). For example, a measure may only return data when a specific dimension is also requested.results is capped at 1,000 rows — paginate with paging.offset for larger datasets.formattingEnabled: true to also receive a human-readable formattedValue per cell (e.g. 1500 → "$1,500.00" or 1.5K). Raw typed values are always returned.totalsIncluded: true to get a totals row summing numeric fields across the full (unpaginated) result set.unique measures (e.g. unique visitors), query the exact time range you want in a single request — never sum values from separate date-range queries. Uniques are deduplicated within each queried range, so adding per-range results double-counts anyone who appears in more than one range and overstates the true total.Response:
Pick the model whose subject area matches the request, and keep its id.
Response shape:
Each Field (in measures, dimensions, and parameters):
| Property | Meaning |
|---|---|
name | The exact value to use in fields, filters[].field, and sort.fieldName. |
type | STRING, NUMBER, BOOLEAN, DATE, DATE_TIME, OBJECT, or ARRAY. |
filters | Supported filter prefixes (IS/NOT) and conditions (e.g. EQUAL, RANGE_II, CONTAINS_ANY). |
sortable | Whether the field can be used in sort. |
enumerations | Allowed values, for enumerated fields. |
dependencies | Other field names this field needs present in the query to return data (see sharp edges). |
groupSlug | Fields sharing a groupSlug are logically related. |
description | Human-readable description of the field. |
POST /semantic-models/query-data (body requires Content-Type: application/json).
Required body fields: semanticModelId, interval, fields.
| Field | Required | Notes |
|---|---|---|
semanticModelId | Yes | GUID from List/Get. |
interval | Yes | { start, end } UTC ISO date-times, plus timezone. Range is start-inclusive, end-exclusive ([start, end)) — set end to the day after the last day you want. Set timezone to the site's IANA time zone (see Time zone section) so results match the Wix dashboard; defaults to UTC when omitted. |
fields | Yes | Up to 60 field names from the model schema. |
filters | No | Array of { field, values[], condition, prefix }. condition defaults to EQUAL, prefix defaults to IS. For RANGE_* conditions provide exactly 2 values. |
sort | No | { fieldName, order, nullsLast }. order defaults to ASC. Field must be sortable. |
paging | No | { limit, offset }. Defaults: limit 50, offset 0. |
formattingEnabled | No | Default false. Adds formattedValue per cell. |
totalsIncluded | No | Default false. Adds a totals row. |
Each cell in results[].fields is a typed value — one of numericValue, stringValue, booleanValue, timestampValue, arrayValue, or objectValue — plus formattedValue when formattingEnabled is true. totals is present only when totalsIncluded is true.
Analytics shown in the Wix business manager are aggregated by the site's time zone. To return numbers that match what the site owner sees, pass that time zone in interval.timezone on every query. When timezone is omitted, the API defaults to UTC — which shifts day boundaries and produces totals that don't line up with the dashboard (the same applies to any non-site time zone).
Get the site's time zone from Get Site Properties:
The IANA time zone string is returned in properties.timeZone:
Use that value as interval.timezone in Query Semantic Model Data. The Site Properties timeZone reflects the site's primary business address and requires the SITE_SETTINGS.VIEW permission.
To retrieve more than 1,000 rows, page through with offset:
paging: { limit: 1000, offset: 0 }.offset by the page size until pagingMetadata.count is less than the requested limit.| HTTP | Code | Meaning |
|---|---|---|
| 401 | NO_ACCOUNT_IDENTITY / UNAUTHENTICATED | Caller isn't authenticated; provide valid credentials. |
| 404 | SEMANTIC_MODEL_NOT_FOUND | The semanticModelId doesn't exist for this site. |
Silent gap (no error): a requested field returns no data because none of its dependencies were included in the query — add a dependency field and re-query.
Get Semantic Model.properties.timeZone from Get Site Properties) in interval.timezone so results match the Wix dashboard.dependencies in the query, or expect that field to be silently dropped.formattingEnabled: true for anything shown directly to a user; keep raw values for calculations.totalsIncluded: true to get period totals alongside a paged breakdown in a single call.fields minimal (projection) and paginate large result sets with offset.timeZone)Last updated: 7 July 2026