{"openapi":"3.0.0","info":{"title":"Personal Developer Hub API","version":"2.0.0","description":"Comprehensive API documentation for Personal Developer Hub - A collection of 55+ tools, utilities, and services for developers including Vietnamese localization, AI tools, security testing, media processing, and more.","contact":{"name":"API Support","email":"admin@leoodz.dev"},"license":{"name":"MIT","url":"https://opensource.org/licenses/MIT"}},"servers":[{"url":"https://leoodz.dev/api","description":"Production server"}],"tags":[{"name":"Authentication","description":"User authentication and session management"},{"name":"Blog","description":"Blog management and content creation"},{"name":"Comments","description":"Comment system for blog posts"},{"name":"Vietnamese Services","description":"Vietnam-specific data and localization services"},{"name":"Media Tools","description":"Media download and processing tools"},{"name":"AI Tools","description":"AI-powered generation and processing tools"},{"name":"Security Tools","description":"Security testing and analysis tools"},{"name":"Analytics","description":"Website analytics and visitor tracking"},{"name":"Learning","description":"Educational content and interactive roadmaps"},{"name":"Challenges","description":"Coding challenges and programming problems"},{"name":"Utilities","description":"General utility APIs and developer tools"},{"name":"Legal","description":"Vietnamese legal document search and analysis"},{"name":"Network Tools","description":"Network analysis and testing tools"}],"paths":{"/blog/posts":{"get":{"tags":["Blog"],"summary":"Get all blog posts","description":"Retrieve all blog posts with optional filtering for drafts","responses":{"200":{"description":"List of blog posts","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/BlogPost"}}}}}}},"post":{"tags":["Blog"],"summary":"Create a new blog post","description":"Create a new blog post with GitHub storage integration for production","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBlogPost"}}}},"responses":{"201":{"description":"Blog post created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"slug":{"type":"string"},"environment":{"type":"string","enum":["github","local"]}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}},"delete":{"tags":["Blog"],"summary":"Delete a blog post","description":"Delete a blog post by slug","security":[{"bearerAuth":[]}],"parameters":[{"name":"slug","in":"query","required":true,"description":"Blog post slug to delete","schema":{"type":"string"}}],"responses":{"200":{"description":"Blog post deleted successfully","content":{"application/json":{"schema":{"type":"object","properties":{"message":{"type":"string"},"slug":{"type":"string"},"environment":{"type":"string"}}}}}},"401":{"$ref":"#/components/responses/Unauthorized"},"403":{"$ref":"#/components/responses/Forbidden"}}}},"/blog/generate":{"post":{"tags":["Blog","AI Tools"],"summary":"Generate blog post with AI","description":"Generate blog post content using AI with customizable parameters","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["topic"],"properties":{"topic":{"type":"string","description":"Blog post topic"},"category":{"type":"string","default":"tutorial"},"language":{"type":"string","default":"javascript"},"style":{"type":"string","enum":["tutorial","guide","article","news"]}}}}}},"responses":{"200":{"description":"Blog post generated successfully","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"slug":{"type":"string"},"title":{"type":"string"},"content":{"type":"string"},"frontmatter":{"type":"object"}}}}}}}}},"/comments":{"get":{"tags":["Comments"],"summary":"Get comments for a blog post","description":"Retrieve comments for a specific blog post","parameters":[{"name":"postSlug","in":"query","required":true,"description":"Blog post slug","schema":{"type":"string"}}],"responses":{"200":{"description":"Comments retrieved successfully","content":{"application/json":{"schema":{"type":"object","properties":{"comments":{"type":"array","items":{"$ref":"#/components/schemas/Comment"}},"warning":{"type":"string"}}}}}}}},"post":{"tags":["Comments"],"summary":"Add a new comment","description":"Add a comment to a blog post (requires authentication)","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["postSlug","content"],"properties":{"postSlug":{"type":"string"},"content":{"type":"string"},"parentId":{"type":"string","description":"Parent comment ID for replies"}}}}}},"responses":{"201":{"description":"Comment created successfully","content":{"application/json":{"schema":{"type":"object","properties":{"comment":{"$ref":"#/components/schemas/Comment"},"warning":{"type":"string"}}}}}}}},"delete":{"tags":["Comments"],"summary":"Delete a comment","description":"Delete a comment (only by author)","security":[{"bearerAuth":[]}],"parameters":[{"name":"id","in":"query","required":true,"description":"Comment ID to delete","schema":{"type":"string"}}],"responses":{"200":{"description":"Comment deleted successfully"}}}},"/analytics/visitors":{"get":{"tags":["Analytics"],"summary":"Get visitor analytics","description":"Get recent visitor data (admin only)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Visitor analytics data","content":{"application/json":{"schema":{"type":"object","properties":{"visitors":{"type":"array","items":{"$ref":"#/components/schemas/VisitorInfo"}}}}}}}}},"post":{"tags":["Analytics"],"summary":"Track visitor","description":"Track a new visitor to the website","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"url":{"type":"string"},"referrer":{"type":"string"}}}}}},"responses":{"200":{"description":"Visitor tracked successfully"}}}},"/vn-holidays":{"get":{"tags":["Vietnamese Services"],"summary":"Get Vietnamese holidays","description":"Retrieve Vietnamese public holidays for current or specified year","parameters":[{"name":"year","in":"query","description":"Year to get holidays for (default: current year)","schema":{"type":"integer","minimum":2020,"maximum":2030}}],"responses":{"200":{"description":"List of Vietnamese holidays","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"year":{"type":"number"},"holidays":{"type":"array","items":{"type":"object","properties":{"date":{"type":"string","format":"date"},"name":{"type":"string"},"type":{"type":"string"},"description":{"type":"string"}}}}}}}}}}}},"/vn-market":{"get":{"tags":["Vietnamese Services"],"summary":"Get Vietnamese market data","description":"Retrieve Vietnamese stock market and commodity prices","responses":{"200":{"description":"Market data","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"gold":{"type":"object","description":"Gold prices"},"stocks":{"type":"object","description":"Stock market data"},"lastUpdated":{"type":"string","format":"date-time"}}}}}}}}}}},"/vn-exchange-rates":{"get":{"tags":["Vietnamese Services"],"summary":"Get Vietnamese bank exchange rates","description":"Retrieve official exchange rates from Vietnamese banks","responses":{"200":{"description":"Exchange rates from Vietnamese banks","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"rates":{"type":"object","additionalProperties":{"type":"object","properties":{"buy":{"type":"number"},"sell":{"type":"number"},"currency":{"type":"string"}}}},"source":{"type":"string"},"lastUpdated":{"type":"string","format":"date-time"}}}}}}}}},"/vietnam-fuel-prices":{"get":{"tags":["Vietnamese Services"],"summary":"Get Vietnamese fuel prices","description":"Retrieve current fuel prices in Vietnam","responses":{"200":{"description":"Current fuel prices","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"type":"object","properties":{"type":{"type":"string","description":"Fuel type"},"price":{"type":"number","description":"Price per liter"},"change":{"type":"number","description":"Price change"},"unit":{"type":"string","description":"Price unit"}}}},"lastUpdated":{"type":"string","format":"date-time"}}}}}}}}},"/vietnam-lottery":{"get":{"tags":["Vietnamese Services"],"summary":"Get Vietnamese lottery results","description":"Retrieve latest Vietnamese lottery results","parameters":[{"name":"date","in":"query","description":"Date for lottery results (YYYY-MM-DD)","schema":{"type":"string","format":"date"}},{"name":"region","in":"query","description":"Lottery region","schema":{"type":"string","enum":["north","central","south"]}}],"responses":{"200":{"description":"Lottery results","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"date":{"type":"string","format":"date"},"region":{"type":"string"},"results":{"type":"object","additionalProperties":{"type":"string"}}}}}}}}},"post":{"tags":["Vietnamese Services"],"summary":"Generate lottery numbers","description":"Generate lottery number predictions","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"region":{"type":"string","enum":["north","central","south"]},"type":{"type":"string"},"count":{"type":"integer","minimum":1,"maximum":10}}}}}},"responses":{"200":{"description":"Generated lottery numbers"}}}},"/quote-of-day":{"get":{"tags":["Vietnamese Services"],"summary":"Get Vietnamese quote of the day","description":"Returns a Vietnamese proverb with English translation, meaning, and category","responses":{"200":{"description":"Successful response","content":{"application/json":{"schema":{"type":"object","properties":{"vietnamese":{"type":"string","description":"Vietnamese proverb"},"english":{"type":"string","description":"English translation"},"meaning":{"type":"string","description":"Explanation of the proverb"},"category":{"type":"string","description":"Category/theme of the proverb"},"author":{"type":"string","description":"Author (if known)"},"date":{"type":"string","format":"date","description":"Current date"},"dayOfYear":{"type":"number","description":"Day of year (for selection logic)"}}}}}}}}},"/legal-documents":{"get":{"tags":["Legal"],"summary":"Search Vietnamese legal documents","description":"Search and retrieve Vietnamese legal documents from the government database","parameters":[{"name":"action","in":"query","required":true,"description":"Action to perform","schema":{"type":"string","enum":["categories","document-types","agencies","fields","signers","status","search","detail"]}},{"name":"kwd","in":"query","description":"Search keyword (for search action)","schema":{"type":"string"}},{"name":"uid","in":"query","description":"Document UID (for detail action)","schema":{"type":"string"}},{"name":"r","in":"query","description":"Number of results per page","schema":{"type":"integer","default":20}},{"name":"p","in":"query","description":"Page number","schema":{"type":"integer","default":1}}],"responses":{"200":{"description":"Legal document data","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object"},"action":{"type":"string"}}}}}}}},"post":{"tags":["Legal"],"summary":"Advanced legal document operations","description":"Perform advanced search and bulk operations on legal documents","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string","enum":["advanced-search","bulk-details"]},"kwd":{"type":"string"},"uids":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"200":{"description":"Operation completed successfully"}}}},"/media-download":{"post":{"tags":["Media Tools"],"summary":"Universal media downloader","description":"Download media from various social platforms","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Media URL"},"platform":{"type":"string","enum":["youtube","tiktok","instagram","twitter"]}}}}}},"responses":{"200":{"description":"Download links generated"}}}},"/youtube-download":{"post":{"tags":["Media Tools"],"summary":"Download YouTube video","description":"Extract download links for YouTube videos","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"YouTube video URL"},"quality":{"type":"string","enum":["highest","lowest","720p","1080p"],"default":"highest"}}}}}},"responses":{"200":{"description":"Download links extracted","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"title":{"type":"string"},"thumbnail":{"type":"string","format":"uri"},"duration":{"type":"string"},"formats":{"type":"array","items":{"type":"object","properties":{"quality":{"type":"string"},"url":{"type":"string","format":"uri"},"format":{"type":"string"}}}}}}}}}}}},"/tiktok-download":{"post":{"tags":["Media Tools"],"summary":"Download TikTok video","description":"Extract download links for TikTok videos","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"TikTok video URL"},"watermark":{"type":"boolean","default":false,"description":"Include watermark"}}}}}},"responses":{"200":{"description":"TikTok video download links"}}}},"/instagram-download":{"post":{"tags":["Media Tools"],"summary":"Download Instagram content","description":"Extract download links for Instagram posts, reels, and stories","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"Instagram content URL"}}}}}},"responses":{"200":{"description":"Instagram content download links"}}}},"/remove-background":{"post":{"tags":["AI Tools"],"summary":"Remove image background","description":"Remove background from images using AI","requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"type":"object","required":["image"],"properties":{"image":{"type":"string","format":"binary","description":"Image file to process"}}}}}},"responses":{"200":{"description":"Background removed successfully"}}}},"/perchance/text":{"post":{"tags":["AI Tools"],"summary":"Generate text with Perchance","description":"Generate creative text using Perchance AI","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Text generation prompt"},"style":{"type":"string","description":"Generation style"},"length":{"type":"integer","minimum":10,"maximum":1000,"default":100}}}}}},"responses":{"200":{"description":"Generated text"}}}},"/perchance/image":{"post":{"tags":["AI Tools"],"summary":"Generate image with Perchance","description":"Generate images using Perchance AI","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["prompt"],"properties":{"prompt":{"type":"string","description":"Image generation prompt"},"style":{"type":"string","description":"Art style"},"size":{"type":"string","enum":["512x512","768x768","1024x1024"],"default":"512x512"}}}}}},"responses":{"200":{"description":"Generated image"}}}},"/port-scan":{"post":{"tags":["Security Tools","Network Tools"],"summary":"Scan network ports","description":"Perform network port scanning on target hosts","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["host"],"properties":{"host":{"type":"string","description":"Target hostname or IP"},"ports":{"type":"string","description":"Port range (e.g., 1-1000)"},"timeout":{"type":"integer","default":5000}}}}}},"responses":{"200":{"description":"Port scan results"}}}},"/ssl-analyzer":{"post":{"tags":["Security Tools"],"summary":"Analyze SSL certificates","description":"Analyze SSL certificate information and security","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to analyze"},"port":{"type":"integer","default":443}}}}}},"responses":{"200":{"description":"SSL analysis results"}}}},"/whois":{"post":{"tags":["Network Tools"],"summary":"WHOIS lookup","description":"Perform WHOIS lookup for domain information","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Domain to lookup"}}}}}},"responses":{"200":{"description":"WHOIS information"}}}},"/subdomain-discovery":{"post":{"tags":["Security Tools"],"summary":"Discover subdomains","description":"Discover subdomains for a given domain","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["domain"],"properties":{"domain":{"type":"string","description":"Target domain"},"wordlist":{"type":"string","description":"Wordlist to use"}}}}}},"responses":{"200":{"description":"Discovered subdomains"}}}},"/learning/roadmaps":{"get":{"tags":["Learning"],"summary":"Get learning roadmaps","description":"Retrieve available learning roadmaps","responses":{"200":{"description":"List of roadmaps","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"roadmaps":{"type":"array","items":{"$ref":"#/components/schemas/Roadmap"}},"total":{"type":"number"}}}}}}}}},"/challenges":{"get":{"tags":["Challenges"],"summary":"Get coding challenges","description":"Retrieve coding challenges with optional filtering","parameters":[{"name":"difficulty","in":"query","description":"Filter by difficulty level","schema":{"type":"string","enum":["easy","medium","hard"]}},{"name":"tag","in":"query","description":"Filter by tag","schema":{"type":"string"}},{"name":"limit","in":"query","description":"Limit number of results","schema":{"type":"integer","minimum":1}}],"responses":{"200":{"description":"List of challenges","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"array","items":{"$ref":"#/components/schemas/Challenge"}},"total":{"type":"number"}}}}}}}}},"/api-proxy":{"post":{"tags":["Utilities"],"summary":"Proxy API requests","description":"Proxy API requests with SSRF protection and security measures","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","method"],"properties":{"url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["GET","POST","PUT","DELETE","PATCH"]},"headers":{"type":"object","additionalProperties":{"type":"string"}},"queryParams":{"type":"object","additionalProperties":{"type":"string"}},"body":{"type":"string"},"bodyType":{"type":"string","enum":["json","form","urlencoded"]}}}}}},"responses":{"200":{"description":"Proxied response"}}}},"/public-apis":{"get":{"tags":["Utilities"],"summary":"Get public APIs list","description":"Retrieve curated list of public APIs","parameters":[{"name":"category","in":"query","description":"Filter by API category","schema":{"type":"string"}},{"name":"https","in":"query","description":"Filter by HTTPS support","schema":{"type":"boolean"}}],"responses":{"200":{"description":"List of public APIs"}}}},"/wordlist/vietnamese":{"get":{"tags":["Security Tools","Vietnamese Services"],"summary":"Get Vietnamese wordlist","description":"Retrieve Vietnamese password wordlist for security testing","parameters":[{"name":"limit","in":"query","description":"Limit number of results","schema":{"type":"integer"}},{"name":"offset","in":"query","description":"Offset for pagination","schema":{"type":"integer","default":0}}],"responses":{"200":{"description":"Vietnamese wordlist data","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"total":{"type":"number"},"count":{"type":"number"},"offset":{"type":"number"},"passwords":{"type":"array","items":{"type":"string"}}}}}}}}},"post":{"tags":["Security Tools","Vietnamese Services"],"summary":"Search Vietnamese wordlist","description":"Search for specific terms in Vietnamese wordlist","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["searchTerm"],"properties":{"searchTerm":{"type":"string"},"limit":{"type":"integer","default":100}}}}}},"responses":{"200":{"description":"Search results"}}}},"/currency-rates":{"get":{"tags":["Utilities"],"summary":"Get currency exchange rates","description":"Fetch real-time currency exchange rates with fallback data","parameters":[{"name":"base","in":"query","description":"Base currency code (default: usd)","schema":{"type":"string","default":"usd"}},{"name":"currencies","in":"query","description":"Comma-separated list of target currencies","schema":{"type":"string","default":"vnd,eur,jpy,krw,cny,thb,sgd"}}],"responses":{"200":{"description":"Currency rates data"}}}},"/rss":{"get":{"tags":["Utilities"],"summary":"Get RSS feed","description":"Generate RSS feed for blog posts and updates","responses":{"200":{"description":"RSS feed","content":{"application/rss+xml":{"schema":{"type":"string","description":"RSS XML feed"}}}}}}},"/youtube-mp3":{"post":{"tags":["Media Tools"],"summary":"Convert YouTube to MP3","description":"Extract audio from YouTube videos as MP3","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url"],"properties":{"url":{"type":"string","format":"uri","description":"YouTube video URL"},"quality":{"type":"string","enum":["128","192","256","320"],"default":"128"}}}}}},"responses":{"200":{"description":"MP3 download link generated","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean"},"title":{"type":"string"},"downloadUrl":{"type":"string","format":"uri"},"duration":{"type":"string"},"quality":{"type":"string"}}}}}}}}},"/proxy-request":{"post":{"tags":["Utilities","Network Tools"],"summary":"Proxy HTTP requests","description":"Forward HTTP requests through server proxy with security measures","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["url","method"],"properties":{"url":{"type":"string","format":"uri"},"method":{"type":"string","enum":["GET","POST","PUT","DELETE"]},"headers":{"type":"object","additionalProperties":{"type":"string"}},"body":{"type":"string"},"timeout":{"type":"integer","default":10000}}}}}},"responses":{"200":{"description":"Proxied response"}}}},"/analytics/visitors/export":{"get":{"tags":["Analytics"],"summary":"Export visitor data","description":"Export visitor analytics data to CSV (admin only)","security":[{"bearerAuth":[]}],"parameters":[{"name":"format","in":"query","description":"Export format","schema":{"type":"string","enum":["csv","json"],"default":"csv"}},{"name":"days","in":"query","description":"Number of days to include","schema":{"type":"integer","default":30}}],"responses":{"200":{"description":"Exported data"}}}},"/analytics/visitors/clear":{"delete":{"tags":["Analytics"],"summary":"Clear visitor data","description":"Clear all visitor analytics data (admin only)","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Visitor data cleared successfully"}}}},"/analytics/learning":{"post":{"tags":["Analytics","Learning"],"summary":"Track learning progress","description":"Track user learning progress and activities","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["action"],"properties":{"action":{"type":"string"},"roadmapId":{"type":"string"},"nodeId":{"type":"string"},"metadata":{"type":"object"}}}}}},"responses":{"200":{"description":"Learning progress tracked"}}}},"/placeholder/{...params}":{"get":{"tags":["Utilities"],"summary":"Generate placeholder data","description":"Generate placeholder images, text, or data for development","parameters":[{"name":"params","in":"path","required":true,"description":"Placeholder parameters","schema":{"type":"string"}}],"responses":{"200":{"description":"Placeholder content generated"}}}},"/learning/roadmaps/{slug}":{"get":{"tags":["Learning"],"summary":"Get specific roadmap","description":"Retrieve detailed information for a specific learning roadmap","parameters":[{"name":"slug","in":"path","required":true,"description":"Roadmap slug identifier","schema":{"type":"string"}}],"responses":{"200":{"description":"Roadmap details","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Roadmap"}}}}}}},"/learning/roadmaps/{slug}/progress":{"get":{"tags":["Learning"],"summary":"Get roadmap progress","description":"Get user progress for a specific roadmap","parameters":[{"name":"slug","in":"path","required":true,"description":"Roadmap slug","schema":{"type":"string"}}],"responses":{"200":{"description":"Progress data"}}},"post":{"tags":["Learning"],"summary":"Update roadmap progress","description":"Update user progress for a roadmap node","parameters":[{"name":"slug","in":"path","required":true,"description":"Roadmap slug","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["nodeId","status"],"properties":{"nodeId":{"type":"string"},"status":{"type":"string","enum":["pending","in-progress","completed"]}}}}}},"responses":{"200":{"description":"Progress updated"}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"JWT"}},"schemas":{"BlogPost":{"type":"object","properties":{"slug":{"type":"string"},"title":{"type":"string"},"excerpt":{"type":"string"},"content":{"type":"string"},"publishedAt":{"type":"string","format":"date-time"},"tags":{"type":"array","items":{"type":"string"}},"readingTime":{"type":"number"},"series":{"type":"string"},"author":{"type":"string"},"draft":{"type":"boolean"}}},"CreateBlogPost":{"type":"object","required":["title","content"],"properties":{"title":{"type":"string"},"content":{"type":"string"},"excerpt":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"series":{"type":"string"},"draft":{"type":"boolean","default":true}}},"Comment":{"type":"object","properties":{"id":{"type":"string"},"postSlug":{"type":"string"},"author":{"type":"string"},"content":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"parentId":{"type":"string"}}},"VisitorInfo":{"type":"object","properties":{"id":{"type":"string"},"timestamp":{"type":"string","format":"date-time"},"ip":{"type":"string"},"userAgent":{"type":"string"},"country":{"type":"string"},"city":{"type":"string"},"url":{"type":"string"},"referrer":{"type":"string"},"browser":{"type":"string"},"os":{"type":"string"}}},"Challenge":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"difficulty":{"type":"string","enum":["easy","medium","hard"]},"tags":{"type":"array","items":{"type":"string"}},"examples":{"type":"array"},"constraints":{"type":"array","items":{"type":"string"}}}},"Roadmap":{"type":"object","properties":{"id":{"type":"string"},"title":{"type":"string"},"description":{"type":"string"},"category":{"type":"string"},"isUpcoming":{"type":"boolean"},"isNew":{"type":"boolean"},"isFeatured":{"type":"boolean"},"url":{"type":"string"},"metadata":{"type":"object","properties":{"estimatedTime":{"type":"string"},"difficulty":{"type":"string"},"lastUpdated":{"type":"string","format":"date-time"}}}}},"Error":{"type":"object","properties":{"success":{"type":"boolean","example":false},"error":{"type":"string","description":"Error message"},"code":{"type":"string","description":"Error code"}}},"Success":{"type":"object","properties":{"success":{"type":"boolean","example":true},"message":{"type":"string","description":"Success message"}}}},"responses":{"BadRequest":{"description":"Bad request","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Unauthorized":{"description":"Authentication required","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"Forbidden":{"description":"Access denied","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"InternalError":{"description":"Internal server error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}