ApikeeApikeeDocs
Platform

Analytics & logs

What Apikee records for every validation attempt, and what you can ask of it.

In server mode every validation attempt — accepted or rejected — is written to the request log with credentials redacted. That log is what the overview charts, the per-client usage and the rate-limit counters are built from.

What is recorded

Which key and clientBy id, never the raw key
Which endpointMETHOD:::/path
OutcomeAccepted, or which of the eight checks failed
Status and duration
Caller IP and headersCredential headers redacted
Optional payloadOnly what your SDK chooses to send

Logs live in MongoDB, separately from the PostgreSQL data that holds clients and keys — so log volume never threatens the store that matters most.

The overview

Each environment has a dashboard covering:

  • Request volume over time
  • Error rate, split by failure reason
  • Latency, including p99
  • Per-endpoint breakdown — which routes carry the traffic
  • Per-client breakdown — who is calling, and how close to their limits

The log viewer

The Developer tab carries a searchable viewer and a per-entry inspector. This is the tool for answering "why is this consumer getting 403?" — the entry names the check that failed, so you can tell an IP allow-list rejection from a disabled client from a missing scope without guessing.

Over the API

curl "https://apikee.example.com/api/v1/project/payments-api-production/logs" \
  -H "x-api-key: apikee_..."

See Projects.

Rate-limit accounting

Template limits are evaluated against these same records across four independent windows — hour, day, week, month. A throttled caller receives 429 with a Retry-After header.

Because rate limiting is the last of the eight checks, an invalid or revoked key is rejected before it can consume any of a tenant's budget. A brute-force attempt against one customer cannot exhaust that customer's quota.

Retention

Logs grow with traffic. Apikee does not impose a retention policy — set one on the MongoDB collection to match your needs and your obligations. The PostgreSQL side is unaffected either way.

Asking questions of this data in plain language is what the AI assistant is for — "which endpoints errored in the last 24 hours?" reads the same records.

On this page