ApikeeApikeeDocs
SDKs

Python SDK

Add Apikee API key authentication to Python services using FastAPI, Flask, or ASGI. Configure keys, scopes, middleware, and OpenAPI integration.

PyPI

pip install apikee                # local mode, zero dependencies
pip install "apikee[fastapi]"     # + FastAPI middleware
pip install "apikee[server]"      # + encrypted server channel
pip install "apikee[all]"         # everything

Configure

export APIKEE_SECRET=$(openssl rand -hex 32)

# Server mode (optional)
export APIKEE_BASE_URL=https://apikee.example.com/api/v1
export APIKEE_SERVER_KEY=sk_...
export APIKEE_PROJECT_ENV=payments-api-production

FastAPI

from fastapi import Depends
from apikee import ApikeeClaims
from apikee.fastapi import SecuredFastAPI, ApikeeDepends, require_scope

app = SecuredFastAPI()              # reads APIKEE_SECRET

@app.get("/v1/users")
def list_users(claims: ApikeeClaims = ApikeeDepends()):
    return {"tenant": claims.tenant, "scopes": claims.scopes}

@app.delete("/v1/users/{id}", dependencies=[Depends(require_scope("admin"))])
def delete_user(id: str):
    ...

Open /docs and every endpoint shows the 🔒 lock. Click Authorize and paste a key to try calls from the browser.

Issuing keys from a route

@app.post("/keys")                  # public — your own auth in front of it
def create_key(tenant: str, scopes: str = "read"):
    key = app.apikee.create(tenant, scopes=scopes.split(","))
    return {"key": key}             # returned once — store it

Flask

from flask import Flask
from apikee.flask import init_apikee, apikee_required, require_scope, get_claims

app = Flask(__name__)
init_apikee(app)                    # reads APIKEE_SECRET

@app.get("/v1/users")
@apikee_required
def list_users():
    return {"tenant": get_claims().tenant}

@app.delete("/v1/users/<id>")
@require_scope("admin")
def delete_user(id):
    ...

Any ASGI framework

from apikee import Apikee, ApikeeError

apikee = Apikee()

try:
    claims = apikee.protect(request.headers.get("x-api-key"))
except ApikeeError as err:
    return JSONResponse({"error": err.code}, status_code=401)

Issuing keys

key = apikee.create(
    "acme",
    scopes=["read:users", "write:orders"],
    expires_in="90d",               # or a datetime, or milliseconds
    meta={"plan": "partner"},
)

Describing endpoints

apikee.describe_endpoint(
    "GET", "/v1/users",
    description="List users in the caller's tenant.",
    scopes=["read:users"],
    tags=["users"],
)

A no-op in local mode. See Endpoints.

Server client

from apikee.server import ApikeeServer, ServerConfig

server = ApikeeServer(ServerConfig(
    base_url="https://apikee.example.com/api/v1",
    server_key="sk_...",
    project_env="payments-api-production",
))

server.create_client_with_key(name="Acme mobile app", client_type="company")

On this page