API Reference
MyStoryFlow provides a comprehensive REST API for managing campaigns, stories, recordings, conversations, and books. All API endpoints are built with Next.js API routes (App Router) and use Supabase for authentication and data persistence.
Overview
| Category | Endpoints | Description |
|---|---|---|
| Campaigns | /api/campaigns/* | Story collection campaigns |
| Recordings | /api/recordings/* | Voice recordings with AI processing |
| Conversations | /api/conversation/*, /api/conversations/* | AI-powered voice conversations |
| Stories | /api/stories/* | Written stories and chapters |
| Books | /api/books/* | Book creation and management |
| AI Services | /api/ai/*, /api/transcribe, /api/tts/*, /api/stt/* | AI features and voice services |
| Family | /api/family/*, /api/families/* | Family groups and collaboration |
| Gifts | /api/gifts/* | Gift purchases and redemption |
| Templates | /api/templates/* | Story and book templates |
| Imports | /api/imports/* | Content import from various sources |
| Analytics | /api/analytics/* | Usage and engagement analytics |
| Achievements | /api/achievements/* | User achievements and gamification |
| Settings | /api/settings/* | User preferences |
| User | /api/user/* | User data and analytics |
| Privacy | /api/privacy/* | GDPR compliance and data access |
| Auth | /api/auth/* | Authentication endpoints |
| Upload | /api/upload/* | File upload management |
| Timeline | /api/timeline/* | Activity timeline and reactions |
Authentication
All API endpoints require authentication via Supabase Auth. The authentication is handled automatically by the Supabase client in server components.
// Server-side authentication pattern
const supabase = await createClient()
const { data: { user }, error } = await supabase.auth.getUser()
if (authError || !user) {
return NextResponse.json({ error: 'Unauthorized' }, { status: 401 })
}Campaigns API
GET /api/campaigns
Returns all campaigns for the authenticated user.
Response:
[
{
"id": "uuid",
"title": "Dad's Life Stories",
"description": "Collecting stories from my father",
"recordingCount": 0,
"conversationCount": 0,
"createdAt": "2024-01-01T00:00:00Z"
}
]POST /api/campaigns
Create a new campaign.
Request Body:
{
"title": "Campaign Title",
"description": "Optional description"
}Response:
{
"id": "uuid",
"title": "Campaign Title",
"description": "Optional description",
"recordingCount": 0,
"conversationCount": 0,
"createdAt": "2024-01-01T00:00:00Z"
}Recordings API
GET /api/recordings
Retrieve recordings with optional filtering.
Query Parameters:
campaignId(optional): Filter by campaignsearch(optional): Search in title/transcripttags(optional): Filter by tags (comma-separated)limit(optional): Max results to return
Response:
{
"recordings": [
{
"id": "uuid",
"title": "Recording Title",
"transcript": "Transcribed text...",
"ai_summary": "AI-generated summary",
"duration_seconds": 180,
"audio_url": "https://...",
"waveform_data": [...],
"tags": ["family", "childhood"],
"created_at": "2024-01-01T00:00:00Z"
}
]
}POST /api/recordings
Upload a new voice recording.
Request: multipart/form-data
audio(required): Audio file (webm, mp3, wav)title(optional): Recording titledescription(optional): DescriptioncampaignId(optional): Associated campaigntranscript(optional): Pre-existing transcriptduration(optional): Duration in seconds
Response:
{
"recording": {
"id": "uuid",
"title": "Recording Title",
"audio_url": "https://...",
"transcript": "AI-transcribed text",
"ai_summary": "AI-generated summary",
"tags": ["auto", "generated"],
"duration_seconds": 180
}
}DELETE /api/recordings?id={recordingId}
Delete a recording and its audio file.
GET /api/recordings/[id]
Get a specific recording by ID.
GET /api/recordings/[id]/audio
Stream the audio file for a recording.
GET /api/recordings/stats
Get recording statistics for the user.
GET /api/recordings/tags
Get all unique tags used across recordings.
Response:
{
"tags": ["family", "childhood", "memories", "travel"]
}GET /api/recordings/[id]/waveform
Get waveform visualization data for a recording.
Response:
{
"waveform": [0.1, 0.3, 0.5, 0.7, ...],
"duration": 180
}Conversation API (Voice Conversations)
POST /api/conversation
Process a voice conversation turn with AI.
Request: multipart/form-data
audio(required): Voice recording blobsessionId(required): Conversation session IDuserId(required): User IDconversationType(optional): Type of conversation
Response:
{
"success": true,
"conversationId": "uuid",
"transcript": "User's transcribed speech",
"aiResponse": "Elena's response text",
"aiAudioUrl": "https://... (ElevenLabs TTS audio)",
"turnId": "uuid",
"conversationState": {
"messageCount": 5,
"currentTopic": "childhood memories"
}
}Flow:
- Audio → Whisper STT (transcription)
- Transcript → OpenAI LLM (AI response)
- Response → ElevenLabs TTS (optional audio)
- Costs tracked:
stt_cost_usd,llm_cost_usd,tts_cost_usd
POST /api/conversation/chat
Text-based chat conversation with AI.
Request Body:
{
"message": "User's text message",
"sessionId": "conversation-session-id",
"context": "Optional context"
}POST /api/conversation/enhanced
Enhanced conversation with additional AI features.
POST /api/conversation/voice
Voice-based conversation endpoint.
POST /api/conversation/tts
Generate TTS audio for conversation responses.
POST /api/conversation/quality-assessment
Assess the quality of a conversation turn.
Conversations Management API
GET /api/conversations
List all conversations for the user.
GET /api/conversations/[id]
Get a specific conversation with messages.
POST /api/conversations/[id]/summarize
Generate AI title and overview for a conversation.
Response:
{
"success": true,
"title": "AI-generated title",
"overview": "Summary of the conversation",
"conversation": { ... }
}POST /api/conversations/[id]/complete
Mark a conversation as completed.
GET /api/conversations/stats
Get conversation statistics.
GET /api/conversations/tags
Get all unique tags used across conversations.
POST /api/conversations/upload-audio
Upload audio for a conversation turn.
POST /api/conversations/analyze
Analyze conversation patterns and themes.
POST /api/conversations/[id]/analyze
Analyze a specific conversation.
POST /api/conversations/[id]/analyze-quality
Get quality metrics for a conversation.
GET /api/conversations/[id]/tags
Get tags for a specific conversation.
PUT /api/conversations/[id]/tags
Update tags for a conversation.
Stories API
GET /api/stories
Returns all stories for the authenticated user.
POST /api/stories
Create a new story.
Request Body:
{
"title": "Story Title",
"campaignId": "uuid",
"type": "story"
}GET /api/stories/[storyId]
Get a specific story by ID.
PUT /api/stories/[storyId]
Update a story’s content and metadata.
DELETE /api/stories/[storyId]
Delete a story.
POST /api/stories/[storyId]/share
Create a shareable link for a story.
GET /api/stories/[storyId]/share/[shareId]
Get a shared story by share ID.
POST /api/stories/convert
Convert content to story format (from recordings or conversations).
Request Body:
{
"sourceType": "recording" | "conversation",
"sourceId": "uuid",
"title": "Story Title"
}GET /api/stories/[storyId]/typography
Get typography settings for a story.
PUT /api/stories/[storyId]/typography
Update typography settings for a story.
Request Body:
{
"fontFamily": "Georgia",
"fontSize": 16,
"lineHeight": 1.6
}GET /api/stories/[storyId]/header-footer
Get header/footer settings for a story.
PUT /api/stories/[storyId]/header-footer
Update header/footer settings.
Books API
GET /api/books
Returns all books for the authenticated user, including family books.
Response:
{
"books": [
{
"id": "uuid",
"title": "My Story Book",
"subtitle": "A Family Memoir",
"author_name": "John Smith",
"book_type": "memoir",
"status": "draft",
"story_ids": ["story-1", "story-2"],
"word_count": 15000,
"chapters": [
{
"id": "story-1",
"chapter_number": 1,
"title": "Chapter Title",
"word_count": 3000,
"status": "completed"
}
]
}
],
"familyBooks": [...]
}POST /api/books
Create a new book. Uses “Story = Chapter” model where stories become chapters.
Request Body:
{
"title": "Book Title",
"subtitle": "Optional subtitle",
"author_name": "Author Name",
"book_type": "memoir",
"campaign_id": "uuid (optional)",
"family_group_id": "uuid (optional)",
"selectedStories": ["story-id-1", "story-id-2"],
"template_id": "uuid (optional)",
"cover_template_id": "uuid (optional)",
"interior_template_id": "uuid (optional)",
"trim_size": "6x9",
"keywords": ["family", "memoir"],
"categories": ["biography"],
"language": "en",
"kdp_enrolled": false,
"kdp_select": false
}Response:
{
"book": { ... },
"message": "Book created successfully",
"chapters_imported": 5
}GET /api/books/templates
Get available book templates.
POST /api/books/content-analysis
Analyze book content for suggestions.
AI Services API
POST /api/ai/grammar
Grammar correction using AI.
Request Body:
{
"text": "Text to correct",
"userId": "uuid",
"userStyle": "formal"
}POST /api/ai/content-analysis
Analyze content and get recommendations.
Request Body:
{
"prompt": "Analysis prompt",
"userId": "uuid",
"sessionId": "optional-session-id",
"analysisDepth": "basic|detailed",
"maxRecommendations": 8
}Response includes usage limits check (429 if exceeded):
{
"success": false,
"error": "Usage limits exceeded",
"limits": { ... },
"usage": { ... }
}POST /api/ai/memory-prompts
Generate memory prompts for storytelling.
POST /api/ai/story-connections
Find connections between stories.
POST /api/ai/photo-suggestions
Get AI suggestions for photo placement.
POST /api/ai/grammar-analysis
Detailed grammar analysis with explanations.
Request Body:
{
"text": "Text to analyze",
"includeExplanations": true
}POST /api/ai/content-refinement
Refine and improve content with AI.
Request Body:
{
"content": "Content to refine",
"style": "formal" | "casual" | "narrative",
"preserveVoice": true
}POST /api/ai/template-refinement
Refine template content with AI suggestions.
Transcription API
POST /api/transcribe
Transcribe audio to text.
Request: multipart/form-data
audio(required): Audio filelanguage(optional): Language code or “auto”provider(optional): “whisper” | “gemini” | “auto”prompt(optional): Context for transcription
Response:
{
"success": true,
"transcript": "Transcribed text",
"provider": "whisper",
"confidence": 0.95,
"language": "en",
"cost": 0.001,
"duration": 1500,
"metadata": {
"audioSize": 50000,
"audioType": "audio/webm",
"processingTime": 1500
}
}Text-to-Speech API
GET /api/tts/elevenlabs
Get available ElevenLabs voices.
Response:
{
"voices": [
{
"voice_id": "voice-id",
"name": "Elena",
"category": "professional",
"gender": "female",
"accent": "american",
"preview_url": "https://..."
}
],
"total": 10
}POST /api/tts/elevenlabs
Generate speech from text.
Request Body:
{
"text": "Text to speak",
"voice_id": "voice-id",
"voice_settings": {
"stability": 0.75,
"similarity_boost": 0.75,
"style": 0.25
},
"model_id": "eleven_multilingual_v2",
"output_format": "mp3_44100_128"
}Response: Audio stream with headers:
Content-Type: audio/mpegX-Provider: elevenlabsX-Voice-ID: voice-idX-Character-Count: 150X-Estimated-Cost: 0.005
PUT /api/tts/elevenlabs
Streaming TTS for real-time playback.
STT API (Speech-to-Text)
POST /api/stt/gemini
Transcribe audio using Google Gemini.
Request: multipart/form-data
audio(required): Audio filelanguage(optional): Language code
Response:
{
"success": true,
"transcript": "Transcribed text",
"provider": "gemini",
"language": "en"
}Family Groups API
GET /api/family/groups
Get all family groups for the user.
Response:
{
"success": true,
"data": [
{
"id": "uuid",
"name": "Smith Family",
"description": "Our family stories",
"member_count": 5,
"role": "owner"
}
]
}POST /api/family/groups
Create a new family group.
Request Body:
{
"name": "Family Name",
"description": "Optional description",
"settings": {}
}GET /api/family/groups/[familyId]
Get a specific family group.
POST /api/family/invitations
Send a family invitation.
POST /api/family/invitations/accept
Accept a family invitation.
GET /api/family/[id]/leaderboard
Get family contribution leaderboard.
GET /api/family/timeline
Get family activity timeline.
POST /api/family/invitations/reject
Reject a family invitation.
GET /api/family/invitations/[token]
Get invitation details by token.
GET /api/family/invitations/[token]/public
Get public invitation details (pre-auth).
GET /api/family/welcome/[token]
Welcome page data for new family members.
GET /api/family/members
Get all family members across groups.
Families API (Extended Family Management)
GET /api/families/[familyId]/members
Get members of a specific family.
POST /api/families/[familyId]/members
Add a new member to a family.
GET /api/families/[familyId]/members/[memberId]
Get specific member details.
PUT /api/families/[familyId]/members/[memberId]
Update member information.
DELETE /api/families/[familyId]/members/[memberId]
Remove a member from the family.
POST /api/families/[familyId]/members/[memberId]/merge
Merge duplicate member records.
GET /api/families/[familyId]/invitations
List pending family invitations.
POST /api/families/[familyId]/invitations
Send a new family invitation.
DELETE /api/families/[familyId]/invitations/[invitationId]
Cancel a pending invitation.
POST /api/families/[familyId]/invitations/[invitationId]/resend
Resend an invitation email.
GET /api/families/[familyId]/relationships
Get family relationship mappings.
POST /api/families/[familyId]/relationships
Define relationships between family members.
GET /api/families/[familyId]/memories
Get shared family memories.
POST /api/families/[familyId]/memories
Add a new family memory.
GET /api/families/[familyId]/memories/[memoryId]
Get specific memory details.
PUT /api/families/[familyId]/memories/[memoryId]
Update a family memory.
DELETE /api/families/[familyId]/memories/[memoryId]
Delete a family memory.
GET /api/families/[familyId]/media
Get family media gallery.
GET /api/families/[familyId]/story-prompts
Get family-specific story prompts.
Settings API
GET /api/settings/voice
Get voice settings for the user.
Response:
{
"settings": {
"recording_quality": "high",
"noise_reduction": true,
"auto_transcription": true,
"voice_enhancement": false,
"elena_response_style": "concise",
"elena_question_frequency": "moderate",
"elena_conversation_pace": "natural"
}
}POST /api/settings/voice
Update voice settings.
GET /api/settings/voice-preferences
Get detailed voice preferences.
GET /api/settings/app
Get app-wide settings.
User API
GET /api/user/usage
Get AI usage statistics (admin only).
Query Parameters:
userId(optional): Target user ID
Response:
{
"success": true,
"usage": {
"daily": { ... },
"monthly": { ... },
"total": { ... }
},
"userId": "uuid"
}GET /api/user/writing-activity
Get writing activity metrics.
POST /api/user/export-data
Export user data.
GET /api/user/emails/inbox
Get user’s email inbox.
POST /api/user/emails/preferences
Update email preferences.
GET /api/user/emails/received
Get received emails history.
POST /api/user/emails/[id]/read
Mark an email as read.
Authentication API
POST /api/auth/signup
Register a new user.
POST /api/auth/signup-with-invitation
Register with a family invitation.
POST /api/auth/signout
Sign out the current user.
Gifts API
GET /api/gifts/list
Get user’s purchased gifts.
Response:
{
"gifts": [
{
"id": "uuid",
"recipient_name": "John Smith",
"recipient_email": "john@example.com",
"status": "pending" | "redeemed" | "expired",
"created_at": "2024-01-01T00:00:00Z"
}
]
}POST /api/gifts/purchase
Purchase a gift subscription.
Request Body:
{
"recipientName": "John Smith",
"recipientEmail": "john@example.com",
"senderName": "Jane Smith",
"message": "Happy Birthday!",
"planId": "annual"
}POST /api/gifts/redeem
Redeem a gift code.
Request Body:
{
"code": "GIFT-XXXX-XXXX"
}GET /api/gifts/[id]
Get specific gift details.
DELETE /api/gifts/delete
Cancel a pending gift.
POST /api/gifts/retry
Retry failed gift delivery.
GET /api/gifts/errors
Get gift processing errors.
POST /api/gifts/errors/dismiss
Dismiss a gift error.
GET /api/gifts/admin/list
Admin: List all gifts.
DELETE /api/gifts/admin/delete
Admin: Delete a gift.
Templates API
GET /api/templates/books
Get book templates.
Response:
{
"templates": [
{
"id": "uuid",
"name": "Classic Memoir",
"description": "Traditional memoir layout",
"preview_url": "https://...",
"category": "memoir"
}
]
}GET /api/templates/covers
Get book cover templates.
GET /api/templates/[relationshipType]
Get templates for specific relationship types (parent, grandparent, etc.).
Imports API
GET /api/imports
List import jobs.
POST /api/imports
Create new import job.
POST /api/imports/upload
Upload file for import.
Request: multipart/form-data
file(required): File to import (PDF, DOCX, TXT)
POST /api/imports/paste
Import from pasted text.
Request Body:
{
"content": "Pasted text content...",
"title": "Import Title"
}POST /api/imports/url
Import from URL.
Request Body:
{
"url": "https://example.com/content"
}GET /api/imports/[importId]
Get import job status.
POST /api/imports/[importId]/process
Process an uploaded import.
POST /api/imports/[importId]/convert
Convert imported content to story.
Analytics API
GET /api/analytics/usage
Get platform usage analytics.
Query Parameters:
startDate(optional): Start of date rangeendDate(optional): End of date rangemetric(optional): Specific metric to retrieve
GET /api/analytics/config
Get analytics configuration.
GET /api/analytics/health
Health check for analytics services.
Achievements API
GET /api/achievements/definitions
Get all available achievements.
Response:
{
"achievements": [
{
"id": "first-story",
"name": "First Story",
"description": "Write your first story",
"icon": "book",
"points": 10
}
]
}GET /api/achievements/user
Get user’s earned achievements.
GET /api/achievements/progress
Get progress toward achievements.
POST /api/achievements/check
Check and award new achievements.
Privacy API (GDPR Compliance)
GET /api/privacy/access
Request access to personal data.
Response:
{
"success": true,
"message": "Data export initiated",
"downloadUrl": "https://..."
}POST /api/privacy/erase
Request data erasure (right to be forgotten).
Request Body:
{
"confirmEmail": "user@example.com",
"reason": "No longer using service"
}Consent API
GET /api/consent/status
Get user’s consent status.
Response:
{
"consents": {
"marketing": true,
"analytics": true,
"thirdParty": false
},
"lastUpdated": "2024-01-01T00:00:00Z"
}POST /api/consent/update
Update consent preferences.
Upload API
POST /api/upload-url
Get a signed upload URL.
Request Body:
{
"fileName": "image.jpg",
"fileType": "image/jpeg",
"folder": "images"
}Response:
{
"uploadUrl": "https://...",
"fileUrl": "https://..."
}POST /api/upload/backblaze
Direct upload to Backblaze B2.
DELETE /api/upload/delete
Delete an uploaded file.
Images API
GET /api/images/user-gallery
Get user’s image gallery.
GET /api/images/[imageId]
Get specific image details.
DELETE /api/images/[imageId]
Delete an image.
Audio API
GET /api/audio/[fileId]
Stream an audio file.
POST /api/audio/[fileId]/share
Create shareable audio link.
Timeline API
POST /api/timeline/events/[eventId]/reactions
Add reaction to timeline event.
Request Body:
{
"type": "like" | "love" | "celebrate"
}Invoices API
GET /api/invoices
Get user’s invoices.
GET /api/invoices/[id]
Get specific invoice.
Support API
POST /api/support/flag
Flag content for review.
Request Body:
{
"contentType": "story" | "recording" | "conversation",
"contentId": "uuid",
"reason": "Reason for flagging",
"details": "Additional details"
}Content Stats API
GET /api/content/stats
Get overall content statistics.
Reference Data API
GET /api/reference-data/[collection]
Get reference data by collection name.
Collections:
relationship-typesstory-themeslife-eventsemotions
Share API
GET /api/share/[token]
Access shared content by token.
Campaign Create Flow API
Multi-step campaign creation wizard.
POST /api/campaigns/create-flow/start
Start a new campaign creation flow.
GET /api/campaigns/create-flow/[campaignId]/resume
Resume an in-progress campaign creation.
PUT /api/campaigns/create-flow/[campaignId]/step/[stepNumber]
Update a specific step in the flow.
PUT /api/campaigns/create-flow/[campaignId]/step/familyMembers
Update family members step.
PUT /api/campaigns/create-flow/[campaignId]/gift-address
Update gift shipping address.
POST /api/campaigns/create-flow/[campaignId]/complete
Complete and finalize campaign creation.
Admin Email API
GET /api/admin/email/templates
Get email templates.
POST /api/admin/email/templates
Create email template.
GET /api/admin/email/templates/[id]
Get specific template.
PUT /api/admin/email/templates/[id]
Update email template.
DELETE /api/admin/email/templates/[id]
Delete email template.
GET /api/admin/email/analytics
Get email analytics.
POST /api/admin/email/ab-test
Create A/B test for emails.
System API
GET /api/system/verify-database
Verify database connectivity and schema.
Error Responses
All API endpoints return consistent error responses:
{
"error": "Error message",
"details": "Additional details (optional)"
}HTTP Status Codes:
400- Bad Request (validation error)401- Unauthorized (authentication required)403- Forbidden (insufficient permissions)404- Not Found429- Too Many Requests (rate limited)500- Internal Server Error
File Storage
Audio files are stored in Backblaze B2:
- Recordings uploaded to
recordings/folder - AI conversation audio stored separately
- Waveform data generated on upload
Signed URLs are used for secure audio access with automatic expiration.
Cost Tracking
AI features track costs per request:
| Service | Field | Notes |
|---|---|---|
| Whisper STT | stt_cost_usd | Per minute of audio |
| OpenAI LLM | llm_cost_usd | Per token |
| ElevenLabs TTS | tts_cost_usd | Per character |
Costs are logged to ai_usage_logs table for analytics.
Related Documentation
- Development Guide - Local setup and development
- Database Schema - Table structures and relationships
- Architecture Overview - System design