The contentFilters URL parameter filters a dashboard or widget when it loads. This lets you send one shared dashboard to different audiences, each seeing only their own customer, region or date range.
contentFilters works with:
- Dashboard and widget Shareable URLs
- Secure URL Embed, where the parameter must be encrypted along with the rest of the request
- The JavaScript Embed API, where filters are passed as a
contentFiltersarray instead of a URL parameter
Note: On a plain Shareable URL, the filter values are visible and can be edited by anyone with the link. Use content filters in a plain URL for convenience, not security. To restrict the data a viewer can see, use User Level Filters or Secure URL Embed.
Syntax
contentFilters takes a JSON array. Each object in the array is one filter:
[{"fieldName":"customer","values":["Costco"],"operator":"="}]| Key | Type | Description |
|---|---|---|
| fieldName | string | The field to filter on. Not case sensitive. |
| values | array | The value(s) to compare against. Always an array, even for a single value. Quote strings (["Costco"]) and leave numbers unquoted ([90000]). |
| operator | string | The comparison to apply. See Supported Operators. |
To use the filter in a link, URL encode the whole JSON string and append it to the share URL:
<share URL>?contentFilters=<URL-encoded JSON>
For example, the filter above becomes:
https://www.knowi.com/d/<dashboardShareId>?contentFilters=%5B%7B%22fieldName%22%3A%22customer%22%2C%22values%22%3A%5B%22Costco%22%5D%2C%22operator%22%3A%22%3D%22%7D%5D
Tip: Write the JSON in plain text first, then run it through a URL encoder. Spaces in field names, apostrophes in values (such as Macy's) and other special characters need no extra escaping beyond normal URL encoding.
Supported Operators
| Operator | Field Types | Description |
|---|---|---|
| = | string, number, date | Exact match, case sensitive. With several values, matches any of them (same as in). |
| != | string, number, date | Excludes rows that match the value. |
| in | string, number | Matches any value in the array. |
| not in | string, number | Excludes every value in the array. |
| like | string | Contains the value, case insensitive. For example, Ma matches Macy's. |
| not like | string | Excludes rows that contain the value, case insensitive. |
| > | number, date | Greater than. |
| >= | number, date | Greater than or equal to. |
| < | number, date | Less than. |
| <= | number, date | Less than or equal to. |
| is null | any | Field is empty. Use an empty values array: "values":[]. |
| is not null | any | Field has a value. Use an empty values array: "values":[]. |
Word operators are lowercase with single spaces (not in, is null). For >, >=, < and <=, only the first value in the array is used.
Note: Use
!=for "not equal", not<>. The<>operator is not supported and returns the matching rows instead of excluding them. Operators such asstarts withare also not supported and return no data. Uselikeinstead.
Examples:
{"fieldName":"customer","values":["Costco"],"operator":"="}
{"fieldName":"customer","values":["Costco","Target"],"operator":"in"}
{"fieldName":"customer","values":["Costco","Target"],"operator":"not in"}
{"fieldName":"customer","values":["Ma"],"operator":"like"}
{"fieldName":"opened","values":[90000],"operator":">"}
{"fieldName":"customer","values":[],"operator":"is not null"}
Combining Filters
All filters in the array are combined with AND. For example, the following returns only Marketing rows for Costco and Target:
[{"fieldName":"customer","values":["Costco","Target"],"operator":"in"},
{"fieldName":"message_type","values":["Marketing"],"operator":"="}]
To match one value OR another on the same field, put all the values in a single filter with in. Two separate filters on the same field must both be true, so the following returns no data:
[{"fieldName":"customer","values":["Costco"],"operator":"="},
{"fieldName":"customer","values":["Target"],"operator":"="}]
There is no way to combine filters on different fields with OR.
Filtering by Date Range
There is no range or between operator. To filter a date range, use two filters on the same field: a lower bound and an upper bound.
Date strings such as "2026-07-28" are read as midnight UTC. If your dates are stored at a different time of day, an inclusive upper bound (<=) can leave out the last day. To include the full last day, use < with the day after:
[{"fieldName":"Sent Date","values":["2026-07-25"],"operator":">="},
{"fieldName":"Sent Date","values":["2026-07-29"],"operator":"<"}]
This returns July 25 through July 28. You can also pass exact timestamps as epoch milliseconds, for example [1784966400000].
The = operator is the exception: "values":["2026-07-27"] with = matches the whole day, regardless of time.
The same two-filter pattern works for number ranges.
Troubleshooting
-
The dashboard is empty. A value that does not exist in the data returns no rows, with no error. Check that the value matches the data exactly, including capitalization when using
=,inor!=. -
Numbers are not filtering correctly. Make sure numeric values are unquoted:
[90000], not["90000"]. -
A date range is missing the last day. Use
<with the following day as the upper bound. See Filtering by Date Range. - The link value is not applied to a dashboard filter. If a dashboard filter has a fixed default value, it can conflict with the value passed in the link. Set the dashboard filter to Require Value and leave the default value blank.