[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"navigation_docs":3,"-api-overview":100,"-api-overview-surround":713},[4,35,80,90],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20,25,30],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F2.introduction","i-lucide-house",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F3.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Project Structure","\u002Fgetting-started\u002Fproject-structure","1.getting-started\u002F4.project-structure","i-lucide-folder-tree",{"title":26,"path":27,"stem":28,"icon":29},"Backend Server","\u002Fgetting-started\u002Fbackend","1.getting-started\u002F6.backend","i-lucide-server",{"title":31,"path":32,"stem":33,"icon":34},"Troubleshooting","\u002Fgetting-started\u002Ftroubleshooting","1.getting-started\u002F8.troubleshooting","i-lucide-wrench",{"title":36,"icon":6,"path":37,"stem":38,"children":39,"page":6},"API","\u002Fapi","2.api",[40,45,50,55,60,65,70,75],{"title":41,"path":42,"stem":43,"icon":44},"API Overview","\u002Fapi\u002Foverview","2.api\u002F1.overview","i-lucide-zap",{"title":46,"path":47,"stem":48,"icon":49},"TMDB Integration","\u002Fapi\u002Ftmdb-proxy","2.api\u002F2.tmdb-proxy","i-si-movie-line",{"title":51,"path":52,"stem":53,"icon":54},"Watched and My List APIs","\u002Fapi\u002Fwatched-movies","2.api\u002F3.watched-movies","i-lucide-eye",{"title":56,"path":57,"stem":58,"icon":59},"Recommendation Generation","\u002Fapi\u002Fgemini-recommendations","2.api\u002F4.gemini-recommendations","i-lucide-sparkles",{"title":61,"path":62,"stem":63,"icon":64},"Movie Search API","\u002Fapi\u002Fmovie-search","2.api\u002F5.movie-search","i-lucide-search",{"title":66,"path":67,"stem":68,"icon":69},"TMDB Import","\u002Fapi\u002Ftmdb-import","2.api\u002F6.tmdb-import","i-lucide-database",{"title":71,"path":72,"stem":73,"icon":74},"Movie Details & Caching","\u002Fapi\u002Fmovie-details","2.api\u002F7.movie-details","i-lucide-film",{"title":76,"path":77,"stem":78,"icon":79},"Recommendations (Cached)","\u002Fapi\u002Frecommendations-cache","2.api\u002F8.recommendations-cache","i-lucide-brain",{"title":81,"icon":6,"path":82,"stem":83,"children":84,"page":6},"Frontend","\u002Ffrontend","4.frontend",[85],{"title":86,"path":87,"stem":88,"icon":89},"Components","\u002Ffrontend\u002Fcomponents","4.frontend\u002F1.components","i-lucide-layout",{"title":91,"icon":6,"path":92,"stem":93,"children":94,"page":6},"Reference","\u002Freference","5.reference",[95],{"title":96,"path":97,"stem":98,"icon":99},"Rate Limiting","\u002Freference\u002Frate-limiting","5.reference\u002F2.rate-limiting","i-lucide-shield",{"id":101,"title":41,"body":102,"description":704,"extension":705,"links":706,"meta":707,"navigation":708,"path":42,"seo":709,"stem":43,"__hash__":712},"docs\u002F2.api\u002F1.overview.md",{"type":103,"value":104,"toc":696},"minimark",[105,109,172,179,184,357,361,364,522,526,529,547,554,572,578,584,587,601,605,634,638,692],[106,107,108],"p",{},"The Movie Recommender server currently exposes nine active API surfaces:",[110,111,112,119,125,131,137,143,149,155,161],"ul",{},[113,114,115,118],"li",{},[116,117,76],"strong",{}," - Main recommendation endpoint used by the home page",[113,120,121,124],{},[116,122,123],{},"Recommendation Quota"," - Remaining daily recommendation budget for the signed-in user",[113,126,127,130],{},[116,128,129],{},"Auth Signup"," - Server-side account creation with hCaptcha token submission",[113,132,133,136],{},[116,134,135],{},"Watched Movies API"," - Read and update user watched movies in Supabase",[113,138,139,142],{},[116,140,141],{},"My List API"," - Read and update the user's saved TMDB IDs",[113,144,145,148],{},[116,146,147],{},"Movie Search"," - Search TMDB movies for the search page",[113,150,151,154],{},[116,152,153],{},"Popular Movies"," - Cached TMDB popular feed for anonymous browsing",[113,156,157,160],{},[116,158,159],{},"Movie Details"," - Fetch movie metadata with Supabase-backed caching",[113,162,163,166,167,171],{},[116,164,165],{},"TMDB Import (Admin)"," - Populate the Supabase ",[168,169,170],"code",{},"movies"," corpus from TMDB exports",[106,173,174,175,178],{},"All APIs are served from the server under ",[168,176,177],{},"\u002Fapi\u002F",".",[180,181,183],"h2",{"id":182},"quick-reference","Quick Reference",[185,186,187,205],"table",{},[188,189,190],"thead",{},[191,192,193,196,199,202],"tr",{},[194,195,36],"th",{},[194,197,198],{},"Base URL",[194,200,201],{},"Auth",[194,203,204],{},"Notes",[206,207,208,224,238,267,282,297,311,325,339],"tbody",{},[191,209,210,213,218,221],{},[211,212,76],"td",{},[211,214,215],{},[168,216,217],{},"\u002Fapi\u002Frecommend",[211,219,220],{},"Bearer token (Supabase session)",[211,222,223],{},"AI client, cached for 7 days",[191,225,226,228,233,235],{},[211,227,123],{},[211,229,230],{},[168,231,232],{},"\u002Fapi\u002Frecommend\u002Fquota",[211,234,220],{},[211,236,237],{},"Remaining per-user daily recommendation quota",[191,239,240,242,247,250],{},[211,241,129],{},[211,243,244],{},[168,245,246],{},"\u002Fapi\u002Fauth\u002Fsignup",[211,248,249],{},"None",[211,251,252,253,256,257,256,260,263,264],{},"Server-side signup with ",[168,254,255],{},"email",", ",[168,258,259],{},"password",[168,261,262],{},"username",", and ",[168,265,266],{},"captchaToken",[191,268,269,272,277,279],{},[211,270,271],{},"Watched Movies",[211,273,274],{},[168,275,276],{},"\u002Fapi\u002Fwatched",[211,278,220],{},[211,280,281],{},"Hydrated movie cards on reads",[191,283,284,287,292,294],{},[211,285,286],{},"My List",[211,288,289],{},[168,290,291],{},"\u002Fapi\u002Fmylist",[211,293,220],{},[211,295,296],{},"Uses Supabase RPC helpers on writes",[191,298,299,301,306,308],{},[211,300,147],{},[211,302,303],{},[168,304,305],{},"\u002Fapi\u002Fmovies\u002Fsearch",[211,307,249],{},[211,309,310],{},"TMDB-backed search endpoint",[191,312,313,315,320,322],{},[211,314,153],{},[211,316,317],{},[168,318,319],{},"\u002Fapi\u002Fmovies\u002Fpopular",[211,321,249],{},[211,323,324],{},"Cached TMDB popular feed",[191,326,327,329,334,336],{},[211,328,159],{},[211,330,331],{},[168,332,333],{},"\u002Fapi\u002Fmovies\u002F:id",[211,335,249],{},[211,337,338],{},"Supabase-backed detail cache",[191,340,341,343,348,354],{},[211,342,165],{},[211,344,345],{},[168,346,347],{},"\u002Fapi\u002Fadmin\u002Ftmdb-import",[211,349,350,353],{},[168,351,352],{},"x-admin-token"," header",[211,355,356],{},"Imports the TMDB corpus into Supabase",[180,358,360],{"id":359},"environment-variables","Environment Variables",[106,362,363],{},"Required configuration for API functionality:",[365,366,371],"pre",{"className":367,"code":368,"language":369,"meta":370,"style":370},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark","NUXT_TMDB_API_KEY=your_tmdb_api_key_here\nNUXT_GOOGLE_API_KEY=your_google_ai_studio_key\nNUXT_GOOGLE_MODELS=gemini-flash-lite-latest,gemini-2.5-flash-lite,gemini-2.0-flash-lite\nNUXT_OPENROUTER_API_KEY=your_openrouter_api_key\nNUXT_OPENROUTER_MODELS=google\u002Fgemini-2.5-flash-lite\nNUXT_PUBLIC_SUPABASE_URL=your_supabase_url\nNUXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key\nNUXT_SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key\nNUXT_PUBLIC_HCAPTCHA_SITE_KEY=your_hcaptcha_site_key\nNUXT_HCAPTCHA_SECRET=your_hcaptcha_secret\nADMIN_API_TOKEN=your_admin_token\nUPSTASH_REDIS_REST_URL=your_upstash_url_here\nUPSTASH_REDIS_REST_TOKEN=your_upstash_key_here\n","bash","",[168,372,373,390,401,412,423,434,445,456,467,478,489,500,511],{"__ignoreMap":370},[374,375,378,382,386],"span",{"class":376,"line":377},"line",1,[374,379,381],{"class":380},"su5hD","NUXT_TMDB_API_KEY",[374,383,385],{"class":384},"smGrS","=",[374,387,389],{"class":388},"s_sjI","your_tmdb_api_key_here\n",[374,391,393,396,398],{"class":376,"line":392},2,[374,394,395],{"class":380},"NUXT_GOOGLE_API_KEY",[374,397,385],{"class":384},[374,399,400],{"class":388},"your_google_ai_studio_key\n",[374,402,404,407,409],{"class":376,"line":403},3,[374,405,406],{"class":380},"NUXT_GOOGLE_MODELS",[374,408,385],{"class":384},[374,410,411],{"class":388},"gemini-flash-lite-latest,gemini-2.5-flash-lite,gemini-2.0-flash-lite\n",[374,413,415,418,420],{"class":376,"line":414},4,[374,416,417],{"class":380},"NUXT_OPENROUTER_API_KEY",[374,419,385],{"class":384},[374,421,422],{"class":388},"your_openrouter_api_key\n",[374,424,426,429,431],{"class":376,"line":425},5,[374,427,428],{"class":380},"NUXT_OPENROUTER_MODELS",[374,430,385],{"class":384},[374,432,433],{"class":388},"google\u002Fgemini-2.5-flash-lite\n",[374,435,437,440,442],{"class":376,"line":436},6,[374,438,439],{"class":380},"NUXT_PUBLIC_SUPABASE_URL",[374,441,385],{"class":384},[374,443,444],{"class":388},"your_supabase_url\n",[374,446,448,451,453],{"class":376,"line":447},7,[374,449,450],{"class":380},"NUXT_PUBLIC_SUPABASE_ANON_KEY",[374,452,385],{"class":384},[374,454,455],{"class":388},"your_supabase_anon_key\n",[374,457,459,462,464],{"class":376,"line":458},8,[374,460,461],{"class":380},"NUXT_SUPABASE_SERVICE_ROLE_KEY",[374,463,385],{"class":384},[374,465,466],{"class":388},"your_supabase_service_role_key\n",[374,468,470,473,475],{"class":376,"line":469},9,[374,471,472],{"class":380},"NUXT_PUBLIC_HCAPTCHA_SITE_KEY",[374,474,385],{"class":384},[374,476,477],{"class":388},"your_hcaptcha_site_key\n",[374,479,481,484,486],{"class":376,"line":480},10,[374,482,483],{"class":380},"NUXT_HCAPTCHA_SECRET",[374,485,385],{"class":384},[374,487,488],{"class":388},"your_hcaptcha_secret\n",[374,490,492,495,497],{"class":376,"line":491},11,[374,493,494],{"class":380},"ADMIN_API_TOKEN",[374,496,385],{"class":384},[374,498,499],{"class":388},"your_admin_token\n",[374,501,503,506,508],{"class":376,"line":502},12,[374,504,505],{"class":380},"UPSTASH_REDIS_REST_URL",[374,507,385],{"class":384},[374,509,510],{"class":388},"your_upstash_url_here\n",[374,512,514,517,519],{"class":376,"line":513},13,[374,515,516],{"class":380},"UPSTASH_REDIS_REST_TOKEN",[374,518,385],{"class":384},[374,520,521],{"class":388},"your_upstash_key_here\n",[180,523,525],{"id":524},"authentication","Authentication",[106,527,528],{},"Public signup route:",[110,530,531,544],{},[113,532,533,535,536,256,538,256,540,263,542],{},[168,534,246],{}," accepts ",[168,537,255],{},[168,539,259],{},[168,541,262],{},[168,543,266],{},[113,545,546],{},"Duplicate-email responses are intentional so the UI can send existing users back to login",[106,548,549,550,553],{},"Protected routes require a Supabase bearer token (",[168,551,552],{},"Authorization: Bearer ...","):",[110,555,556,560,564,568],{},[113,557,558],{},[168,559,217],{},[113,561,562],{},[168,563,232],{},[113,565,566],{},[168,567,276],{},[113,569,570],{},[168,571,291],{},[106,573,574,575,577],{},"Admin route requires ",[168,576,352],{},":",[110,579,580],{},[113,581,582],{},[168,583,347],{},[180,585,96],{"id":586},"rate-limiting",[110,588,589,595,598],{},[113,590,591,592],{},"TMDB-backed requests share a server-side quota enforced in ",[168,593,594],{},"server\u002Futils\u002Ftmdb\u002Fclient.ts",[113,596,597],{},"Recommendation generation is limited per authenticated user",[113,599,600],{},"Rate-limit headers are included on limited responses",[180,602,604],{"id":603},"data-notes","Data Notes",[110,606,607,612,618,624],{},[113,608,609,611],{},[168,610,170],{}," is the current Supabase source for imported titles and cached movie details",[113,613,614,617],{},[168,615,616],{},"user_watched_movies"," stores watched state as one row per user\u002Fmovie pair",[113,619,620,623],{},[168,621,622],{},"user_my_list"," stores saved TMDB IDs and is mutated through RPC functions",[113,625,626,629,630,633],{},[168,627,628],{},"recommendations"," caches ",[168,631,632],{},"tmdb_ids"," instead of full recommendation objects",[180,635,637],{"id":636},"next-steps","Next Steps",[110,639,640,649,654,659,666,671,676,681,686],{},[113,641,642,643,646,647],{},"See ",[644,645,76],"a",{"href":77}," for ",[168,648,217],{},[113,650,642,651,653],{},[644,652,46],{"href":47}," for how the server reaches TMDB",[113,655,642,656,658],{},[644,657,135],{"href":52}," for watched list and My List reads\u002Fwrites",[113,660,642,661,663,664],{},[644,662,56],{"href":57}," for the AI flow used by ",[168,665,217],{},[113,667,642,668,670],{},[644,669,147],{"href":62}," for search endpoint behavior",[113,672,642,673,675],{},[644,674,159],{"href":72}," for metadata with caching",[113,677,642,678,680],{},[644,679,66],{"href":67}," for admin import behavior",[113,682,642,683,685],{},[644,684,26],{"href":27}," for server architecture",[113,687,642,688,691],{},[644,689,690],{"href":87},"Frontend Components"," for how the UI consumes these APIs",[693,694,695],"style",{},"html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":370,"searchDepth":392,"depth":392,"links":697},[698,699,700,701,702,703],{"id":182,"depth":392,"text":183},{"id":359,"depth":392,"text":360},{"id":524,"depth":392,"text":525},{"id":586,"depth":392,"text":96},{"id":603,"depth":392,"text":604},{"id":636,"depth":392,"text":637},"Current API reference for the Movie Recommender server","md",null,{},{"icon":44},{"title":710,"description":711},"API Reference","Explore the currently available APIs in Movie Recommender","0Ca4RmIZUavpoUY2r1gSdJ3-g9SF4c1zEo1r17xeZsQ",[714,716],{"title":31,"path":32,"stem":33,"description":715,"icon":34,"children":-1},"Development setup issues and solutions",{"title":46,"path":47,"stem":48,"description":717,"icon":49,"children":-1},"Internal TMDB access used by the current movie search and movie detail routes",1782138811119]