Observability
Two log levels, queryable over the API, retained per plan.
Stacklink records everything at two linked levels:
| Level | Records | Linked by |
|---|---|---|
platform_request_logs | Every /v1/* API call — method, route, status, duration, project, API key, tenant, session, provider, tool, sanitized request, response summary, error summary. | — |
tool_execution_logs | Every model-callable tool execution. | request_log_id → the originating request log |
Headers and known credential fields are redacted before logging. Full provider responses and generated API keys are never copied into request logs — they stay on the proper execution, artifact, or key surfaces.
Query the logs
All under scope logs:read, with limit (1–100, default 50), cursor, from/to filters:
| Route | Extra filters |
|---|---|
GET /v1/logs/summary | — (counts across all log types) |
GET /v1/logs/requests · /:id | tenantId, sessionId, providerKey, toolKey, requestId, apiKeyId, route, status |
GET /v1/logs/tools · /:id | tenantId, sessionId, accountId, requestLogId, toolKey, status |
GET /v1/logs/triggers · /:id | tenantId, accountId, providerKey, eventScope, eventType, externalEventId, status |
GET /v1/logs/webhook-deliveries · /:id | deliveryId, rawEventId, subscriptionId, status, … |
const summary = await stacklink.logs.summary();
const failures = await stacklink.logs.listTools({ status: 'failed', limit: 20 });
const detail = await stacklink.logs.getTool(failures.logs[0].id);The same surface is agent-readable over MCP as PLATFORM_QUERY_LOGS and
PLATFORM_GET_EXECUTION_DETAILS (redacted).
Full observability from day one
Every plan gets the complete two-level log surface — the free plan keeps 30 days of history, and reading logs is included in your 20,000 monthly standard ops.
Retention
Logs are retained per the workspace's plan — 30/60/90/180/365 days — and purged by a background worker across execution events, workbench logs, tool and batch logs, request logs, webhook deliveries, and raw provider events. Webhook deliveries can be replayed or redriven from the dead-letter queue before they age out (see Webhooks).