{"openapi":"3.1.0","info":{"title":"Ta-Da! API","version":"0.6.4","description":"REST API for Ta-Da! — authenticate with a Bearer API key (tada_key_…). Admin endpoints require the caller's user id to be in ADMIN_USER_IDS on the server."},"servers":[{"url":"https://tada.living","description":"Local Development Server","variables":{}}],"paths":{"":{"get":{"tags":["App Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/account":{"delete":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/activities/category":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/activities/recent":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/change-password":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/forgot-password":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/has-users":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/login":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/logout":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/register":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/reset-password":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/send-verification":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/session":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/update-email":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/verify-email":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/auth/verify-reset-token":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/billing/create-checkout":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/billing/create-portal":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/billing/status":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/billing/webhook":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/categories/recent":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/counts/recent":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/durations/recent":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"get":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"patch":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/entries/bulk":{"delete":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/drafts/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/entries/drafts/{id}/commit":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/entries/drafts":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/parse":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/stats":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/suggestions":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/summary":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/entries/validate":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/feedback":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/health":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/import/entries":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/import/logs":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/import/recipes":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/import/recipes/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"get":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/import/recipes/{id}/restore":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/link-preview":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/newsletter/subscribe":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/calendar":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/daily":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/experiments":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/experiments/{experimentId}/assignments/trigger":{"post":{"tags":["API Routes"],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/experiments/{experimentId}/morning-prompt":{"get":{"tags":["API Routes"],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/experiments/{experimentId}/pause":{"post":{"tags":["API Routes"],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/experiments/{experimentId}/resume":{"post":{"tags":["API Routes"],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/experiments/{experimentId}/stats":{"get":{"tags":["API Routes"],"parameters":[{"name":"experimentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/invites":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/invites/{id}/accept":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/invites/{id}/cancel":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/invites/{id}/decline":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/partners":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/schemas":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/submissions/{assignmentId}/dream":{"post":{"tags":["API Routes"],"parameters":[{"name":"assignmentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/ourmoji/submissions/{assignmentId}/guess":{"post":{"tags":["API Routes"],"parameters":[{"name":"assignmentId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/preferences":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"put":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/presets":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/presets/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"put":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/push/subscribe":{"delete":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/push/vapid-key":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/rhythms/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"get":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"put":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/rhythms/{id}/progress":{"get":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/rhythms":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/rhythms/seed-defaults":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/subcategories":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/subscription/status":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/activity":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/feedback/{id}":{"patch":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/feedback":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/health":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/ourmoji/daily":{"post":{"tags":["Ourmoji","Admin"],"parameters":[],"responses":{"200":{"description":"Ourmoji entry upserted"},"400":{"description":"Validation error or target user does not have ourmoji enabled"},"401":{"description":"Missing or invalid Bearer token"},"403":{"description":"Caller is not an admin"},"404":{"description":"Target user not found"}},"summary":"Ingest a daily Ourmoji on behalf of a user (admin)","description":"Posts a single day's Ourmoji payload for a target user. Intended for trusted server-to-server agents authenticated with an admin API key. Idempotent per (userId, date). Optional `timestamp` (ISO-8601) defaults to server-side NOW; its calendar date must match `date`. Optional `category` / `subcategory` default to 'moments' / 'magic' for new entries.","security":[{"bearerAuth":["admin:users:write"]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["userId","date","emoji","reflection","moonPhase","timezone"],"properties":{"userId":{"type":"string"},"date":{"type":"string","format":"date"},"emoji":{"type":"string","minLength":1,"maxLength":16},"reflection":{"type":"string","minLength":1,"maxLength":5000},"moonPhase":{"type":"string"},"moonIllumination":{"type":"number","minimum":0,"maximum":100,"nullable":true},"wheelOfYear":{"type":"string","nullable":true},"wheelCategory":{"type":"string","nullable":true},"timezone":{"type":"string"},"timestamp":{"type":"string","format":"date-time","nullable":true},"category":{"type":"string","nullable":true},"subcategory":{"type":"string","nullable":true}}}}}}}},"/api/v1/admin/stats":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/test-email":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/users/{id}":{"get":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"patch":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/users/{id}/modules":{"patch":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/users/{id}/reset-password":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/users/{id}/sessions":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/admin/users":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/auth/keys":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/auth/keys/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/entries/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"get":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"patch":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/entries/bulk":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/entries":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/export/entries":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/export/obsidian":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/health":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/import/csv":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/import/insight-timer":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/import/json":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/insights/correlations":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/insights/patterns":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/insights/summary":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/rhythms":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/sync/mappings/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/sync/mappings":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/sync/status":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/sync/trigger":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/v1/webhooks/{id}":{"delete":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}},"patch":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/webhooks/{id}/test":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/v1/webhooks":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/version":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/voice/structure":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/voice/transcribe":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/voice/usage":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/voice/validate-key":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/current":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/history":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/messages/{id}/dismiss":{"post":{"tags":["API Routes"],"parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/preview":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/settings":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}},"put":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/test-email":{"post":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api/weekly-rhythms/unsubscribe/{token}":{"get":{"tags":["API Routes"],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/__nuxt_error":{"get":{"tags":["Internal"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/__nuxt_island/{*param1}":{"get":{"tags":["Internal"],"parameters":[{"name":"*param1","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK"}}}},"/api/openapi.json":{"get":{"tags":["API Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}},"/api-docs":{"get":{"tags":["App Routes"],"parameters":[],"responses":{"200":{"description":"OK"}}}}}}