Skip to content

HTTP API Reference

All CritterWatch HTTP endpoints are implemented using Wolverine.HTTP and mounted under /api/critterwatch/*. They are automatically mapped by UseCritterWatch().

Services

GET /api/critterwatch/services

Returns all monitored services as ServiceSummary documents.

Response: ServiceSummary[]

json
[
  {
    "id": "trip-service",
    "label": "Trip Service",
    "wolverineVersion": "5.28.0",
    "communicationUri": "amqp://trip-service",
    "tenancy": "None",
    "nodes": { ... },
    "agents": { ... },
    "messages": [ ... ],
    "messagingEndpoints": [ ... ]
  }
]

GET /api/critterwatch/services/{serviceName}

Returns a single service by name.

Response: ServiceSummary

Dead Letter Queue

POST /api/critterwatch/dead-letters/query

Query dead-lettered envelopes across services.

Request body:

json
{
  "serviceName": "trip-service",
  "tenantId": null,
  "messageType": "TripService.Messages.BookTrip",
  "exceptionType": null,
  "from": "2024-01-01T00:00:00Z",
  "to": null,
  "limit": 100
}

Response: DeadLetterEnvelope[]

POST /api/critterwatch/dead-letters/replay

Replay matching dead-lettered messages.

Request body:

json
{
  "serviceName": "trip-service",
  "tenantId": null,
  "messageType": "TripService.Messages.BookTrip",
  "limit": null
}

Response: { "replayedCount": 12 }

POST /api/critterwatch/dead-letters/discard

Permanently discard matching dead-lettered messages.

Request body: Same as replay.

Response: { "discardedCount": 12 }

POST /api/critterwatch/dead-letters/{envelopeId}/replay

Replay a single message by envelope ID.

Request body:

json
{
  "serviceName": "trip-service",
  "tenantId": null
}

POST /api/critterwatch/dead-letters/{envelopeId}/edit-replay

Edit a message body and replay.

Request body:

json
{
  "serviceName": "trip-service",
  "tenantId": null,
  "updatedBody": "{ \"tripId\": \"abc\", \"fare\": 450.00 }"
}

DELETE /api/critterwatch/dead-letters/{envelopeId}

Discard a single message.

Scheduled Messages

GET /api/critterwatch/scheduled-messages

Query scheduled messages.

Query parameters: serviceName, tenantId, messageType, from, to, status (upcoming/overdue/all)

PUT /api/critterwatch/scheduled-messages/{envelopeId}

Edit a scheduled message.

Request body:

json
{
  "serviceName": "trip-service",
  "tenantId": null,
  "updatedBody": "{ ... }",
  "newExecutionTime": "2024-06-01T12:00:00Z"
}

DELETE /api/critterwatch/scheduled-messages/{envelopeId}

Cancel a scheduled message.

Commands

POST /api/critterwatch/commands/pause-listener

Pause a listener on a service.

Request body: { "serviceName": "trip-service", "endpointName": "rabbitmq://trip-bookings" }

POST /api/critterwatch/commands/restart-listener

POST /api/critterwatch/commands/pause-all-listeners

POST /api/critterwatch/commands/restart-all-listeners

POST /api/critterwatch/commands/pause-projection

POST /api/critterwatch/commands/restart-projection

POST /api/critterwatch/commands/rebuild-projection

POST /api/critterwatch/commands/rewind-subscription

POST /api/critterwatch/commands/eject-node

POST /api/critterwatch/commands/trigger-election

POST /api/critterwatch/commands/add-tenant

POST /api/critterwatch/commands/remove-tenant

POST /api/critterwatch/commands/enable-chaos-monkey

POST /api/critterwatch/commands/disable-chaos-monkey

POST /api/critterwatch/commands/set-chaos-failure-rate

All command endpoints accept JSON bodies matching their corresponding command record types. See Inbound Commands for the full schema of each command.

Alerts

GET /api/critterwatch/alerts

Query alerts with optional filters: serviceName, status, severity, type.

POST /api/critterwatch/alerts/{alertId}/acknowledge

POST /api/critterwatch/alerts/{alertId}/snooze

POST /api/critterwatch/alerts/{alertId}/clear

Timeline

GET /api/critterwatch/timeline

Query timeline entries.

Query parameters: serviceName, category, severity, from, to, limit

Authentication

The HTTP API does not ship with built-in authentication. Add ASP.NET Core authorization middleware and use RequireAuthorization() on routes to protect the API.

Response Format

All responses use application/json. JSON serialization uses camelCase property names (via JsonNamingPolicy.CamelCase). Enums are serialized as string names.

Released under the MIT License.