API Keys Scope
1. Break Down the Feature Lifecycle
1.1 Define the Feature Goals
Purpose: Securely generate and manage API keys used by organizations to authenticate webhook requests and access platform resources programmatically.
Desired Outcomes:
Allow org admins to create and revoke keys
Only hashed API keys are stored for security
Allow platform to validate keys in
Authorization: Bearer
headers
Core User Interactions:
Platform Admin:
View and revoke any API key
Organization Admin:
Create and revoke their own API keys
Label keys for tracking (e.g., “LRS Integration”)
1.2 Establish Key Milestones
Data Creation:
API key is generated (returned once), hashed, and stored
Optional expiration and labeling set at creation
Data Storage:
Store under
/organizations/{orgId}/apiKeys/{keyId}
withkeyHash
,revoked
,expiresAt
, etc.
Data Retrieval:
Only metadata can be retrieved; raw key is not shown after creation
Validation:
Middleware decodes incoming bearer key, hashes, and compares with stored hashes
Revocation:
Set
revoked: true
to deactivate a key
Automation (future):
Auto-expire keys
Notify org admin before expiration
Rate limiting and IP restrictions
1.3 Prioritize MVP
✅ Key creation with label and expiration
✅ Store key hash securely
✅ Middleware-based validation for xAPI endpoints
✅ Revocation support
🔲 Usage logging and rotation reminders (future)
🔲 Scoped keys and rate limiting (future)
Knowledge Gaps:
Determine if keys will need scopes (talk to integration partners)
Decide on notification process for expiring or misused keys
2. Identify Relevant Entities
2.1 List Entities
Organization
API Key
2.2 Define Relationships
Organization
Has many API Keys
API Key
Belongs to one Organization, used for validation
3. Plan API Routes
3.1 Define CRUD Operations
POST
/organizations/:orgId/api-keys
Create API key
GET
/organizations/:orgId/api-keys
List API key metadata
GET
/organizations/:orgId/api-keys/:keyId
View metadata for single key
PATCH
/organizations/:orgId/api-keys/:keyId
Update label, revoke key
DELETE
/organizations/:orgId/api-keys/:keyId
Permanently delete key (optional)
3.2 Define Action-Specific Routes
None yet, but potential future routes:
/api-keys/:keyId/rotate
/api-keys/:keyId/usage
3.3 Validate Input/Output
Only allow org admins or platform admins to manage keys
Only return key value at creation time
Use strong hashing algorithm (e.g., bcrypt or SHA-256 + salt)
4. Feature Breakdown with Example Usage
Org Admin: Creating an API Key
Navigates to “Integration Settings”
Fills out a form with:
Name = “Webhook Key”
Expiration = “+90 days”
Hits submit:
Backend generates raw key, stores hash
Returns plaintext API key once
Example Response:
{
"success": true,
"message": "API key created successfully.",
"data": {
"apiKey": "org_09d98ac0f5e4123a9b62..."
}
}
5. Use Flowcharts for Clarity
Create API Key Flow
[User Clicks 'Generate API Key']
↓
[API Key Created on Server]
↓
[Raw Key Sent to User (Once Only)]
↓
[Hash Stored in DB with Metadata]
↓
[Subsequent Requests Use Bearer Key]
Last updated