SDKs
Python SDK
Add Apikee API key authentication to Python services using FastAPI, Flask, or ASGI. Configure keys, scopes, middleware, and OpenAPI integration.
pip install apikee # local mode, zero dependencies
pip install "apikee[fastapi]" # + FastAPI middleware
pip install "apikee[server]" # + encrypted server channel
pip install "apikee[all]" # everythingConfigure
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-productionFastAPI
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 itFlask
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")
