HTTP API Reference
All CritterWatch HTTP endpoints are implemented using Wolverine.HTTP and mounted under /api/critterwatch/*. They are automatically mapped by UseCritterWatch().
Bus-only queries don't appear here
The on-demand lookups for endpoint configuration, handler properties, handler source code, and HTTP-chain OpenAPI are bus queries, not HTTP endpoints — they go from the CritterWatch console to the monitored service over the message bus and the response comes back the same way. They live on the Inbound Commands page (RequestEndpointProperties, RequestMessageHandlerProperties, RequestHandlerSourceCode, RequestHttpChainOpenApi). If you're looking for an HTTP equivalent, there isn't one — invoke the matching command record over your transport.
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
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.
