π API Reference
Complete reference for MongoDB Minute REST API endpoints.
Base URLβ
- Development:
http://localhost:3001/api - Production:
https://<your-domain>/api
Authenticationβ
Most admin endpoints require JWT authentication via magic link:
- Request magic link:
POST /api/auth/request-link - Verify token:
GET /api/auth/verify - Use session cookie for subsequent requests
Episode Endpointsβ
List Episodesβ
GET /api/episodes
Returns all episodes.
Query Parameters: None (currently returns all episodes)
Response:
[
{
"_id": "507f1f77bcf86cd799439011",
"episodeNumber": 1,
"title": "Understanding Embedded Documents",
"slug": "understanding-embedded-documents",
"category": "Data Modeling",
"difficulty": "Beginner",
"status": "published",
"hook": "Did you know most MongoDB performance issues...",
"workflow": {
"currentStage": "approved"
},
"createdAt": "2025-01-15T10:00:00Z",
"updatedAt": "2025-01-15T10:00:00Z"
}
]
Get Single Episodeβ
GET /api/episodes/[id]
Get episode by MongoDB ObjectId.
Response: Single episode object or 404
Create Episodeβ
POST /api/episodes
Create new episode with workflow initialization.
Request Body:
{
"episodeNumber": 1,
"title": "Understanding Embedded Documents",
"category": "Data Modeling",
"difficulty": "Beginner",
"status": "draft",
"hook": "Did you know...",
"problem": "When designing schemas...",
"tip": "Use embedded documents when...",
"quickWin": "This reduces query complexity...",
"cta": "Subscribe for more tips!"
}
Response: Created episode with 201 status
Note: Workflow is automatically initialized on creation.
Update Episodeβ
PUT /api/episodes/[id]
Update existing episode.
Request Body: Partial or complete episode object
Response: Updated episode object
Delete Episodeβ
DELETE /api/episodes/[id]
Delete episode by ID.
Response: { "ok": true }
Workflow Endpointsβ
Submit for Reviewβ
POST /api/episodes/[id]/workflow/submit-review
Submit episode for technical review.
Authentication: Required (JWT)
Response:
{
"success": true,
"episode": {
"workflow": {
"currentStage": "tech-review",
"submittedForReview": {
"email": "user@mongodb.com",
"name": "John Doe",
"timestamp": "2025-01-15T10:00:00Z"
}
}
}
}
Review Episodeβ
POST /api/episodes/[id]/workflow/review
Perform technical review (approve or request changes).
Authentication: Required (JWT)
Request Body:
{
"decision": "approved",
"notes": "Looks good, minor typo fixed"
}
Decision Values:
"approved": Approve and move to Approved stage"changes-requested": Return to Draft with notes
Response:
{
"success": true,
"episode": {
"workflow": {
"currentStage": "approved",
"reviewedBy": {
"email": "reviewer@mongodb.com",
"name": "Jane Smith",
"timestamp": "2025-01-15T11:00:00Z",
"notes": "Looks good, minor typo fixed",
"decision": "approved"
}
}
}
}
Final Approvalβ
POST /api/episodes/[id]/workflow/approve
Final approval for recording.
Authentication: Required (JWT)
Request Body:
{
"notes": "Ready for recording"
}
Response:
{
"success": true,
"episode": {
"workflow": {
"currentStage": "approved",
"approvedBy": {
"email": "approver@mongodb.com",
"name": "Admin User",
"timestamp": "2025-01-15T12:00:00Z",
"notes": "Ready for recording"
}
}
}
}
QR Code Endpointβ
Generate QR Codeβ
GET /api/episodes/[id]/qrcode
Generate QR code for episode detail page.
Query Parameters:
size(number, optional): QR code size in pixels (default: 256)
Response: QR code as SVG image
Example:
GET /api/episodes/507f1f77bcf86cd799439011/qrcode?size=512
User Settings Endpointsβ
Get User Settingsβ
GET /api/user/settings
Get current user settings.
Authentication: Required (JWT)
Response:
{
"email": "user@mongodb.com",
"settings": {
"openaiApiKey": "sk-...",
"socialHandles": {
"youtube": "@username",
"tiktok": "@username",
"linkedin": "username",
"instagram": "@username",
"x": "@username"
}
}
}
Update User Settingsβ
PUT /api/user/settings
Update user settings.
Authentication: Required (JWT)
Request Body:
{
"openaiApiKey": "sk-...",
"socialHandles": {
"youtube": "@newusername",
"tiktok": "@newusername"
}
}
Response: Updated user settings object
Authentication Endpointsβ
Request Magic Linkβ
POST /api/auth/request-link
Request magic link for passwordless login.
Request Body:
{
"email": "user@mongodb.com"
}
Response:
{
"success": true,
"message": "Magic link sent to email"
}
Note: Only MongoDB.com email addresses are accepted.
Verify Magic Linkβ
GET /api/auth/verify
Verify magic link token and create session.
Query Parameters:
token(string, required): JWT token from magic link
Response: Redirects to admin dashboard on success
Logoutβ
POST /api/auth/logout
Logout current user.
Response: { "success": true }
Error Responsesβ
All endpoints may return error responses:
400 Bad Request:
{
"error": "Validation error",
"details": "Title is required"
}
401 Unauthorized:
{
"error": "Unauthorized",
"message": "Authentication required"
}
404 Not Found:
{
"error": "Not found",
"message": "Episode not found"
}
500 Internal Server Error:
{
"error": "Internal server error",
"message": "Database connection failed"
}
Rate Limitingβ
Currently, no rate limiting is implemented. Consider adding rate limiting for production deployments.
CORSβ
CORS is configured for the application domain. For API access from external domains, configure CORS headers appropriately.
Data Modelsβ
Episode Schemaβ
See Project Summary for complete schema documentation.
User Schemaβ
{
_id: ObjectId,
email: String, // MongoDB.com email (unique)
settings: {
openaiApiKey: String, // Encrypted
socialHandles: {
youtube: String,
tiktok: String,
linkedin: String,
instagram: String,
x: String
}
},
createdAt: Date,
updatedAt: Date
}
Integration Examplesβ
JavaScript/TypeScriptβ
// List episodes
const response = await fetch('/api/episodes');
const episodes = await response.json();
// Create episode
const newEpisode = await fetch('/api/episodes', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
title: 'New Episode',
category: 'Data Modeling',
difficulty: 'Beginner',
// ... other fields
})
});
// Submit for review
await fetch(`/api/episodes/${episodeId}/workflow/submit-review`, {
method: 'POST',
credentials: 'include' // Include session cookie
});
cURL Examplesβ
# List episodes
curl http://localhost:3001/api/episodes
# Create episode
curl -X POST http://localhost:3001/api/episodes \
-H "Content-Type: application/json" \
-d '{"title":"New Episode","category":"Data Modeling"}'
# Submit for review (requires auth)
curl -X POST http://localhost:3001/api/episodes/ID/workflow/submit-review \
-H "Cookie: session=TOKEN"
Next Stepsβ
- Review Deployment Guide for production setup
- Check Project Summary for architecture details