Getting started
From nothing to a loaded dataset. Four steps, roughly twenty minutes.
1. Get a token
Ask the customer system's IdentityServer for a token using the client_credentials grant and the scope ticketinghub-api. No user, no browser, no redirect — this is a server-to-server credential, valid for one hour.
Detail, including the one requirement that catches people out, is in Authentication.
2. Pull a dataset, naming your columns
GET https://<your-api-host>/api/ticketinghub/odata/v1/Tickets?$select=TicketInternalId,FaireventName,TicketGrossPrice,CurrencyShort
Authorization: Bearer <token>
Name the columns you actually load. A full ticket row carries 342 columns and weighs about 10 KB; most warehouses want a fraction of that. Projecting is also the single biggest lever on speed.
3. Follow the next link until it stops
Each response carries a page of rows and an @odata.nextLink. Request that link, repeat, and when a response comes back without one you have the complete dataset.
Paging is keyset-based, so the last page costs what the first one did, and rows written while you read cannot be skipped or duplicated. Do not build your own paging with $skip.
4. Do the same for the other three, then model in your warehouse
Tickets is the wide, denormalised centre. TicketUsages adds the scans, Surveys the survey answers, and StatisticGroups the article-to-group relation that the ticket rows cannot express on their own.
Building the extract turns these four steps into a production-ready loader, with retry, incremental loading and scheduling.
The reading order that saves time
| Read | When |
|---|---|
| How ticketing data works | before you model anything, if our domain is new to you |
| Authentication | first call, always |
| Querying | before your first full extract |
| Datasets → Reading the columns | before you decide which columns to load |
| Datasets → Column values | when you filter or group on a status column |
| Getting the numbers right | before you publish any figure |
| Recipes | when you have a specific question to answer |
| Errors | when something answers 4xx |