Search

Filter Repost bucket and forwarder history with field clauses, ranges, boolean operators, and JSON-path queries to find any webhook event.

History search filters the current bucket or forwarder history view. You write a query using field clauses, range expressions, and boolean operators, and Repost narrows the event list to only the rows that match. The same query language works in both bucket event history and forwarder history. Learn it once and apply it everywhere.

How the query works

The page supplies the scope. Bucket history searches one bucket; forwarder history searches one forwarder inside that bucket. Your query narrows the rows within that scope.

Empty query

Shows every row in the selected time window. A blank query or a comment-only query is treated as empty.

Field clause

Narrows rows to those matching a specific field value, such as method:POST or status:FAILED.

Time window

The date picker limits the retained history window used by both the list and the timeline histogram.

Organisation, bucket, and forwarder scope is applied by the page before your query runs. Adding a bucket_id or forwarder_id clause can narrow results further, but it cannot expand the view beyond the currently selected scope.

Press Cmd + Enter on macOS or Ctrl + Enter on Windows and Linux to run the query. Keep shared queries under 10 240 characters: live tail, timeline histograms, and broad replay actions enforce that limit.

Field clauses

A clause takes the form field:value. Field names use lowercase or snake_case. Enum values such as delivery statuses are uppercase. Quote string values that contain spaces, punctuation, or URL characters.

Bucket event history fields

Use these fields when searching inbound webhooks in bucket history.

FieldDescriptionExample
event_idRepost event identifierevent_id:"evt_..."
received_atTime Repost received the webhookreceived_at:[2024-06-01T00:00:00Z TO *]
methodIncoming HTTP methodmethod:POST
path_originalPath the provider calledpath_original:"/webhooks/stripe"
received_domainDomain that received the requestreceived_domain:"hooks.example.com"
query_stringRaw URL query stringquery_string:"account=live"
statusEvent processing status: RECEIVED, PROCESSING, COMPLETED, FAILEDstatus:COMPLETED
duration_msEnd-to-end event processing duration in millisecondsduration_ms:[1000 TO *]
response.statusHTTP status code returned to the senderresponse.status:200
response_statusSame status code as a top-level numeric fieldresponse_status:[500 TO 599]
source_ipIP address of the sendersource_ip:"203.0.113.42"
request.bodyRaw request body textrequest.body:invoice
request.content_typeIncoming content typerequest.content_type:"application/json"
request.size_bytesIncoming request size in bytesrequest.size_bytes:[1000 TO *]
request.body_json.*JSON request payload fields (dot-notation)request.body_json.type:"invoice.paid"
response.bodyRaw response body textresponse.body:accepted
response.body_json.*JSON response payload fieldsresponse.body_json.received:true

Forwarder history fields

Use these fields when searching delivery attempts in forwarder history.

FieldDescriptionExample
forward_idDelivery attempt identifierforward_id:"fwd_..."
event_idEvent that created the deliveryevent_id:"evt_..."
received_atTime Repost received the originating webhookreceived_at:[2024-06-01T00:00:00Z TO *]
statusDelivery state: PENDING, IN_PROGRESS, SUCCESS, FAILED, RETRYING, SCHEDULED, USER_SKIPPEDstatus:FAILED
target_statusDestination HTTP response status codetarget_status:504
error_codeMachine-readable failure codeerror_code:TIMEOUT
error_messageFailure detail texterror_message:"connection refused"
target_urlDestination URLtarget_url:"https://api.example.com/webhooks"
methodForwarded HTTP methodmethod:POST
pathOriginal request pathpath:"/webhooks/stripe"
attemptCurrent attempt numberattempt:[2 TO *]
max_attemptsConfigured attempt ceilingmax_attempts:3
forward_typeDelivery category: ATTEMPT or REPLAYforward_type:ATTEMPT
replay_job_idReplay job that created this attemptreplay_job_id:"rj_..."
duration_msEnd-to-end delivery duration in millisecondsduration_ms:[1000 TO *]
transform_duration_msFunction transform duration in millisecondstransform_duration_ms:[50 TO *]
request.body_json.*Forwarded request JSON payload fieldsrequest.body_json.customer.id:"cus_123"
response.body_json.*Destination response JSON payload fieldsresponse.body_json.ok:false

Ranges

Use range syntax to filter numeric and time fields. Square brackets [ ] include the endpoints; curly braces { } exclude them. Use * for an open-ended boundary.

received_at:[2024-06-01T00:00:00Z TO 2024-06-02T00:00:00Z]
target_status:[500 TO 599]
attempt:[2 TO *]
duration_ms:{1000 TO *}

Use whole-second UTC timestamps for time fields. In bucket history, a typed received_at clause takes priority when the page loads from a deep link. Selecting a date picker or timeline range replaces that clause.

Boolean operators and grouping

Combine clauses with AND, OR, and NOT. Use parentheses to make precedence explicit when mixing operators.

(method:POST OR method:PUT)
AND response.status:[200 TO 299]
AND NOT path:"/health"
AND

Returns rows that match both sides. Use AND as the default when you want to narrow results with each additional clause.

OR

Returns rows that match either side. Always wrap OR expressions in parentheses when you mix them with AND or NOT.

NOT

Excludes rows that match the following clause. In multiline queries, writing AND NOT field:value on its own line is the clearest pattern.

Comments

Lines beginning with // are ignored by the query engine. Press Cmd + / on macOS or Ctrl + / on Windows and Linux to toggle comments in the editor. Inline // text after a value is treated as part of the value, not a comment.

JSON path queries

You can search directly into request and response payloads using dot-notation paths. The editor suggests paths and values from rows already loaded in the current page.

request.body_json.customer.id:"cus_123"
AND response.body_json.ok:true
Scalar values

Strings, finite numbers, booleans, and null are all searchable. Objects are containers: search the nested scalar fields inside them.

Array values

Omit numeric indexes when searching arrays. Search the scalar value at the shared array field path and Repost matches any element.

Suggested paths

Autocomplete suggestions come from rows already loaded in the page. A missing suggestion does not mean a field is invalid. Type valid paths manually when they have not appeared in loaded rows yet.

Example queries

// All successful POST events
method:POST
AND response.status:200
 
// Stripe subscription cancellations
request.body_json.type:"customer.subscription.deleted"
 
// One-day window
received_at:[2024-06-01T00:00:00Z TO 2024-06-02T00:00:00Z]
 
// Exclude GET requests
NOT method:GET
 
// Large payloads that took over a second
request.size_bytes:[10000 TO *]
AND duration_ms:[1000 TO *]

A query with invalid syntax returns an empty result set in historical mode. In live tail, a syntax error shows a query error and turns off live streaming. Remove the last clause or test one clause at a time to isolate the problem.

Build queries from the detail drawer

You do not have to type every clause by hand. The detail drawer gives you a shortcut for any scalar value you can see.

1
Open an event or forward detail

Click any row in bucket or forwarder history to open the detail drawer.

2
Hover a scalar JSON value

Hover over any string, number, boolean, or null value in the payload viewer. A small action menu appears.

3
Include, exclude, or copy

Choose Include to add a matching clause, Exclude to add a NOT clause, or Copy to place the raw value on your clipboard. Repost inserts the clause into the query editor and runs it immediately.

4
Combine with manual clauses

Detail actions replace an existing simple clause for the same field. Manually authored multi-clause lines are preserved so your existing query is not overwritten.

Add custom columns from frequently queried JSON paths so the values you filter on are visible directly in the table without opening every row.