Get statistic groups
One row per article-to-statistics-group assignment. A small reference dataset that carries the many-to-many relation the ticket rows cannot express — and the place where audited attendance reporting is structured.
Load it whole — it is seven columns and typically a few hundred rows.
Grain and key
| Grain | one row per article-to-group assignment |
| Natural key | MandatorInternalId, ArticleInternalId, StatisticGroupInternalId |
| Page size | 1000 |
| Columns | 7 |
| Watermark | none |
The complete dataset
All seven columns:
| Column | Type | Notes |
|---|---|---|
MandatorInternalId | int | Key. Constant for your feed. |
ArticleInternalId | int | Key. Join to Tickets. |
StatisticGroupInternalId | int | Key. |
Name | string? | The group name — your chart dimension. |
Description | string? | Longer description of the group. |
IsFkmTotal | bool | The group counts towards the audited total. |
IsFkmVisitor | bool | The group counts as visitors. |
Why this is a separate dataset
An article is regularly a member of several statistics groups at once — a single column on the ticket row cannot represent that. Splitting it out is the only correct way to model it. In warehouse terms this is a bridge table, not a dimension.
Traps specific to this dataset
- The join multiplies rows. An article in three groups produces three rows per ticket. A
COUNT(*)after joining counts assignments, not tickets — count distinctTicketInternalId. - An article with no group has no row here. An inner join silently drops those tickets. Use a left join and decide explicitly what the unassigned bucket means — often it belongs in an "other" category rather than being dropped.
IsFkmTotalandIsFkmVisitorare independent, not a partition. A visitor badge group is normally in both; a plain business category is a row with both false. Never derive one from the other, and never compute non-visitors as total minus visitor.- No event context. Group membership is a property of the article, not of an event. The event comes from the ticket.
Joining
Join to Tickets on MandatorInternalId, ArticleInternalId. See How ticketing data works → Counting visitors for how to use the result correctly.
Request
No request body.
$select(string): rarely needed here — there are only seven columns.$filter(string): an OData predicate.$orderby(string): sort order.$top(integer): maximum rows, capped at 1000.$count(boolean): include the total count.$skiptoken(string): server-generated paging token.
Response
@odata.context(string): the metadata URL describing this payload.value(array): the page of assignment rows.@odata.nextLink(string, optional): the next page; absent on the last one.@odata.count(integer, optional): present only when$count=true.
Three things to get right when you join
Join on MandatorInternalId and ArticleInternalId. Then:
The join multiplies rows. An article in three groups produces three rows per ticket. Count distinct TicketInternalId, never rows, or you will triple your attendance figure.
An article with no group has no row here. An inner join silently drops those tickets. Use a left join and decide deliberately what the unassigned bucket means in your report.
IsFkmTotal and IsFkmVisitor are independent flags, not a partition. Report them separately; never subtract one from the other.
See How ticketing data works → Counting visitors and the Audited attendance by statistics group entry in Recipes.
Authentication#auth
This endpoint does not require authentication.
Headers#headers
Required. A client-credentials token carrying the scope ticketinghub-api and no subject. See Authentication.
Optional. JSON is returned by default.
Query parameters#query
Comma-separated list of columns to load. With only seven columns, loading the whole row is usually the right call.
OData predicate. Remember the two FKM flags are independent, so filtering on one tells you nothing about the other.
Sort order. Note that it also changes the order the keyset walk runs in.
Maximum number of rows. Capped at 1000; a higher value is rejected with 400.
Include the total row count in @odata.count. Note this counts assignments, not articles. Scans the whole dataset; ask once per load.
Server-generated keyset paging token. Note that this dataset has a three-part key, so the walk runs in alphabetical key order.
Offset paging. Supported but discouraged — use @odata.nextLink instead.