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[]
[
{
"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:
{
"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:
{
"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:
{
"serviceName": "trip-service",
"tenantId": null
}POST /api/critterwatch/dead-letters/{envelopeId}/edit-replay
Edit a message body and replay.
Request body:
{
"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:
{
"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.
