Relay
1.x
Docs/Relay/Dead Letter Queue
Open

Reading1 min
Updated31 Jul 2026
Sourcev1/subsystems/dlq.mdx

The dead letter queue (DLQ) captures deliveries that have permanently failed after exhausting all retry attempts.

How entries are created01

When the retrier decides a delivery is beyond recovery (all attempts exhausted, or a non-retryable HTTP status), the engine pushes a DLQ entry with full context:

  • Original event payload

  • Endpoint URL at the time of failure

  • Error message and HTTP status from the final attempt

  • Total attempt count

Listing DLQ entries02

entries, err := r.Store().ListDLQ(ctx, dlq.ListOpts{
    TenantID:   "tenant-acme",
    EndpointID: &epID,
    Limit:      50,
})

Replay03

Replay re-enqueues a failed delivery for another round of attempts:

err := r.DLQ().Replay(ctx, dlqEntryID)

The DLQ entry is marked with ReplayedAt timestamp. A new delivery is created in pending state.

Bulk replay04

The admin API supports bulk replay via POST /dlq/replay.

DLQ service05

type Service struct { ... }

func (s *Service) Get(ctx context.Context, id id.ID) (*Entry, error)
func (s *Service) Replay(ctx context.Context, id id.ID) error
func (s *Service) PushFailed(ctx context.Context, d *delivery.Delivery, ep *endpoint.Endpoint, evt *event.Event, lastError string, lastStatusCode int) error