{"openapi":"3.1.0","info":{"title":"AtlasRepo Public API","version":"2026-09-08","description":"Platform API serves AtlasRepo accounts, access, billing and approved public catalog and content projections."},"servers":[{"url":"https://public-api.atlasrepo.com","description":"AtlasRepo public API"}],"security":[{"ApiKeyAuth":[]},{"BearerAuth":[]}],"components":{"securitySchemes":{"ApiKeyAuth":{"type":"apiKey","in":"header","name":"x-api-key"},"BearerAuth":{"type":"http","scheme":"bearer"}},"schemas":{"CourseOutline":{"type":"object","required":["id","slug","releaseId","releaseNo","title","summary","locale","author","chapters"],"properties":{"id":{"type":"string"},"slug":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"},"releaseId":{"type":"string"},"releaseNo":{"type":"integer","minimum":1},"publishedAt":{"type":"string","format":"date-time"},"title":{"type":"string"},"summary":{"type":"string"},"locale":{"type":"string"},"author":{"type":"object","additionalProperties":true},"chapters":{"type":"array","items":{"type":"object","required":["id","title","materials"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"materials":{"type":"array","items":{"$ref":"#/components/schemas/CourseMaterialOutline"}}}}}}},"CourseMaterialOutline":{"type":"object","additionalProperties":false,"required":["id","title","type","locked","lockReason"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"type":{"type":"string","enum":["article","instruction","file","video","task"]},"durationSeconds":{"type":["integer","null"],"minimum":0},"locked":{"type":"boolean"},"lockReason":{"type":["string","null"]}}},"CourseOutlineV2":{"type":"object","additionalProperties":true,"required":["id","slug","releaseId","releaseNo","schemaVersion","requestedLocale","resolvedLocale","localeFallback","title","summary","chapters","counts"],"properties":{"id":{"type":"string"},"slug":{"type":"string"},"releaseId":{"type":"string"},"releaseNo":{"type":"integer"},"schemaVersion":{"type":"integer","const":2},"requestedLocale":{"type":"string"},"resolvedLocale":{"type":"string"},"localeFallback":{"type":"boolean"},"title":{"type":"string"},"summary":{"type":"string"},"coverAssetId":{"type":["string","null"]},"counts":{"type":"object","additionalProperties":false,"required":["lessonCount","promptCount","skillCount"],"properties":{"lessonCount":{"type":"integer"},"promptCount":{"type":"integer"},"skillCount":{"type":"integer"}}},"chapters":{"type":"array","items":{"type":"object"}}}},"PulseResponse":{"type":"object","additionalProperties":false,"required":["generated_at","data_freshness","score_version","next_cursor","totals","partial","view","sections"],"properties":{"generated_at":{"type":"string","format":"date-time"},"data_freshness":{"type":"object","additionalProperties":false,"required":["status","newest_at","stale_after_seconds"],"properties":{"status":{"type":"string","enum":["fresh","stale","partial","empty"]},"newest_at":{"type":["string","null"],"format":"date-time"},"stale_after_seconds":{"type":"integer","minimum":1}}},"score_version":{"type":"string","const":"pulse-read-model-v2"},"next_cursor":{"type":"null"},"totals":{"type":"object","additionalProperties":{"type":"integer","minimum":0}},"partial":{"type":"boolean"},"view":{"type":"string","enum":["home","full"]},"sections":{"type":"object","additionalProperties":false,"properties":{"repositories":{"$ref":"#/components/schemas/PulseSection"},"news":{"$ref":"#/components/schemas/PulseSection"},"workflows":{"$ref":"#/components/schemas/PulseSection"},"templates":{"$ref":"#/components/schemas/PulseSection"},"skills":{"$ref":"#/components/schemas/PulseSection"},"mcp":{"$ref":"#/components/schemas/PulseSection"},"models":{"$ref":"#/components/schemas/PulseSection"},"ai_companies":{"$ref":"#/components/schemas/PulseSection"}}}}},"PulseSection":{"type":"object","additionalProperties":false,"required":["state","source","reason","last_updated_at","total","page_size","next_cursor","watermark","items"],"properties":{"state":{"type":"string","enum":["ready","empty","unavailable"]},"source":{"type":"string"},"reason":{"type":["string","null"],"enum":["no_published_items","no_published_model_catalog","source_unavailable",null]},"last_updated_at":{"type":["string","null"],"format":"date-time"},"total":{"type":"integer","minimum":0},"page_size":{"type":"integer","minimum":0},"next_cursor":{"type":["string","null"]},"watermark":{"type":["string","null"],"format":"date-time"},"items":{"type":"array","items":{"$ref":"#/components/schemas/PulseItem"}}}},"PulseItem":{"type":"object","additionalProperties":false,"required":["id","kind","title","summary","href","source_url","image_url","score","tags","updated_at"],"properties":{"id":{"type":"string"},"kind":{"type":"string","enum":["repositories","news","workflows","templates","skills","mcp","models","ai_companies"]},"title":{"type":"string"},"summary":{"type":"string"},"href":{"type":"string"},"source_url":{"type":"string"},"image_url":{"type":["string","null"]},"score":{"type":["number","null"]},"tags":{"type":"array","items":{"type":"string"}},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Category":{"type":"object","required":["name","description","activeRepoCount"],"properties":{"name":{"type":"string"},"description":{"type":"string"},"activeRepoCount":{"type":"integer","minimum":0}}}}},"tags":[{"name":"Course Learning"},{"name":"Attribution","description":"Public allowlisted content campaign redirects"},{"name":"Core","description":"Authenticated AtlasRepo Core workspaces and evidence-backed task dossiers"},{"name":"Courses","description":"Native immutable Course publishing and ACL-aware learner flow"},{"name":"Pulse","description":"Public fail-soft projections for AtlasRepo home and Pulse surfaces"},{"name":"Content","description":"Published editorial content and internal Scout publication projection"},{"name":"Catalog","description":"Ranked open-source repository catalog"},{"name":"Stories","description":"Published use-case stories and workflows"},{"name":"Tools","description":"Normalized tools referenced by stories"},{"name":"Skills","description":"Published AI-agent skills with source, license, compatibility and risk metadata"},{"name":"AI Companies"},{"name":"Models"},{"name":"Account","description":"Authenticated account and API key management"}],"paths":{"/api/courses/{courseId}/start":{"post":{"tags":["Course Learning"],"summary":"Start the first accessible lesson","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/progress":{"get":{"tags":["Course Learning"],"summary":"Read retained course progress","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/releases/{releaseId}/materials/{materialId}/progress":{"put":{"tags":["Course Learning"],"summary":"Save learner progress","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["state"],"properties":{"state":{"type":"string","enum":["not_started","in_progress","completed"]},"positionSeconds":{"type":["integer","null"],"minimum":0,"maximum":86400}}}}}},"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/releases/{releaseId}/materials/{materialId}/note":{"get":{"tags":["Course Learning"],"summary":"Read your private lesson note","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}},"put":{"tags":["Course Learning"],"summary":"Save your private lesson note","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["note"],"properties":{"note":{"type":"string","minLength":1,"maxLength":20000}}}}}},"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}},"delete":{"tags":["Course Learning"],"summary":"Delete your private lesson note","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"204":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/releases/{releaseId}/tasks/{taskId}/submissions":{"post":{"tags":["Course Learning"],"summary":"Submit task evidence","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"taskId","in":"path","required":true,"schema":{"type":"string"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"required":["evidence"],"properties":{"evidence":{"description":"Non-null JSON evidence, at most 100000 UTF-8 bytes when serialized."}}}}}},"responses":{"200":{"description":"Idempotent replay"},"201":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/releases/{releaseId}/materials/{materialId}/playback-session":{"post":{"tags":["Course Learning"],"summary":"Request authorized video playback","security":[{},{"BearerAuth":[]}],"description":"Anonymous access is permitted only for public materials. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/releases/{releaseId}/materials/{materialId}/download-session":{"post":{"tags":["Course Learning"],"summary":"Request an authorized material download","security":[{},{"BearerAuth":[]}],"description":"Anonymous access is permitted only for public materials. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/api/courses/{courseId}/releases/{releaseId}/agent/query":{"post":{"tags":["Course Learning"],"summary":"Ask a question over accessible course material","security":[{"BearerAuth":[]}],"description":"Requires an authenticated learner. Platform checks access to the requested release and material. Responses are private and must not be cached.","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["query"],"properties":{"query":{"type":"string","minLength":1,"maxLength":2000}}}}}},"responses":{"200":{"description":"Success"},"400":{"description":"Invalid request body or idempotency key"},"401":{"description":"Authentication required"},"403":{"description":"Material access denied"},"404":{"description":"Release or material not found"},"409":{"description":"Operation not applicable to this material or conflicting submission"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Required storage or provider unavailable"}}}},"/go/{code}":{"get":{"tags":["Attribution"],"summary":"Resolve one active content campaign tracking link","security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{3,96}$"}}],"responses":{"302":{"description":"Allowlisted immutable destination version"},"404":{"description":"Tracking link not found"},"410":{"description":"Tracking link unavailable"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Tracking link service unavailable"}}},"head":{"tags":["Attribution"],"summary":"Check one active tracking redirect without recording a touch","security":[],"parameters":[{"name":"code","in":"path","required":true,"schema":{"type":"string","pattern":"^[A-Za-z0-9_-]{3,96}$"}}],"responses":{"302":{"description":"Allowlisted immutable destination version without attribution capture"},"404":{"description":"Tracking link not found"},"410":{"description":"Tracking link unavailable"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Tracking link service unavailable"}}}},"/claim/{token}":{"get":{"tags":["Attribution"],"summary":"Exchange a short-lived social claim token for a protected first-party cookie","security":[],"parameters":[{"name":"token","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"303":{"description":"Claim cookie set and redirected to the clean signup URL"},"404":{"description":"Unknown claim"},"409":{"description":"Claim already consumed by another account"},"410":{"description":"Expired claim"},"429":{"description":"Rate limit exceeded"},"503":{"description":"Claim service unavailable"}}}},"/api/core/workspaces":{"get":{"tags":["Core"],"summary":"List Core workspaces visible to the authenticated user","security":[{"BearerAuth":[]}],"responses":{"200":{"description":"Workspace list"},"401":{"description":"Authentication required"}}},"post":{"tags":["Core"],"summary":"Create a Core workspace and owner membership","security":[{"BearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["slug","name"],"properties":{"slug":{"type":"string"},"name":{"type":"string"}}}}}},"responses":{"201":{"description":"Workspace created"},"401":{"description":"Authentication required"},"409":{"description":"Slug conflict"},"413":{"description":"Request body too large"}}}},"/api/core/workspaces/{workspaceId}/dossiers":{"get":{"tags":["Core"],"summary":"List task dossiers in one authorized workspace","security":[{"BearerAuth":[]}],"parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dossier list"},"401":{"description":"Authentication required"},"404":{"description":"Workspace not visible"}}},"post":{"tags":["Core"],"summary":"Persist a validated Core task dossier","security":[{"BearerAuth":[]}],"description":"Requires an Idempotency-Key header. New task dossiers must use revision 1.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["document"],"properties":{"document":{"type":"object","additionalProperties":true}}}}}},"responses":{"201":{"description":"Dossier created"},"401":{"description":"Authentication required"},"403":{"description":"Editor or owner role required"},"409":{"description":"Identity or idempotency conflict"},"413":{"description":"Request body too large"},"422":{"description":"Core contract rejected"}}}},"/api/core/workspaces/{workspaceId}/dossiers/{dossierId}":{"get":{"tags":["Core"],"summary":"Get one authorized task dossier","security":[{"BearerAuth":[]}],"parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"dossierId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Dossier and current ETag"},"401":{"description":"Authentication required"},"404":{"description":"Dossier not visible"}}},"put":{"tags":["Core"],"summary":"Write the next validated dossier revision","security":[{"BearerAuth":[]}],"description":"Requires exact If-Match and Idempotency-Key headers. The Core document revision must increment by one.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"dossierId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"If-Match","in":"header","required":true,"schema":{"type":"integer","minimum":1}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["document"],"properties":{"document":{"type":"object","additionalProperties":true},"status":{"type":"string","enum":["draft","ready","archived"]}}}}}},"responses":{"200":{"description":"Dossier updated"},"401":{"description":"Authentication required"},"403":{"description":"Editor or owner role required"},"409":{"description":"Version or idempotency conflict"},"413":{"description":"Request body too large"},"422":{"description":"Core contract rejected"}}}},"/api/core/workspaces/{workspaceId}/workflow-releases":{"post":{"tags":["Core"],"summary":"Import an immutable Core v0.2 workflow module release","security":[{"BearerAuth":[]}],"description":"Feature-off unless CORE_V02_ARTIFACTS_ENABLED=true. Requires workspace editor access and Idempotency-Key.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["document"],"properties":{"document":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Identical immutable release replayed"},"201":{"description":"Release imported"},"401":{"description":"Authentication required"},"403":{"description":"Editor or owner role required"},"409":{"description":"Identity or idempotency conflict"},"413":{"description":"Request body too large"},"422":{"description":"Core contract rejected"},"503":{"description":"Feature disabled"}}}},"/api/core/workspaces/{workspaceId}/workflow-releases/{moduleId}/{version}":{"get":{"tags":["Core"],"summary":"Get an exact immutable workflow module release","security":[{"BearerAuth":[]}],"description":"Feature-off unless CORE_V02_ARTIFACTS_ENABLED=true.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"moduleId","in":"path","required":true,"schema":{"type":"string"}},{"name":"version","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Exact release"},"401":{"description":"Authentication required"},"404":{"description":"Workspace or release not visible"},"503":{"description":"Feature disabled"}}}},"/api/core/workspaces/{workspaceId}/routes":{"post":{"tags":["Core"],"summary":"Import an immutable Core v0.2 pinned route","security":[{"BearerAuth":[]}],"description":"Validates the route against exact stored dossier and release pins without network or model calls.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["document"],"properties":{"document":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Identical route replayed"},"201":{"description":"Route imported"},"401":{"description":"Authentication required"},"403":{"description":"Editor or owner role required"},"409":{"description":"Identity or idempotency conflict"},"413":{"description":"Request body too large"},"422":{"description":"Pinned dependency or composition rejected"},"503":{"description":"Feature disabled"}}}},"/api/core/workspaces/{workspaceId}/routes/{routeId}":{"get":{"tags":["Core"],"summary":"Get an immutable pinned route","security":[{"BearerAuth":[]}],"description":"Feature-off unless CORE_V02_ARTIFACTS_ENABLED=true.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"routeId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Pinned route"},"401":{"description":"Authentication required"},"404":{"description":"Workspace or route not visible"},"503":{"description":"Feature disabled"}}}},"/api/core/workspaces/{workspaceId}/decision-packs":{"post":{"tags":["Core"],"summary":"Import an immutable recomposed Decision Pack","security":[{"BearerAuth":[]}],"description":"Recomposes the pack from exact stored pins and requires canonical equality before insertion.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"Idempotency-Key","in":"header","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["document"],"properties":{"document":{"type":"object","additionalProperties":true}}}}}},"responses":{"200":{"description":"Identical Decision Pack replayed"},"201":{"description":"Decision Pack imported"},"401":{"description":"Authentication required"},"403":{"description":"Editor or owner role required"},"409":{"description":"Identity or idempotency conflict"},"413":{"description":"Request body too large"},"422":{"description":"Recomposition or pinned dependency rejected"},"503":{"description":"Feature disabled"}}}},"/api/core/workspaces/{workspaceId}/decision-packs/{decisionPackId}":{"get":{"tags":["Core"],"summary":"Get an immutable Decision Pack","security":[{"BearerAuth":[]}],"description":"Feature-off unless CORE_V02_ARTIFACTS_ENABLED=true.","parameters":[{"name":"workspaceId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}},{"name":"decisionPackId","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Decision Pack"},"401":{"description":"Authentication required"},"404":{"description":"Workspace or Decision Pack not visible"},"503":{"description":"Feature disabled"}}}},"/api/courses":{"get":{"tags":["Courses"],"summary":"List published Courses with resource-scoped lock states","security":[],"parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Published Course outlines","content":{"application/json":{"schema":{"type":"object","properties":{"contractVersion":{"type":"integer","const":1},"items":{"type":"array","items":{"oneOf":[{"$ref":"#/components/schemas/CourseOutline"},{"$ref":"#/components/schemas/CourseOutlineV2"}]}}}}}}}}}},"/api/courses/{slug}":{"get":{"tags":["Courses"],"summary":"Get one published Course outline","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}},{"name":"locale","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Course v1 or localized v2 outline","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/CourseOutline"},{"$ref":"#/components/schemas/CourseOutlineV2"}]}}}},"404":{"description":"Course not found"}}}},"/api/courses/{courseId}/releases/{releaseId}/materials/{materialId}":{"get":{"tags":["Courses"],"summary":"Get one exact-release material after server-side access decision","security":[],"parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}},{"name":"locale","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"Authorized v1 material or localized v2 lesson with explicit locale fallback marker"},"401":{"description":"Sign-in required, locked metadata only"},"403":{"description":"Locked metadata only, without blocks, asset IDs, checksums, or URLs"},"404":{"description":"Material or release not found"}}}},"/api/courses/{courseId}/releases/{releaseId}/materials/{materialId}/assets/{assetId}/delivery-session":{"post":{"operationId":"createCourseMaterialAssetDeliverySession","tags":["Courses"],"summary":"Issue a short-lived delivery session for one canonical authorized material asset","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"materialId","in":"path","required":true,"schema":{"type":"string"}},{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["purpose"],"properties":{"purpose":{"type":"string","enum":["inline","attachment"]}}}}}},"responses":{"201":{"description":"Short-lived clean and published asset delivery"},"401":{"description":"Authentication required without asset disclosure"},"403":{"description":"Material locked without asset disclosure"},"404":{"description":"Asset is not referenced by this canonical material"},"409":{"description":"Asset is not ready"}}}},"/api/courses/{courseId}/releases/{releaseId}/assets/{assetId}/delivery-session":{"post":{"operationId":"createCourseReleaseAssetDeliverySession","tags":["Courses"],"summary":"Issue a short-lived delivery session for the canonical Course cover or author avatar","parameters":[{"name":"courseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"releaseId","in":"path","required":true,"schema":{"type":"string"}},{"name":"assetId","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","additionalProperties":false,"required":["purpose"],"properties":{"purpose":{"type":"string","enum":["inline","attachment"]}}}}}},"responses":{"201":{"description":"Short-lived delivery with courseId, releaseId, assetId, purpose, and delivery"},"403":{"description":"No accessible material in this exact release"},"404":{"description":"Asset is not this release's cover or author avatar"},"409":{"description":"Asset is not ready"}}}},"/api/pulse/home":{"get":{"tags":["Pulse"],"summary":"Get the bounded AtlasRepo home Pulse preview","description":"Returns up to six real published items per section. Empty and unavailable sources are represented explicitly and never replaced with fabricated cards.","security":[],"parameters":[{"name":"limit","in":"query","schema":{"type":"integer","default":4,"minimum":1,"maximum":6}}],"responses":{"200":{"description":"Home Pulse projection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PulseResponse"}}}},"503":{"description":"Database is not configured"}}}},"/api/pulse":{"get":{"tags":["Pulse"],"summary":"Get the full AtlasRepo Pulse projection","description":"Returns independent repository, news, workflow, template, skill, MCP, model and AI-company sections with exact totals, watermarks, and per-section cursors. Individual source failures produce a partial response with an unavailable section.","security":[],"parameters":[{"name":"types","in":"query","description":"Comma-separated section names","schema":{"type":"string","example":"repositories,news,skills"}},{"name":"limit","in":"query","schema":{"type":"integer","default":12,"minimum":1,"maximum":50}},{"name":"repositories_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"news_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"workflows_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"templates_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"skills_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"mcp_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"models_cursor","in":"query","schema":{"type":"integer","minimum":0}},{"name":"ai_companies_cursor","in":"query","schema":{"type":"integer","minimum":0}}],"responses":{"200":{"description":"Pulse projection","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PulseResponse"}}}},"400":{"description":"Unknown section in types"},"503":{"description":"Database is not configured"}}}},"/api/content/blog-posts":{"get":{"tags":["Content"],"summary":"List published AtlasRepo blog articles","security":[],"responses":{"200":{"description":"Published article summaries"}}}},"/api/content/blog-posts/{slug}":{"get":{"tags":["Content"],"summary":"Get one published blog article","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$"}}],"responses":{"200":{"description":"Published article with source and editorial metadata"},"404":{"description":"Not found"}}}},"/api/scout-feed":{"get":{"tags":["Catalog"],"summary":"Public hourly Scout feed preview","description":"Returns the full enriched feed by default. Pass `view=light` for the trimmed landing variant (card + localized descriptions only, without the verbose enrichment fields). Both variants are gzip/Brotli-compressed and support ETag/If-None-Match conditional GET.","security":[],"parameters":[{"name":"view","in":"query","required":false,"schema":{"type":"string","enum":["full","light"],"default":"full"},"description":"Feed shape. `light` omits enrichment fields for a smaller payload."}],"responses":{"200":{"description":"Scout feed snapshot"}}}},"/api/categories":{"get":{"tags":["Catalog"],"summary":"List Scout categories","description":"Anonymous endpoint returning AtlasRepo category descriptions and active repository counts.","security":[],"responses":{"200":{"description":"Categories with active repository counts","content":{"application/json":{"schema":{"type":"object","required":["items","totalActiveRepos","source"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Category"}},"totalActiveRepos":{"type":"integer","minimum":0},"source":{"type":"string","enum":["postgres","file"]}}}}}}}}},"/api/catalog/top":{"get":{"tags":["Catalog"],"summary":"Public repository catalog page","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Full-text query"},{"name":"niche","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"subcategory","in":"query","schema":{"type":"string"},"description":"catalog-page.v2 only: matches categories after the primary category."},{"name":"source","in":"query","schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}},{"name":"sort","in":"query","schema":{"type":"string","enum":["score","stars","updated","name"],"default":"score"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"default":24,"maximum":100}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque continuation cursor. Legacy decimal offsets remain accepted."},{"name":"limit","in":"query","schema":{"type":"integer","default":24,"maximum":100},"description":"Backward-compatible alias for pageSize."},{"name":"contract","in":"query","schema":{"type":"string","enum":["catalog-page.v1","catalog-page.v2"],"default":"catalog-page.v1"},"description":"Opt into v2 hierarchical taxonomy. The default v1 envelope remains unchanged."}],"responses":{"200":{"description":"Deterministic catalog-page.v1 or opt-in catalog-page.v2 envelope with exact full filtered totals, full catalog total, facets and continuation cursor. v2 defines categories[0] as the primary category and categories[1..] as subcategories."}}}},"/api/catalog/search":{"get":{"tags":["Catalog"],"summary":"Search the full Scout catalog","description":"Requires a paid API key or active paid session. Free accounts do not receive API access.","parameters":[{"name":"q","in":"query","schema":{"type":"string"},"description":"Keyword query"},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"source","in":"query","schema":{"type":"string"}},{"name":"language","in":"query","schema":{"type":"string"}},{"name":"minScore","in":"query","schema":{"type":"number"}},{"name":"minStars","in":"query","schema":{"type":"integer"}},{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"sort","in":"query","schema":{"type":"string","enum":["score","stars","refreshed_at","discovered_at","updated_at"]}},{"name":"limit","in":"query","schema":{"type":"integer","default":25,"maximum":100}},{"name":"cursor","in":"query","schema":{"type":"string"},"description":"Opaque continuation cursor. Legacy decimal offsets remain accepted."}],"responses":{"200":{"description":"catalog-page.v1 results with exact full-DB total, deterministic ordering, URL-page metadata and an opaque nextCursor."},"402":{"description":"Paid API key required"}}}},"/api/catalog/solve":{"post":{"tags":["Catalog"],"summary":"Solve a task against the Scout catalog","security":[],"description":"Uses semantic retrieval plus fail-closed lexical grounding when an embedding provider is configured, then falls back to Postgres full-text keyword ranking when embeddings are unavailable. Ungrounded semantic candidates are omitted instead of being presented as task matches.","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["task"],"properties":{"task":{"type":"string","description":"Natural-language task or problem statement"},"limit":{"type":"integer","default":10,"maximum":100},"filters":{"type":"object","additionalProperties":false,"properties":{"category":{"type":"string"},"language":{"type":"string"},"minScore":{"type":"number"},"minStars":{"type":"integer"},"source":{"type":"string"}}}}}}}},"responses":{"200":{"description":"Grounded catalog-solve.v1 matches with whyItFits reasons, matchedTaskTerms, query metadata and an explicit qualityGate. total is returned grounded rows, totalIndexed is the exact eligible full-index population, and candidateCount is the bounded materialized safety window."},"503":{"description":"Database is not configured"}}}},"/api/stories":{"get":{"tags":["Stories"],"summary":"Search published stories","description":"Anonymous/free access returns public stories. Paid keys may request paid/private visibility.","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"tag","in":"query","schema":{"type":"string"}},{"name":"type","in":"query","schema":{"type":"string"}},{"name":"dateFrom","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"dateTo","in":"query","schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50}},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":50},"description":"Backward-compatible alias for pageSize."}],"responses":{"200":{"description":"catalog-page.v2 results with server facets, deterministic ordering and the exact full filtered total. The legacy stories and limit fields remain present."}}}},"/api/stories/{slug}":{"get":{"tags":["Stories"],"summary":"Get one story by slug","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Story detail"},"404":{"description":"Not found"}}}},"/api/repos/{owner}/{name}":{"get":{"tags":["Catalog"],"summary":"Get one repository with linked stories","parameters":[{"name":"owner","in":"path","required":true,"schema":{"type":"string"}},{"name":"name","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Repository detail"},"404":{"description":"Not found"}}}},"/api/tools":{"get":{"tags":["Tools"],"summary":"Search normalized tools","parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"kind","in":"query","schema":{"type":"string"}},{"name":"minQuality","in":"query","schema":{"type":"number"}}],"responses":{"200":{"description":"Tools"}}}},"/api/skills":{"get":{"tags":["Skills"],"summary":"Public published AI-agent skills catalog","description":"Server-paginated catalog of published agent skills. Items include source attribution, license, compatibility, install steps, risk level, score, last verification date and update cadence. Pending, rejected and delisted records are never exposed. The bounded curated catalog is used only when PostgreSQL is not configured; a configured database failure is reported as unavailable instead of silently truncating results.","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"agent","in":"query","schema":{"type":"string"}},{"name":"tag","in":"query","schema":{"type":"string"}},{"name":"source","in":"query","schema":{"type":"string"}},{"name":"risk","in":"query","schema":{"type":"string","enum":["low","medium","high"]}},{"name":"minScore","in":"query","schema":{"type":"number"}},{"name":"limit","in":"query","schema":{"type":"integer","default":50,"maximum":100}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":50,"maximum":100}},{"name":"cursor","in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":"catalog-page.v2 published Skills catalog"},"400":{"description":"Invalid or ambiguous pagination"}}}},"/api/skills/{slug}":{"get":{"tags":["Skills"],"summary":"Public published AI-agent skill detail","description":"Returns one published skill card by slug. Pending, rejected and delisted records are never exposed. Curated details are used only when PostgreSQL is not configured.","security":[],"parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Skill detail"},"404":{"description":"Skill not found"}}}},"/api/ai-companies":{"get":{"tags":["AI Companies"],"summary":"Public managed ready-made AI-company/team configs catalog","description":"Published templates from the Scout catalog. Items include roles, agents, skills, runtime assumptions, env requirements, safety notes, setup steps and manual import/export instructions. Draft, private, rejected, delisted and quarantined records are never returned.","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"skill","in":"query","schema":{"type":"string"}},{"name":"agent","in":"query","schema":{"type":"string"}},{"name":"role","in":"query","schema":{"type":"string"}},{"name":"runtime","in":"query","schema":{"type":"string"}},{"name":"risk","in":"query","schema":{"type":"string","enum":["low","medium","high"]}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":24}},{"name":"limit","in":"query","schema":{"type":"integer","maximum":100}}],"responses":{"200":{"description":"AI companies catalog"}}}},"/api/models":{"get":{"tags":["Models"],"summary":"Public published model catalog","description":"Canonical catalog-page.v2 endpoint backed by Scout PostgreSQL. Private, gated, draft, rejected and delisted models are never returned.","security":[],"parameters":[{"name":"q","in":"query","schema":{"type":"string"}},{"name":"category","in":"query","schema":{"type":"string"}},{"name":"pipeline","in":"query","schema":{"type":"string"}},{"name":"library","in":"query","schema":{"type":"string"}},{"name":"license","in":"query","schema":{"type":"string"}},{"name":"page","in":"query","schema":{"type":"integer","minimum":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","minimum":1,"maximum":100,"default":24}}],"responses":{"200":{"description":"Published models catalog"},"503":{"description":"Scout model catalog is not configured or migrated"}}}},"/api/huggingface/models":{"get":{"tags":["Models"],"summary":"Compatibility alias for the public model catalog","deprecated":true,"security":[],"responses":{"200":{"description":"Same published catalog as /api/models"}}}},"/api/tags":{"get":{"tags":["Stories"],"summary":"List public story tags","security":[],"responses":{"200":{"description":"Tags"}}}},"/api/recommendations":{"post":{"tags":["Stories"],"summary":"Recommend stories for a problem statement","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"query":{"type":"string"},"limit":{"type":"integer"}}}}}},"responses":{"200":{"description":"Recommended stories"}}}},"/api/account/submissions":{"get":{"tags":["Account"],"summary":"List current user's repo/story submissions","responses":{"200":{"description":"Submissions"},"401":{"description":"Auth required"}}},"post":{"tags":["Account"],"summary":"Submit a repo or story for admin review","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["kind","title","summary"],"properties":{"kind":{"type":"string","enum":["repo","story"]},"title":{"type":"string"},"url":{"type":"string"},"summary":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}}}}}}},"responses":{"201":{"description":"Submission created"}}}},"/api/account/api-key":{"get":{"tags":["Account"],"summary":"List API keys","description":"Free accounts can view this endpoint but cannot create API keys."},"post":{"tags":["Account"],"summary":"Create a paid API key","requestBody":{"required":false,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string"},"expiresInDays":{"type":["integer","null"],"description":"30, 90, 365, or null for no expiry"},"expiresAt":{"type":["string","null"],"format":"date-time"}}}}}},"responses":{"201":{"description":"API key created"},"402":{"description":"Paid subscription required"}}}},"/api/account/api-key/{id}":{"delete":{"tags":["Account"],"summary":"Revoke one API key","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"Key revoked"},"404":{"description":"Key not found"}}}},"/api/account/api-key/{id}/reissue":{"post":{"tags":["Account"],"summary":"Reissue one API key","description":"Revokes the old key and returns a new one-time token.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"201":{"description":"New API key created"},"404":{"description":"Key not found"}}}}}}