GET /logs queries the DuckDB read model for captured webhook events. You can filter by almost any field, paginate with offsets or cursors, sort by multiple columns, and request sparse field sets. Two sub-endpoints let you fetch a single event by ID or retrieve its raw payload.
Authentication: Required when authKey is configured.
Query parameters
string
Exact log ID filter.
string
Exact webhook ID filter.
string
Partial match against the stored request URL.
string
Exact HTTP method, normalized to uppercase (e.g.
POST, GET).number
Exact status code or range syntax. Example:
statusCode[gte]=400.string
Partial match against the stored content type.
string
Exact request ID filter.
string
Exact IP address or CIDR block.
string
Partial match against the user agent string.
boolean
Filter by signature verification result (
true or false).string
Exact signature provider name (e.g.
stripe, github).number
Exact or ranged server-side processing time in milliseconds. Excludes any configured
responseDelayMs. Example: processingTime[lt]=1000.number
Exact or ranged payload size in bytes. Example:
size[gte]=1024.string
Exact or ranged ISO 8601 timestamp. Example:
timestamp[lte]=2026-01-30T12:00:00.000Z.string
Convenience lower bound for timestamp filtering. Equivalent to
timestamp[gte].string
Convenience upper bound for timestamp filtering. Equivalent to
timestamp[lte].string
Substring search over serialized headers, or keyed JSON filtering. Example:
headers[x-request-id]=abc.string
Substring search over query string JSON, or keyed filtering. Example:
query[page]=2.string
Substring search over body JSON, or keyed filtering. Example:
body[event]=payment.success. Nested paths use dot notation: body[data.id]=evt_123.string
Substring search over response header JSON, or keyed filtering.
string
Substring search over response body JSON, or keyed filtering.
number
default:"10000"
Maximum number of results to return. Invalid values are clamped to a minimum of
1.number
default:"0"
Zero-based offset for traditional pagination.
string
Cursor for keyset pagination. When present, takes precedence over
offset. Use the nextCursor value from a previous response.string
default:"timestamp:DESC"
Comma-separated sort rules. Example:
timestamp:desc,method:asc.Filter syntax
Range filters use bracket notation:gte, gt, lte, lt.
Keyed JSON filters match a specific field inside a stored JSON column:
Supported sort fields
id, statusCode, method, size, timestamp, remoteIp, processingTime, webhookId, userAgent, requestUrl, contentType, requestId, signatureValid, signatureProvider, signatureError
Offset pagination response
Cursor pagination
When you pass acursor value, the response returns nextCursor and nextPageUrl instead of total and nextOffset. Cursor pagination is more efficient for large datasets because it avoids a full COUNT(*) query.
GET /logs/:logId
Returns a single log entry by ID. Authentication: Required whenauthKey is configured.
Query parameters
string
Optional comma-separated list of fields to include in the response for a sparse result. If you request sparse fields, the handler still fetches
webhookId internally for security validation and strips it from the response if you did not explicitly request it.Response example
If the webhook associated with this log has expired or is no longer valid, the route returns
404 even when the log row still exists in DuckDB.GET /logs/:logId/payload
Returns the original payload for a log entry. If the payload was offloaded to Apify KVS due to its size, this route hydrates it on demand. Authentication: Required whenauthKey is configured.
The response Content-Type mirrors the original captured content type when available. The route returns:
- JSON when the stored payload is an object
- Raw text when the stored payload is scalar text
- Raw binary when the hydrated KVS value is a
Buffer