Skip to content

Projects & API Tokens

Projects are the operational unit of the tenancy hierarchy, each with a dedicated Kubernetes namespace, resource quota, and API token.

  1. Go to Settings → Tenancy → Projects (or select a department and click New Project)
  2. Enter a name and slug
  3. Set resource quotas (CPU, memory, storage, GPU)
  4. Click Create

A dedicated Kubernetes namespace (apps-<slug>) is created with a ResourceQuota enforcing the configured limits.

FieldDefaultDescription
CPU4Maximum CPU cores available to all workloads in the project
Memory8GiMaximum memory across all pods
Storage50GiMaximum total PVC storage
GPU0Maximum GPU units (requires GPU nodes)

Each project has a whitelist of MCP servers that project members can call. Requests to MCP servers not on the whitelist are rejected when authenticated with a project token.

To manage the whitelist:

  1. Open the project in Settings → Tenancy → Projects
  2. Go to MCP Servers
  3. Toggle which servers are allowed

Every project has a single API token used for programmatic access. This token:

  • Never expires (unlike user JWTs)
  • Restricts access to the project’s namespace and allowed MCP servers
  • Can be used with the X-API-Key header or as an Authorization: Bearer token
  1. Open the project in Settings → Tenancy → Projects
  2. Click Show Token

The project token is automatically injected into Jupyter notebooks as the FTN_API_KEY environment variable. Use it with the OpenAI-compatible SDK:

import os
from openai import OpenAI
client = OpenAI(
base_url=f"{os.environ['FTN_BASE_URL']}/api/v1",
api_key=os.environ['FTN_API_KEY']
)
response = client.chat.completions.create(
model="llama3:8b",
messages=[{"role": "user", "content": "Summarize this dataset"}]
)
Terminal window
curl -X POST https://<domain>/api/v1/chat/completions \
-H "X-API-Key: <project-token>" \
-H "Content-Type: application/json" \
-d '{
"model": "llama3:8b",
"messages": [{"role": "user", "content": "Hello"}]
}'

If a token is compromised, regenerate it from the project settings. The old token is immediately invalidated.