Skip to Content
📚 MyStoryFlow Docs — Your guide to preserving family stories
API Reference

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

CategoryEndpointsDescription
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 campaign
  • search (optional): Search in title/transcript
  • tags (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 title
  • description (optional): Description
  • campaignId (optional): Associated campaign
  • transcript (optional): Pre-existing transcript
  • duration (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 blob
  • sessionId (required): Conversation session ID
  • userId (required): User ID
  • conversationType (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:

  1. Audio → Whisper STT (transcription)
  2. Transcript → OpenAI LLM (AI response)
  3. Response → ElevenLabs TTS (optional audio)
  4. 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 header/footer settings for a story.

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 file
  • language (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/mpeg
  • X-Provider: elevenlabs
  • X-Voice-ID: voice-id
  • X-Character-Count: 150
  • X-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 file
  • language (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 range
  • endDate (optional): End of date range
  • metric (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" }

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 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-types
  • story-themes
  • life-events
  • emotions

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 Found
  • 429 - 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:

ServiceFieldNotes
Whisper STTstt_cost_usdPer minute of audio
OpenAI LLMllm_cost_usdPer token
ElevenLabs TTStts_cost_usdPer character

Costs are logged to ai_usage_logs table for analytics.