This guide shows you how to slice Tracksuit data by demographics and how that differs from pulling a full demographic breakdown. Demographics include age, gender, region, income and any other dimension your tracker collects.
đ Try it in the browser first. Our interactive API documentation lets you paste in your key, fill in filters, and run live requests against every endpoint before you write any code.
Two different jobs. Pick the right one
There are two ways to work with demographics, and they answer different questions:
You want⌠| Use | How |
One or multiple metrics, for all brands, narrowed to one demographic slice (e.g. the funnel among 18â24s) | Any timeline endpoint + | Add a |
How the audience for one metric breaks down across demographics (e.g. of those aware of my brand, who are they?) | The | Call |
The rest of this guide covers filters first, then /profile.
Step 1: Find the demographics available to you
Demographic options are not fixed across Category View. Each Category View exposes its own set. List them with the Get Metadata call:
curl <https://prod.beta.api.gotracksuit.com/v2/category-views/{id}> \ -H "Authorization: Bearer YOUR_API_KEY"The response has a dimensions array â every valid name/value pair you can filter on:
{ "dimensions": [ { "name": "Age", "value": "18 to 24 years" }, { "name": "Age", "value": "25 to 34 years" }, { "name": "Gender", "value": "Female" }, { "name": "Gender", "value": "Male" } ] }Always pull your filter values from this list. A name/value that doesn't match a real dimension returns no slice. Matching is case-insensitive, but the wording must otherwise line up (18 to 24 years, not 18-24).
Step 2: Apply a demographic filter
Add the filters query parameter to any timeline endpoint. It takes a stringified JSON array in either of two formats:
# Format 1 â "name:value" strings filters=["Age:18 to 24 years","Gender:Female"] # Format 2 â name/value objects filters=[{"name":"Age","value":"18 to 24 years"},{"name":"Gender","value":"Female"}]A full funnel request, URL-encoded:
curl -G <https://prod.beta.api.gotracksuit.com/v2/category-views/{id}/funnel> \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "start_period=2025-01-01" \ --data-urlencode "end_period=2025-06-01" \ --data-urlencode 'filters=["Age:18 to 24 years"]'Each "name:value" string must contain at least one colon. Only the first colon splits name from value, so values that contain colons are fine. Age:18:24 parses as name Age, value 18:24. A string with no colon at all is rejected. Use Format 2 if you'd rather avoid the ambiguity.
Combining filters narrows the audience. Adding dimensions from different types. Say an age band and a gender: this restricts results to respondents who match all of them (18â24 and Female). Smaller slices mean smaller samples, so watch the sample indicator on each data point.
How filters combine: values of the same type are OR'd, different types are AND'd.
Default behavior: no filter means "Total"
If you omit filters, the response aggregates all respondents for the category view. The equivalent of the dashboard's "Total" population. This is the right call when you want the headline number for a brand.
Which endpoints accept filters
Endpoint | Supports |
| â Yes |
| â Yes |
| â Yes |
| â Yes |
| â No. It returns the breakdown instead (see below) |
Getting a full demographic breakdown with /profile
Use /profile when you want the demographic breakdown of a single metric: how the people who count toward that metric are distributed across demographics. You give it one metric (a funnel-metric cohort e.g. everyone aware of the brand), and it returns that breakdown. It does not take filters; it returns one item per brand Ă demographic.
curl -G <https://prod.beta.api.gotracksuit.com/v2/category-views/{id}/profile> \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "start_period=2025-01-01" \ --data-urlencode "end_period=2025-06-01" \ --data-urlencode "metric=PROMPTED_AWARENESS"Each item carries the brand, the demographic it describes, a value, a sample indicator and an is_significant flag. value is not the metric's own value â it's the percentage of that metric's cohort that falls into this demographic (e.g. of everyone aware of the brand, the share who are 18â24). Each item also carries a category block with the equivalent category-level figure. This is the fastest way to answer "what does my audience look like?" in a single call. Pull the valid metric names from funnel_metrics in the Get Metadata response.
Common pitfalls
Don't sum demographic slices.
Weighting is applied dynamically per slice, so adding up individual age bands (the "kitchen sink" approach) won't equal the Total. For the whole category, pull it with no filter; for one slice, pull that slice on its own. Aggregating across time is fine.
Small slices get noisy.
A tight filter (e.g. one age band and one gender and one region) can drop the sample below a reliable threshold. Every data point carries a sample indicator (Insufficient / Directional / Reliable). Raw sample sizes are not exposed, so lean on the indicator. On /funnel you can also set minimum_indicator to drop low-quality points automatically.
Numbers won't always match the dashboard one-for-one.
See Why your API numbers may differ from the dashboard for how weighting and rounding play out across slices.

