{"openapi":"3.1.0","info":{"title":"EarlyHunt Public API","version":"1.0.0","description":"Read-only public API for discovering EarlyHunt AI launches, projects, categories, and site search. No authentication required for these endpoints. Write actions (submit, vote, checkout) use the website session (NextAuth) and are not part of this public surface.","contact":{"name":"EarlyHunt","email":"hi@earlyhunt.com","url":"https://earlyhunt.com/contact"},"license":{"name":"Proprietary — public read access for agents and integrators"}},"servers":[{"url":"https://earlyhunt.com","description":"Production"}],"tags":[{"name":"Search","description":"Site-wide search across projects, launches, blog, and studio"},{"name":"Projects","description":"Public AI project listings"},{"name":"Categories","description":"Category hubs"},{"name":"Weeks","description":"Current launch week window"},{"name":"Discovery","description":"Machine-readable site indexes"}],"paths":{"/api/v1/search":{"get":{"operationId":"searchSite","tags":["Search"],"summary":"Search EarlyHunt","description":"Search public projects, launch stories, blog posts, and studio content. Minimum query length is 2 characters.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":2},"description":"Search query"},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":24,"default":8}},{"name":"grouped","in":"query","required":false,"schema":{"type":"boolean","default":false},"description":"When true, results are grouped by content type"}],"responses":{"200":{"description":"Search results","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResponse"}}}},"400":{"$ref":"#/components/responses/Error"}}}},"/api/v1/projects":{"get":{"operationId":"listProjects","tags":["Projects"],"summary":"List public projects","description":"List scheduled, ongoing, or launched projects. Pending drafts are never returned.","parameters":[{"name":"status","in":"query","schema":{"type":"string","enum":["ongoing","scheduled","launched","all"],"default":"ongoing"}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":50,"default":20}},{"name":"offset","in":"query","schema":{"type":"integer","minimum":0,"default":0}}],"responses":{"200":{"description":"Project list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectListResponse"}}}},"400":{"$ref":"#/components/responses/Error"}}}},"/api/v1/projects/{slug}":{"get":{"operationId":"getProjectBySlug","tags":["Projects"],"summary":"Get a project by slug","description":"Return a single public project listing by URL slug.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Project detail","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ProjectDetailResponse"}}}},"404":{"$ref":"#/components/responses/Error"}}}},"/api/v1/categories":{"get":{"operationId":"listCategories","tags":["Categories"],"summary":"List categories","description":"Return EarlyHunt category hubs used to browse AI projects.","responses":{"200":{"description":"Category list","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryListResponse"}}}}}}},"/api/v1/weeks/current":{"get":{"operationId":"getCurrentWeek","tags":["Weeks"],"summary":"Current launch week","description":"Return the active or next weekly launch window (Monday 8:00 AM UTC cadence).","responses":{"200":{"description":"Current week window","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CurrentWeekResponse"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiSpec","tags":["Discovery"],"summary":"OpenAPI specification","description":"This document.","responses":{"200":{"description":"OpenAPI 3.1 JSON","content":{"application/json":{"schema":{"type":"object"}}}}}}},"/llms.txt":{"get":{"operationId":"getLlmsTxt","tags":["Discovery"],"summary":"llms.txt site identity","description":"Site identity index for AI agents: when to use EarlyHunt, hubs, and Markdown URL patterns.","responses":{"200":{"description":"Plain-text llms.txt","content":{"text/plain":{"schema":{"type":"string"}}}}}}}},"components":{"schemas":{"ApiError":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string"},"message":{"type":"string"},"hint":{"type":"string"},"details":{}}}}},"PublicProject":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"name":{"type":"string"},"slug":{"type":"string"},"short_description":{"type":"string","nullable":true},"website_url":{"type":"string","format":"uri"},"logo_url":{"type":"string","nullable":true},"launch_status":{"type":"string","enum":["scheduled","ongoing","launched"]},"categories":{"type":"array","items":{"type":"string"}},"upvote_count":{"type":"integer"},"is_premium":{"type":"boolean"},"html_url":{"type":"string","format":"uri"},"markdown_url":{"type":"string","format":"uri"}}},"SearchResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object"}}},"ProjectListResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"projects":{"type":"array","items":{"$ref":"#/components/schemas/PublicProject"}},"total":{"type":"integer"},"limit":{"type":"integer"},"offset":{"type":"integer"}}}}},"ProjectDetailResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"project":{"$ref":"#/components/schemas/PublicProject"}}}}},"CategoryListResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"categories":{"type":"array","items":{"type":"object","properties":{"name":{"type":"string"},"slug":{"type":"string"},"html_url":{"type":"string"}}}}}}}},"CurrentWeekResponse":{"type":"object","properties":{"success":{"type":"boolean"},"data":{"type":"object","properties":{"start_date":{"type":"string","format":"date-time","nullable":true},"end_date":{"type":"string","format":"date-time","nullable":true},"status":{"type":"string","nullable":true}}}}}},"responses":{"Error":{"description":"Structured JSON error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}