ApikeeApikeeDocs
Core concepts

How it fits together

The five objects Apikee models, and how a request moves through them.

Apikee has a small object model. Learn these five nouns and the rest of the product follows.

Workspace              acme
└── Project            payments-api
    └── Environment    production          ← addressed as payments-api-production
        ├── Endpoint   GET /v1/users
        ├── Template   "Partner tier"      (rate limits, shared by clients)
        └── Client     "Mobile app"
            └── Key    apikee_…            (tenant, scopes, expiry — signed in)
ObjectWhat it is
WorkspaceAn organisation. Holds people, teams and projects.
ProjectOne API. Owns its environments.
Environmentproduction, staging, … Everything below is scoped to one.
ClientA consumer of your API. Holds keys.
KeyThe credential. Self-contained and signed.

Two supporting objects hang off an environment: endpoints, which describe your routes, and templates, which carry reusable rate limits.

Addressing

Almost every API call and URL identifies an environment with a single string:

<project-slug>-<env-type>

payments-api-production
payments-api-staging

A project slug may itself contain dashes. Resolution tries the whole string as a project slug first, then falls back to splitting off a trailing environment type, so payments-api-production resolves correctly even though the slug contains a dash.

The path of a request

When a call arrives at your API, this is what happens:

1. Your SDK verifies the key locally. Signature, embedded expiry, scopes — pure CPU, roughly 0.1ms, no network. A forged or expired key is rejected here and never reaches your handler or the platform.

2. In local mode, that is the end of it. Your handler runs.

3. In server mode, the SDK also reports to the platform — asynchronously, so it does not sit in your response path. That is what produces revocation checks, usage counts, IP allow-listing and rate limits. The platform runs eight checks, cheapest first, and logs every outcome.

The important property: the expensive, centralised work is additive. If the platform is unreachable and you have failOpen set, your API still serves traffic on the strength of the local signature check.

What is signed into a key

A key is not a random string with a database lookup behind it. It carries its own claims:

ClaimMeaning
idKey identifier
tenantWho the key belongs to
scopesWhat it may do
environmentWhich environment issued it
expiresAt / notBeforeValidity window
metaArbitrary JSON you attach

Because these are signed, they cannot be edited after issuance — which is also why scopes and environment are immutable and expiry can only be shortened. To widen access, issue a new key.

On this page