Analytics & stats
All stats endpoints require viewer+ role, are scoped to a workspace, and require a Pro or Agency plan. Free plan workspaces receive a 402 error.
Filtering
All stats endpoints accept optional query parameters to filter results:
| Param | Type | Default | Description |
|---|---|---|---|
link | string | - | Filter by link ID |
country | string | - | Filter by country code |
browser | string | - | Filter by browser name |
os | string | - | Filter by operating system |
device | string | - | Filter by device type |
referer | string | - | Filter by referrer |
surveyed | string | - | Filter by survey response status. Use 1 to show only clicks where the visitor answered a micro-survey. |
survey_option | string | - | Filter by survey answer option index (0, 1, 2, 3). Combine with link to analyze a specific survey’s answer distribution. |
include_bots | boolean | false | Include bot/crawler traffic in results |
By default, bot traffic is excluded from all stats. Pass include_bots=true to include clicks from bots, crawlers, and automated tools.
curl "https://nobsredir.com/api/workspaces/ws_abc123/stats/summary?include_bots=true" \ -H "X-API-Key: nobs_your_key"Tag-level aggregated analytics are available via the tag analytics endpoints below.
Custom date range
All stats endpoints accept optional from and to parameters to query a specific date range. Both must be provided together in YYYY-MM-DD format.
| Param | Type | Description |
|---|---|---|
from | string | Start date (inclusive), e.g. 2026-01-01 |
to | string | End date (inclusive), e.g. 2026-01-31 |
When from and to are provided, they override the days parameter. If omitted, the default days behavior applies.
Validation rules:
- Both
fromandtomust be validYYYY-MM-DDdates frommust be on or beforetotomust not be in the future- The range must not exceed 365 days
- If any rule is violated, the parameters are ignored and the default
daysbehavior is used
# Get daily clicks for January 2026curl "https://nobsredir.com/api/workspaces/ws_abc123/stats/daily?from=2026-01-01&to=2026-01-31" \ -H "X-API-Key: nobs_your_key"
# Combine with other filterscurl "https://nobsredir.com/api/workspaces/ws_abc123/stats/countries?from=2026-01-01&to=2026-01-31&link=lnk_xyz" \ -H "X-API-Key: nobs_your_key"GET /workspaces/:wsId/stats/summary
High-level numbers for the workspace.
curl https://nobsredir.com/api/workspaces/ws_abc123/stats/summary \ -H "X-API-Key: nobs_your_key"Response 200:
{ "total_links": 142, "total_clicks": 8930, "total_countries": 34, "today_clicks": 127}GET /workspaces/:wsId/stats/daily
Daily click counts over a time window.
curl "https://nobsredir.com/api/workspaces/ws_abc123/stats/daily?days=7" \ -H "X-API-Key: nobs_your_key"Query:
| Param | Type | Default | Description |
|---|---|---|---|
days | int | 30 | Number of days to look back |
from | string | - | Start date (YYYY-MM-DD), overrides days |
to | string | - | End date (YYYY-MM-DD), overrides days |
Response 200:
{ "daily": [ {"date": "2025-01-14", "clicks": 45, "bot_clicks": 3}, {"date": "2025-01-15", "clicks": 62, "bot_clicks": 8}, {"date": "2025-01-16", "clicks": 38, "bot_clicks": 2} ]}The clicks field contains human-only clicks. The bot_clicks field contains bot/crawler clicks. These are always returned separately regardless of the include_bots parameter.
GET /workspaces/:wsId/stats/countries
Click breakdown by country code.
curl "https://nobsredir.com/api/workspaces/ws_abc123/stats/countries?limit=5" \ -H "X-API-Key: nobs_your_key"Query:
| Param | Type | Default | Description |
|---|---|---|---|
limit | int | 20 | Max countries to return |
Response 200:
{ "countries": [ {"country": "US", "clicks": 3200}, {"country": "DE", "clicks": 890}, {"country": "GB", "clicks": 650} ]}GET /workspaces/:wsId/stats/referrers
Click breakdown by referrer.
curl "https://nobsredir.com/api/workspaces/ws_abc123/stats/referrers?limit=10" \ -H "X-API-Key: nobs_your_key"Query:
| Param | Type | Default | Description |
|---|---|---|---|
limit | int | 20 | Max referrers to return |
Response 200:
{ "referrers": [ {"referer": "https://twitter.com", "clicks": 1200}, {"referer": "https://linkedin.com", "clicks": 890} ]}GET /workspaces/:wsId/stats/hourly
Click breakdown by hour of day (0-23, UTC).
curl https://nobsredir.com/api/workspaces/ws_abc123/stats/hourly \ -H "X-API-Key: nobs_your_key"Response 200:
{ "hourly": [ {"hour": 0, "clicks": 12}, {"hour": 1, "clicks": 8}, {"hour": 14, "clicks": 245} ]}GET /workspaces/:wsId/stats/links/:linkId
Stats for a single link. Includes total clicks, daily breakdown (last 30 days), top countries, and top referrers.
curl https://nobsredir.com/api/workspaces/ws_abc123/stats/links/lnk_xyz789 \ -H "X-API-Key: nobs_your_key"Response 200:
{ "total_clicks": 342, "daily": [ {"date": "2025-01-14", "clicks": 15}, {"date": "2025-01-15", "clicks": 22} ], "countries": [ {"country": "US", "clicks": 180}, {"country": "DE", "clicks": 45} ], "referrers": [ {"referer": "https://twitter.com", "clicks": 90} ]}Errors: 404 - Link not found.
GET /workspaces/:wsId/stats/tags/:tagName
Aggregated analytics across all links with the same tag.
Combined analytics for all links with the specified tag. Requires Pro plan or higher.
curl https://nobsredir.com/api/workspaces/ws_abc123/stats/tags/black-friday \ -H "X-API-Key: nobs_your_key"Query:
| Param | Type | Default | Description |
|---|---|---|---|
days | int | 30 | Number of days to look back |
Response 200:
{ "tag": { "name": "black-friday", "color": "#ff0000", "description": "Black Friday 2026 campaign", "date_from": "2026-11-25", "date_to": "2026-11-30" }, "total_links": 12, "total_clicks": 4520, "daily": [ {"date": "2026-02-20", "clicks": 150, "bot_clicks": 5} ], "countries": [ {"country": "US", "clicks": 2100} ], "referrers": [ {"referer": "https://twitter.com", "clicks": 800} ], "hourly": [ {"hour": 14, "clicks": 320} ]}Errors: 402 - Requires Pro plan or higher. 404 - Tag not found or has no links.
GET /workspaces/:wsId/stats/tags/compare
Side-by-side daily click comparison between two tags. Requires Team plan or higher.
curl "https://nobsredir.com/api/workspaces/ws_abc123/stats/tags/compare?tags=campaign-a,campaign-b" \ -H "X-API-Key: nobs_your_key"Query:
| Param | Type | Required | Description |
|---|---|---|---|
tags | string | yes | Comma-separated, exactly 2 tag names |
days | int | 30 | Number of days to look back |
Response 200:
{ "tag1": { "name": "campaign-a", "daily": [ {"date": "2026-02-20", "clicks": 100, "bot_clicks": 2} ] }, "tag2": { "name": "campaign-b", "daily": [ {"date": "2026-02-20", "clicks": 75, "bot_clicks": 1} ] }}Errors: 400 - Missing tags parameter or not exactly 2 tags. 402 - Requires Team plan or higher. 404 - One of the tags not found or has no links.
GET /workspaces/:wsId/stats/rollup
Agency-only. Aggregated stats across all client workspaces under the current workspace.
curl https://nobsredir.com/api/workspaces/ws_abc123/stats/rollup \ -H "X-API-Key: nobs_your_key"Response 200:
{ "clients": [ { "id": "ws_client1", "name": "Client A", "slug": "client-a", "total_links": 50, "total_clicks": 3200 }, { "id": "ws_client2", "name": "Client B", "slug": "client-b", "total_links": 30, "total_clicks": 1800 } ]}Returns an empty array if no client workspaces exist.