GET /v1/events
Returns events, together with any retractions in the same window.
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://api.docsignal.app/v1/events?domains=linear.app,vercel.com&observed_since=2026-07-01"
Parameters
| Parameter | Type | Meaning |
|---|---|---|
domains | comma-separated | Companies to include, by domain. Defaults to every company your token allows. |
observed_since | YYYY-MM-DD | Only events detected on or after this date. |
observed_until | YYYY-MM-DD | Only events detected on or before this date. |
shipped_since | YYYY-MM-DD | Only events the vendor shipped on or after this date. |
shipped_until | YYYY-MM-DD | Only events the vendor shipped on or before this date. |
origin | observed, backfilled, all | Whether to include history reconstructed from archives. Defaults to all. |
limit | 1–1000 | Page size. Defaults to 100. |
offset | integer | Rows to skip. Defaults to 0. |
If you supply no date window at all, observed_since defaults to 30 days ago.
Supplying any ship-date filter disables that default.
Response
{
"events": [ "..." ],
"retractions": [ "..." ],
"has_more": true,
"query": {
"domains": ["linear.app"],
"observed_since": "2026-07-01",
"observed_until": null,
"shipped_since": null,
"shipped_until": null,
"origin": "all",
"limit": 100,
"offset": 0
}
}
The query block echoes the filter that was actually applied, including any
defaults filled in for you.
Paging
Page with limit and offset. Ordering is stable across requests and across
rebuilds, so an offset means the same thing tomorrow. Continue while has_more
is true.
The event shape
Each event names one change and carries the evidence it was derived from.
{
"id": "evt_01KY4ESMC6P3X336MRW17MMTBR",
"domain": "vercel.com",
"product": "vercel",
"type": "capability_expanded",
"area": "developer-experience",
"title": "Python function bundles now include precompiled bytecode",
"summary": "Vercel now precompiles Python function bundles to bytecode as part of the build, reducing per-invocation compilation overhead and cold-start latency for Python runtime functions. Corroborated by the @vercel/python@6.51.1 package release published the following day.",
"shipped_at": "2026-07-21",
"observed_at": "2026-07-22T08:19:31Z",
"origin": "observed",
"confidence": "high",
"evidence": {
"source_kind": "changelog",
"excerpt": "## Python function bundles now include precompiled bytecode"
},
"payload": {
"capability_slug": "function-runtimes",
"change": "Python function bundles now ship with precompiled bytecode, reducing cold-start compilation time."
}
}
| Field | Meaning |
|---|---|
id | Stable and unique. Safe to use for deduplication on your side. |
domain | The company, matching what you passed in domains. |
product | The product within that company, where a company ships more than one. |
type | What kind of change it is. |
area | A functional area shared across companies, so the same concept is comparable between vendors. |
title | One line naming the change. |
summary | What changed, and how we corroborated it. |
origin | observed for changes we detected live, backfilled for history reconstructed from archives. |
confidence | high, medium or low. |
evidence | The source kind and the excerpt the event came from, so a claim can be checked rather than trusted. |
payload | Fields specific to the event type. |
Event types
Common types include capability_added, capability_expanded,
capability_removed, feature_added, feature_removed, feature_tier_change,
price_change, limit_change, endpoint_added, new_integration and
model_release.
Treat the set as open. Filter on the types you care about rather than assuming this list is exhaustive.
Payloads carry the change structurally
A tier change records the movement, which makes questions like "what did competitors just un-gate" answerable directly:
{
"feature": "Devin Outposts",
"from_tiers": ["dedicated-tenant"],
"to_tiers": ["pro", "max", "teams", "dedicated-tenant"],
"direction": "opened_down"
}
A limit change records both sides, including a limit that was withdrawn rather than altered:
{
"limit": "copilot_5hr_tokens",
"old": "launch:50000, scale:2000000, max:4000000, enterprise:25000000",
"new": null,
"unit": "tokens/5h"
}
Ship date and observed date
Every event carries both dates, and they answer different questions.
observed_atis when we detected the change. This is the filter for staying current.shipped_atis when the vendor shipped it, where the source states a date. This is the filter for analysing a period.
The two diverge, sometimes by weeks. OpenAI's Codex Security plugin shipped on 4 June 2026 and appeared in the documentation on 28 July 2026. Combining the filters queries that gap directly:
curl -H "Authorization: Bearer YOUR_TOKEN" \
"https://api.docsignal.app/v1/events?observed_since=2026-07-01&shipped_until=2026-06-30"
Not every event reports a ship date. We know when we saw a change; the source does not always say when it shipped.