{"openapi":"3.1.1","info":{"title":"saascode Public Catalog API","version":"1.0.0","description":"Read-only access to visible catalog products. No authentication is required. Prices are in USD, not cents. This specification covers public catalog discovery only; private account, administration, payment and Genesis MCP operations retain their own authorization.","termsOfService":"https://saascode.ai/terms","contact":{"name":"saascode support","url":"https://saascode.ai/support"}},"servers":[{"url":"https://saascode.ai","description":"saascode public website"}],"security":[],"externalDocs":{"description":"Usage, errors, rate limits and Markdown representations","url":"https://saascode.ai/developers.md"},"tags":[{"name":"Catalog","description":"Discover publicly visible products and read their details."}],"paths":{"/api/catalog":{"get":{"operationId":"listCatalogProducts","tags":["Catalog"],"summary":"List or search visible catalog products","description":"Search the public catalog and paginate the results. Optional filters are combined. An empty result is a successful response with an empty array. Draft and archived products are excluded, including when a status filter requests them. Multiple tag filters require all selected tags. Handle 429 with Retry-After and use backoff for transient failures.","parameters":[{"name":"search","in":"query","required":false,"description":"Text query used to find catalog products.","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Category slug.","schema":{"type":"string"}},{"name":"subcategory","in":"query","required":false,"description":"Subcategory slug.","schema":{"type":"string"}},{"name":"pricing_tier","in":"query","required":false,"description":"Filter by a pricing_tier value returned by the catalog.","schema":{"type":"string"}},{"name":"tag","in":"query","required":false,"description":"Tag slugs; repeated parameters or comma-separated values. All tags must match.","style":"form","explode":true,"schema":{"type":"array","items":{"type":"string"}}},{"name":"tags","in":"query","required":false,"description":"Legacy comma-separated tag slugs; ignored when tag is supplied.","schema":{"type":"string"}},{"name":"status","in":"query","required":false,"description":"Comma-separated visible lifecycle statuses: published, featured, coming_soon, beta. Omitting it includes all visible statuses.","schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"description":"Ordering. home additionally filters to products with a configured home showcase order.","schema":{"type":"string","enum":["featured","newest","alphabetical","popular","rating","home"],"default":"featured"}},{"name":"page","in":"query","required":false,"description":"One-based page number.","schema":{"type":"integer","minimum":1,"default":1}},{"name":"pageSize","in":"query","required":false,"description":"Results per page, capped at 50.","schema":{"type":"integer","minimum":1,"maximum":50,"default":12}},{"name":"limit","in":"query","required":false,"description":"Legacy alias for pageSize; ignored when pageSize is supplied.","schema":{"type":"integer","minimum":1,"maximum":50}}],"responses":{"200":{"description":"A page of visible products and pagination metadata.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogPage"}}}},"429":{"description":"Request rate exceeded. Wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Catalog temporarily unavailable; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}},"/api/catalog/{slug}":{"get":{"operationId":"getCatalogProduct","tags":["Catalog"],"summary":"Read a visible product by slug","description":"Resolve a slug from listCatalogProducts, then retrieve its public details. Unknown and non-public products both return 404. No private product fields are exposed. Additional public details can be present beyond the stable fields documented here.","parameters":[{"name":"slug","in":"path","required":true,"description":"The product slug returned by listCatalogProducts.","schema":{"type":"string","minLength":1}}],"responses":{"200":{"description":"The public product, under both data and the legacy catalogProduct key.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CatalogDetail"}}}},"404":{"description":"Product does not exist or is not public. Search /api/catalog for a current slug.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}},"429":{"description":"Request rate exceeded. Wait before retrying.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}},"headers":{"Retry-After":{"description":"Seconds to wait before retrying.","schema":{"type":"integer","minimum":1}}}},"500":{"description":"Catalog temporarily unavailable; retry with backoff.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiError"}}}}}}}},"components":{"schemas":{"CatalogProduct":{"type":"object","additionalProperties":true,"description":"Stable public product fields shared by listing and detail responses. Additional public fields can be added without changing this contract. Nullable fields may have no supplied value.","required":["id","name","slug","status"],"properties":{"id":{"type":"string","format":"uuid","description":"Product identifier."},"name":{"type":"string","description":"Public product name."},"slug":{"type":"string","description":"URL slug used by the product page and detail operation."},"status":{"type":"string","enum":["published","featured","coming_soon","beta"],"description":"Public lifecycle status; visibility alone does not mean ready to purchase."},"tagline":{"type":["string","null"],"description":"Short public summary."},"description":{"type":["string","null"],"description":"Public product description."},"price_regular":{"type":["number","null"],"description":"Standard license price in USD."},"client_price_usd":{"type":["number","null"],"description":"Client license price in USD when available."},"effective_price":{"type":["number","null"],"description":"Effective Standard license price in USD when returned."},"pricing_tier":{"type":["string","null"],"description":"Catalog pricing tier identifier."},"plus_only":{"type":"boolean","description":"Whether purchase requires membership."},"demo_url":{"type":["string","null"],"description":"Public demo URL when supplied."},"cover_image_url":{"type":["string","null"],"description":"Public cover image URL when supplied."}}},"CatalogPage":{"type":"object","required":["data","catalogProducts","count","total","total_pages","page"],"properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CatalogProduct"},"description":"Products in the requested page."},"catalogProducts":{"type":"array","items":{"$ref":"#/components/schemas/CatalogProduct"},"description":"Legacy alias of data."},"count":{"type":"integer","minimum":0,"description":"Total matching products; alias of total."},"total":{"type":"integer","minimum":0,"description":"Total matching products across all pages."},"total_pages":{"type":"integer","minimum":0,"description":"Number of pages for the selected page size."},"page":{"type":"integer","minimum":1,"description":"Current page number."}}},"CatalogDetail":{"type":"object","required":["data","catalogProduct"],"properties":{"data":{"$ref":"#/components/schemas/CatalogProduct"},"catalogProduct":{"$ref":"#/components/schemas/CatalogProduct"}}},"ApiError":{"type":"object","required":["error","code","message","hint","docs"],"properties":{"error":{"type":"string","description":"Legacy human-readable message, retained for existing clients."},"code":{"type":"string","description":"Stable machine-readable error identifier."},"message":{"type":"string","description":"Human-readable explanation, without internal exception details."},"hint":{"type":"string","description":"Suggested recovery action."},"docs":{"type":"string","description":"Path to the public API documentation."}}}}}}