
List Origin webhook deliveries via the API
List webhook deliveries for the authenticated app with GET https://api.cursor.com/v1/origin/app/webhook/deliveries, newest first. Official reference: Origin API → List Webhook Deliveries.
Origin is in Early Beta and subject to change. Authenticate with an app JWT. A delivery is one event owed to one app; its id is the webhook-id header value the receiver sees — use it as the idempotency key. Availability: Early Beta per the API overview.
Deliveries are listable for seven days after creation, and only while your app has an active installation in the delivery's namespace. App-targeted lifecycle events such as installation.deleted stay visible after the uninstall they describe.
delivered=false is the recovery predicate: it selects every delivery that has never received a 2xx, including deliveries whose retry ladder ran out during an outage. Prefer that server-side filter over a caller-supplied time window when recovering missed events.
Query parameters
| Param | Required | Meaning |
|---|---|---|
delivered |
no | Compares against deliveredAt. delivered=false selects undelivered deliveries for recovery. |
eventType |
no | Exact event type, e.g. pull_request.created. |
installationId |
no | Narrow to one installation. |
createdAfter |
no | Bound creation time (browsing, not recovery). |
createdBefore |
no | Bound creation time (browsing, not recovery). |
pageSize |
no | Defaults to 30 when unset or 0. Values above 100 are clamped to 100. |
pageToken |
no | Opaque cursor from a previous nextPageToken. |
curl --request GET \
--url 'https://api.cursor.com/v1/origin/app/webhook/deliveries?delivered=false&pageSize=50' \
--header 'Authorization: Bearer YOUR_APP_JWT'
Response fields
| Field | Meaning |
|---|---|
deliveries |
Webhook deliveries, newest first. |
deliveries[].id |
Stable delivery ID and the webhook-id the receiver saw. |
deliveries[].event.id |
Underlying Origin event identifier (not the idempotency key). |
deliveries[].event.type |
Event slug for routing. |
deliveries[].installation.id |
Current active installation for the target owner; unset when none exists (possible for app-targeted lifecycle events after uninstall). |
deliveries[].installation.target |
Owner targeted by the installation. |
deliveries[].createdAt |
Delivery creation timestamp. |
deliveries[].deliveredAt |
Set when the receiver acknowledged with 2xx. Absence corresponds to delivered=false. |
deliveries[].lastAttempt |
Most recent HTTP attempt: status, latency, transport error, trigger (automatic or manual), and time. |
nextPageToken |
Opaque cursor for the next page; empty when done. |
Example:
{
"deliveries": [
{
"id": "whd_01k2ja2000e0080000000000j9",
"event": {
"id": "evt_01k2ja2000e0080000000000r5",
"type": "pull_request.created"
},
"installation": {
"id": "inst_01k2ja2000e0080000000000b2",
"target": {
"slug": "acme",
"id": "ns_01k2ja2000e0080000000000p3",
"type": "team"
}
},
"createdAt": "2026-08-01T09:30:00Z",
"deliveredAt": "2026-08-02T14:45:05Z",
"lastAttempt": {
"id": "wha_01k2ja2000e0080000000000k0",
"deliveryId": "whd_01k2ja2000e0080000000000j9",
"trigger": "automatic",
"responseStatusCode": 200,
"latencyMs": 182,
"attemptedAt": "2026-08-02T14:45:05Z"
}
}
]
}
Verify webhook signatures against the raw request body before parsing. Deduplicate with webhook-id and process asynchronously after returning 2xx.
To resend failed deliveries, use Batch Redeliver Webhook Deliveries. To verify a receiver during setup without waiting for a real event, use Ping Webhook.
Base URL: https://api.cursor.com/v1/origin.