Webhooks & events
Events (polling)
The pull-based twin of webhooks. Every event the account could receive by webhook is also readable from a feed.
How it works
-
Each row is the webhook envelope plus
eventId, minusnotifiedAt, and with no signature headers (it is a pull). -
Rows come in the collection envelope
{ data, nextCursor, hasMore }, oldest first, up tolimit(max 100).nextCursoris the last row'seventId; pass it asafteron the next poll and keep polling whilehasMoreis true. - An unknown or retention-expired cursor returns 400 with a "restart without it" detail, never a silently empty page.
- The feed spans the 90-day retention window.
- Synthetic test-fires never appear here.
Poll the event feed
GET
/v1/events 200 OK
x-api-key
Every event the account could receive via webhook, oldest first, in the collection envelope. nextCursor is the last row's eventId; pass it as after on the next poll. Bounded by the 90-day retention window. An unknown or retention-expired cursor → 400; restart without it. Synthetic test-fires never appear here.
| Parameter | Type | Required | Notes |
|---|---|---|---|
after | string | Optional | An eventId from a previous page's nextCursor. |
limit | integer | Optional | 1–100, default 100. |
curl "https://platform.getproperly.com/v1/events?after=evt_2mNpR4sS&limit=100" \
-H "x-api-key: $PROPERLY_API_KEY" {
"data": [
{
"eventId": "evt_2mNpR4sT",
"clientRequestId": "aB3xY9…",
"apiRequestId": "kQ7Lm2…",
"targetAccountId": "oU8C9LsuBw",
"createdAt": "2026-09-16T10:15:04.000Z",
"eventName": "jobRequest.completed",
"results": [ { "jobRequestId": "jr_5TzK…", "…": "…" } ]
}
],
"nextCursor": "evt_2mNpR4sT",
"hasMore": false
} Use cases
- Infrastructure that cannot accept inbound HTTPS: poll instead of using webhooks.
- Backfill after your webhook receiver was down.
- Sanity-checking what you missed.