{"openapi":"3.1.0","info":{"title":"Findstack Catalog API","version":"1.0.0","summary":"Read-only access to the Findstack software catalog.","description":"Products, categories, pricing, features and integrations for business\nsoftware. No authentication required. Every catalog page is also\navailable as Markdown via `Accept: text/markdown` or an `.md` suffix.\n\n**Rate limit.** 120 requests per\n60 seconds per IP, shared across every\nendpoint. Every response carries `RateLimit`, `RateLimit-Policy` and\nthe `RateLimit-Limit` / `-Remaining` / `-Reset` fields; a 429 adds\n`Retry-After`. Pace against those rather than retrying blind.\n\n**Versioning.** The version is in the path. Breaking changes ship as a\nnew path version and this one keeps answering. A retirement would be\nannounced with a `Deprecation` header (RFC 9745) and a `Sunset` header\n(RFC 8594) at least 180 days ahead,\non every response of the affected version. Policy:\nhttps://findstack.com/developers#versioning","contact":{"name":"Findstack Support","email":"hello@findstack.com","url":"https://findstack.com/developers"},"license":{"name":"Catalog data may be cited with attribution","url":"https://findstack.com/terms"}},"servers":[{"url":"https://findstack.com/api/v1"}],"paths":{"/":{"get":{"operationId":"getApiIndex","summary":"API index: every endpoint, limit and policy in one document","responses":{"200":{"description":"Service description","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiIndex"}}}}}}},"/products":{"get":{"operationId":"listProducts","summary":"Search and filter software products","parameters":[{"name":"q","in":"query","required":false,"description":"Free-text product name search","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Restrict to a category slug","schema":{"type":"string"}},{"name":"tech_stack","in":"query","required":false,"description":"Restrict to a tech stack slug, e.g. `wordpress`","schema":{"type":"string"}},{"name":"segment","in":"query","required":false,"description":"Restrict to a company-size segment slug, e.g. `enterprise`","schema":{"type":"string"}},{"name":"free_plan","in":"query","required":false,"description":"Only products offering a free plan","schema":{"type":"boolean"}},{"name":"has_api","in":"query","required":false,"description":"Only products that expose an API","schema":{"type":"boolean"}},{"name":"has_ai","in":"query","required":false,"description":"Only products with AI features","schema":{"type":"boolean"}},{"name":"open_source","in":"query","required":false,"description":"Only open-source products","schema":{"type":"boolean"}},{"name":"sort","in":"query","required":false,"description":"Result ordering. Defaults to relevance when `q` is set, otherwise `rating`.","schema":{"type":"string","enum":["rating","reviews","popularity","newest","name"]}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"A page of results","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"429":{"description":"Rate limit exceeded (120 requests per 60 seconds)","headers":{"Retry-After":{"description":"Seconds until the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products/{slug}":{"get":{"operationId":"getProduct","summary":"Full detail for one product, including pricing and features","parameters":[{"name":"slug","in":"path","required":true,"description":"Product slug, e.g. `slack`","schema":{"type":"string"}}],"responses":{"200":{"description":"The requested resource","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Product"}}}}}},"404":{"description":"No such resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60 seconds)","headers":{"Retry-After":{"description":"Seconds until the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/products/{slug}/integrations":{"get":{"operationId":"listProductIntegrations","summary":"Products this product integrates with","parameters":[{"name":"slug","in":"path","required":true,"description":"Product slug","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"A page of results","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"429":{"description":"Rate limit exceeded (120 requests per 60 seconds)","headers":{"Retry-After":{"description":"Seconds until the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories":{"get":{"operationId":"listCategories","summary":"Browse software categories","parameters":[{"name":"q","in":"query","required":false,"description":"Free-text category name search","schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"A page of results","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/CategorySummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"429":{"description":"Rate limit exceeded (120 requests per 60 seconds)","headers":{"Retry-After":{"description":"Seconds until the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories/{slug}":{"get":{"operationId":"getCategory","summary":"Category detail with subcategories","parameters":[{"name":"slug","in":"path","required":true,"description":"Category slug, e.g. `crm`","schema":{"type":"string"}}],"responses":{"200":{"description":"The requested resource","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"$ref":"#/components/schemas/Category"}}}}}},"404":{"description":"No such resource","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (120 requests per 60 seconds)","headers":{"Retry-After":{"description":"Seconds until the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/categories/{slug}/products":{"get":{"operationId":"listCategoryProducts","summary":"Products in a category, with the same filters as /products","parameters":[{"name":"slug","in":"path","required":true,"description":"Category slug","schema":{"type":"string"}},{"name":"q","in":"query","required":false,"description":"Free-text product name search","schema":{"type":"string"}},{"name":"category","in":"query","required":false,"description":"Restrict to a category slug","schema":{"type":"string"}},{"name":"tech_stack","in":"query","required":false,"description":"Restrict to a tech stack slug, e.g. `wordpress`","schema":{"type":"string"}},{"name":"segment","in":"query","required":false,"description":"Restrict to a company-size segment slug, e.g. `enterprise`","schema":{"type":"string"}},{"name":"free_plan","in":"query","required":false,"description":"Only products offering a free plan","schema":{"type":"boolean"}},{"name":"has_api","in":"query","required":false,"description":"Only products that expose an API","schema":{"type":"boolean"}},{"name":"has_ai","in":"query","required":false,"description":"Only products with AI features","schema":{"type":"boolean"}},{"name":"open_source","in":"query","required":false,"description":"Only open-source products","schema":{"type":"boolean"}},{"name":"sort","in":"query","required":false,"description":"Result ordering. Defaults to relevance when `q` is set, otherwise `rating`.","schema":{"type":"string","enum":["rating","reviews","popularity","newest","name"]}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1}},{"name":"per_page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":25}}],"responses":{"200":{"description":"A page of results","content":{"application/json":{"schema":{"type":"object","properties":{"data":{"type":"array","items":{"$ref":"#/components/schemas/ProductSummary"}},"pagination":{"$ref":"#/components/schemas/Pagination"}}}}}},"429":{"description":"Rate limit exceeded (120 requests per 60 seconds)","headers":{"Retry-After":{"description":"Seconds until the window resets","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"ProductSummary":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"tagline":{"type":["string","null"]},"url":{"type":"string","format":"uri","description":"Canonical Findstack page"},"website":{"type":["string","null"],"format":"uri","description":"The vendor's own website"},"rating":{"type":["number","null"],"minimum":0,"maximum":5},"reviews_count":{"type":"integer"},"primary_category":{"$ref":"#/components/schemas/CategoryRef"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Product":{"allOf":[{"$ref":"#/components/schemas/ProductSummary"},{"type":"object","properties":{"description":{"type":["string","null"]},"pros":{"type":["string","null"]},"cons":{"type":["string","null"]},"logo_url":{"type":["string","null"],"format":"uri"},"vendor":{"type":["string","null"]},"categories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryRef"}},"pricing":{"$ref":"#/components/schemas/Pricing"},"features":{"type":"array","items":{"type":"string"}},"segments":{"type":"array","items":{"type":"string"}},"tech_stacks":{"type":"array","items":{"type":"string"}},"deployments":{"type":"array","items":{"type":"string"}},"capabilities":{"type":"object","properties":{"has_api":{"type":"boolean"},"has_cli":{"type":"boolean"},"has_ai":{"type":"boolean"},"open_source":{"type":"boolean"}}},"integrations_count":{"type":"integer"},"deals_count":{"type":"integer"},"markdown_url":{"type":"string","format":"uri","description":"Markdown representation of the product page"}}}]},"Pricing":{"type":"object","properties":{"has_free_plan":{"type":"boolean"},"has_free_trial":{"type":"boolean"},"plans":{"type":"array","items":{"$ref":"#/components/schemas/PricingPlan"}}}},"PricingPlan":{"type":"object","properties":{"name":{"type":["string","null"]},"price":{"type":["number","null"]},"currency":{"type":["string","null"],"description":"ISO 4217 code"},"billing_frequency":{"type":["string","null"],"enum":["one_time","per_month","every_6_months","per_year","every_2_years","every_3_years",null]},"starting_at":{"type":"boolean","description":"Price is a floor, not the exact price"},"free_plan":{"type":"boolean"},"free_trial":{"type":"boolean"}}},"CategoryRef":{"type":["object","null"],"properties":{"name":{"type":"string"},"slug":{"type":"string"}}},"CategorySummary":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"string"},"url":{"type":"string","format":"uri"},"products_count":{"type":"integer"},"updated_at":{"type":["string","null"],"format":"date-time"}}},"Category":{"allOf":[{"$ref":"#/components/schemas/CategorySummary"},{"type":"object","properties":{"description":{"type":["string","null"]},"parent":{"$ref":"#/components/schemas/CategoryRef"},"subcategories":{"type":"array","items":{"$ref":"#/components/schemas/CategoryRef"}},"markdown_url":{"type":"string","format":"uri"}}}]},"Pagination":{"type":"object","properties":{"page":{"type":"integer"},"per_page":{"type":"integer"},"total":{"type":"integer"},"total_pages":{"type":"integer"}}},"Error":{"type":"object","description":"Every failure, at every status, uses this shape.","properties":{"error":{"type":"object","required":["code","message"],"properties":{"code":{"type":"string","enum":["not_found","rate_limited","internal_error"],"description":"Stable machine-readable code; branch on this, not on the message."},"message":{"type":"string","description":"What went wrong, in one sentence."},"hint":{"type":"string","description":"How to recover, when recovery is possible."},"documentation_url":{"type":"string","format":"uri"}}}}},"ApiIndex":{"type":"object","description":"Self-description served at the API root.","properties":{"name":{"type":"string"},"version":{"type":"string"},"base_url":{"type":"string","format":"uri"},"authentication":{"type":"object"},"rate_limit":{"type":"object"},"versioning":{"type":"object"},"endpoints":{"type":"array","items":{"type":"object"}},"documentation":{"type":"object"},"mcp":{"type":"object"}}}}}}