~netlandish/ponch-api-docs

#Polling the events feed

If your system can't receive webhooks, fetch events from the feed instead. The feed is also how you backfill: when you first connect, or after a webhook was deactivated.

#GET /integrations/events
Query param
type Required. customer.enrolled, stamp.added, reward.earned, reward.redeemed or card.voided. Anything else, including card.unvoided, returns 400
limit 1–100, default 25
since ISO-8601 timestamp. Only events with occurred_at after it (not equal to it). Without a timezone, it's read as UTC
template_slug Only events for this template
curl "https://app.getponch.com/api/integrations/events?type=stamp.added&since=2026-08-11T13:27:59.253264%2B00:00" \
  -H "Authorization: Bearer $PONCH_API_KEY"

Encode the + in a timezone offset as %2B, or use the Z form (2026-08-11T13:27:59.253264Z).

The response is a JSON array, newest first, of events in the same shape a webhook delivers. On the feed, event_id equals id.

Error When
400 Unknown type, or a since that isn't a valid timestamp

#Walking the feed

Poll each event type you care about separately:

  1. On the first poll, call without since to get the most recent events.
  2. Process the items and remember the newest occurred_at.
  3. On the next poll, pass that value as since.
  4. Deduplicate on id, as you would for webhooks.

Poll at most once a minute per connection.

A full page means you may have missed events. The feed returns the newest limit events after since, and you can't page back further. If more events than limit happened between two polls, the older ones aren't returned, and moving since forward skips them. If a poll returns exactly limit items, treat the gap as possible: poll more often, use limit=100, or switch to webhooks for a busy store. Several rewards earned by one bulk stamp share the same occurred_at, which is another reason not to set limit low.

#The feed shows current state

Feed items are built from Ponch's current records each time you ask, so they show the card as it is now, not as it was when the event happened. For example, a customer.enrolled item for a card that was later deactivated shows card.status: "voided".

A webhook payload is a snapshot taken when the event happened and never changes. Use webhooks to learn what happened at the time; use the feed to learn what's true now.

About this wiki

commit 5e140ef5493db7e98830f4b7ef4d620de5419518
Author: Peter Sanchez <peter@netlandish.com>
Date:   2026-10-20T06:45:49-06:00

add proper title and descriptions to each page
Clone this wiki ("main" branch)
https://git.code.netlandish.com/~netlandish/ponch-api-docs (read-only)
git@git.code.netlandish.com:~netlandish/ponch-api-docs (read/write)