Guides
Request logs
Every call your API keys make is recorded, with its status, latency and error code. When something is failing you can see what we saw, rather than guessing from a status code.
- For
- Anyone debugging a call that did not do what they expected
- You will need
- An API key with the logs scope
- About
- 4 minutes to read
Reading the log
curl "https://api.integrable.cloud/api/logs?limit=20" \
-H "Authorization: Bearer $INTEGRABLE_API_KEY"{
"items": [
{
"id": "01a0670f-...",
"request_id": "7cb7f7862a82425d8e4c3fb8a497dfe6",
"method": "POST",
"path": "/bots/{bot_id}/knowledge",
"status_code": 402,
"duration_ms": 118,
"error_code": "quota_exceeded",
"ip": "203.0.113.24",
"user_agent": "integrable-cloud-python/0.1.0",
"idempotency_replayed": false,
"created_at": "2026-09-03T14:22:09.481Z",
"api_key_id": "01a0654a-...",
"api_key_name": "CRM sync"
}
],
"has_more": true,
"next_cursor": "eyJrIjoiMjAyNi0wOS0wM1QxNDoyMjowOVoi..."
}Newest first, cursor-paginated. Follow next_cursor — there is deliberately no total, because counting this table exactly means scanning the fastest-growing thing your workspace owns to produce a number nobody acts on.
The lookup to use when something breaks
Every API response carries an X-Request-ID. Feed it back and you get that exact call:
curl "https://api.integrable.cloud/api/logs?request_id=$REQUEST_ID" \
-H "Authorization: Bearer $INTEGRABLE_API_KEY"This is also what to quote at support — we look up the same row, so there is no round of “can you reproduce it”.
Filters
| Parameter | Does |
|---|---|
| status_class | 2xx, 3xx, 4xx, 5xx, or errors for everything ≥ 400 |
| api_key_id | One key — what is this integration actually doing |
| method | GET, POST, PATCH, DELETE |
| path_contains | Substring of the path, e.g. knowledge |
| request_id | One exact call |
| since_hours | How far back to look, up to 90 days |
| limit / cursor | Page size (max 200) and where to continue |
4xx and 5xx are worth separating rather than filtering on errors: a 4xx is something your client sent, a 5xx is ours.
The summary
curl "https://api.integrable.cloud/api/logs/summary?hours=24" \
-H "Authorization: Bearer $INTEGRABLE_API_KEY"{
"requests": 1842,
"errors": 37,
"server_errors": 2,
"rate_limited": 11,
"replays": 4,
"keys_used": 3,
"avg_ms": 96,
"p95_ms": 412,
"error_rate": 0.0201,
"window_hours": 24,
"endpoints": [
{ "method": "GET", "path": "/bots/{bot_id}/conversations",
"requests": 1204, "errors": 3, "avg_ms": 88 }
]
}p95_ms alongside the mean on purpose: a mean hides exactly the case you are debugging, which is a call that is usually fast and occasionally is not.
rate_limited is the one to watch in a batch job. If it is climbing, read the RateLimit-* headers and slow down — see rate limits.
What is and is not recorded
- Only API-key traffic. Requests made by the dashboard are not logged — they are not your integration, and logging them would bury the rows you came here to find.
- No bodies, ever. Not the request, not the response. On a failure the machine-readable
error_codeis stored but never the message, because a message can quote your own data back. - The templated path (
/bots/{bot_id}), not the concrete one. The specific id is in the call you made; the pattern is what makes “which endpoint is slow” answerable.
Retention
| Plan | Kept for |
|---|---|
| Free | 1 day |
| Starter | 7 days |
| Pro | 30 days |
| Business | 90 days |
| Enterprise | 1 year |
Export anything you need to keep longer — the log is for debugging, not an archive.
Access
Reading the log requires an admin seat. It names every endpoint your integrations touch and the addresses they call from, which is closer to how your systems are wired than to ordinary workspace data.
Something here wrong or missing? Tell us — the documentation and the API are maintained by the same person, so a correction is a fix rather than a ticket.