GET /v1/statistics/timeseries
The number of CVEs published over a period, bucketed at the granularity you choose. Unlike project statistics, these figures cover the entire CVE database and depend on neither your stack nor your alerts.
The data comes from pre-aggregated views: a twenty-year window costs the same as a one-week window.
Required scope: stats-global
Request
Section titled “Request”GET /api/v1/statistics/timeseriesAuthorization: Bearer twa_your_key_hereQuery parameters
Section titled “Query parameters”| Parameter | Type | Default | Description |
|---|---|---|---|
granularity |
string |
month |
day, week, month, quarter, year |
axis |
string |
published |
published = publication date; kev = date added to the CISA KEV catalog |
period |
string |
— | Window shorthand: 2026, 2026-Q1, 2026-03, 2026-W12, 2026-03-15 |
from |
date |
1999-01-01 |
Start bound (YYYY-MM-DD), ignored when period is set |
to |
date |
tomorrow | End bound, ignored when period is set |
axis=kev is a separate axis from publication: a CVE published in 2017 can enter the KEV catalog in 2026. It then counts in 2017 on the published axis, and in 2026 on the kev axis.
The from and to values in the response are the bounds actually applied: every window is clamped between 1999-01-01 and one year into the future.
Response 200 OK
Section titled “Response 200 OK”{ "axis": "published", "granularity": "month", "from": "2026-01-01", "to": "2026-03-31", "count": 3, "points": [ { "period": "2026-01-01", "total": 4312, "critical": 388, "high": 1247, "medium": 1980, "low": 402, "unscored": 295, "kev": 14, "poc": 611, "avg_cvss": 6.84, "avg_epss": 3.127, "pct_critical_high": 37.9 } ]}Point fields
Section titled “Point fields”| Field | Type | Description |
|---|---|---|
period |
date |
First day of the bucket |
total |
integer |
CVEs published in the bucket |
critical high medium low |
integer |
Breakdown by severity |
unscored |
integer |
Severity NONE or UNKNOWN |
kev |
integer |
CVEs from the bucket present in the KEV catalog |
poc |
integer |
CVEs with at least one known public PoC |
avg_cvss |
float|null |
Mean CVSS score, null when nothing is scored |
avg_epss |
float|null |
Mean EPSS score, as a percentage (stored internally as a 0–1 probability) |
pct_critical_high |
float |
Share of CRITICAL + HIGH in the total |
On axis=kev, only total, critical, high and poc are returned.
Errors
Section titled “Errors”| Code | Detail | Cause |
|---|---|---|
422 |
Granularité inconnue… |
Value outside the allowed list |
422 |
Période « … » non reconnue |
Invalid period format |
422 |
La borne de début est postérieure à la borne de fin. |
from > to |
Discovering accepted values
Section titled “Discovering accepted values”GET /api/v1/statistics/catalog returns the available granularities, dimensions, metrics and period formats. Useful for building a UI without hard-coding those lists.
Example
Section titled “Example”Weekly volume for 2026, and the three busiest weeks:
curl -s \ -H "Authorization: Bearer twa_your_key_here" \ "https://app.techwatchalert.com/api/v1/statistics/timeseries?granularity=week&period=2026" \ | jq '.points | sort_by(-.total) | .[0:3] | map({week: .period, total, critical})'