{
  "openapi": "3.1.0",
  "info": {
    "title": "Problems API",
    "version": "1.0.0",
    "summary": "Problems grouped from public posts on Hacker News, Reddit, Stack Overflow, GitHub issues, community forums, Bluesky, Mastodon, YouTube, App Store reviews and other fru.dev sites, each with daily counts, momentum and a link to every post. It grows every day",
    "description": "Problems grouped from public posts on Hacker News, Reddit, Stack Overflow, GitHub issues, community forums, Bluesky, Mastodon, YouTube, App Store reviews and other fru.dev sites, each with daily counts, momentum and a link to every post. It grows every day. Scanned daily at 05:25 UTC, with a lighter pass at 17:25 UTC. Free to read; please cite \"Problems (problems.fru.dev)\" with a link. Responses are cached at the edge; keep to about 60 requests a minute. Guide: https://problems.fru.dev/agents",
    "contact": {
      "name": "fru.dev",
      "url": "https://fru.dev",
      "email": "fru.dev3@gmail.com"
    }
  },
  "externalDocs": {
    "description": "For AI agents",
    "url": "https://problems.fru.dev/agents"
  },
  "servers": [
    {
      "url": "https://problems.fru.dev"
    }
  ],
  "paths": {
    "/api/problems": {
      "get": {
        "operationId": "list_problems",
        "summary": "Problems, rising first, with filters",
        "description": "Problems, rising first, with filters. Returns problems with id, statement, category, company, companies named, posts, people, places, posts in the last 7 and previous 7 days, momentum (rising, new, steady, fading), persistent, days active, frustration 0 to 3, first and last post, daily posts for 30 days, source kinds, top 3 links, an evidence line, verified and the page URL.",
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "description": "Only this category",
            "schema": {
              "type": "string",
              "enum": [
                "data-engineering",
                "databases",
                "analytics",
                "mlops",
                "llm-apps",
                "ai-coding",
                "cloud-cost",
                "infra",
                "security",
                "reliability",
                "dev-tooling",
                "careers",
                "other"
              ]
            },
            "example": "llm-apps"
          },
          {
            "name": "company",
            "in": "query",
            "required": false,
            "description": "Only problems about or naming this company or product (slug)",
            "schema": {
              "type": "string"
            },
            "example": "snowflake"
          },
          {
            "name": "source",
            "in": "query",
            "required": false,
            "description": "Only problems seen on this kind of source",
            "schema": {
              "type": "string",
              "enum": [
                "hn",
                "reddit",
                "stackoverflow",
                "github",
                "discourse",
                "bluesky",
                "mastodon",
                "youtube",
                "appstore",
                "lobsters",
                "devto",
                "sibling",
                "slack",
                "search"
              ]
            },
            "example": "reddit"
          },
          {
            "name": "view",
            "in": "query",
            "required": false,
            "description": "rising, persistent, new or all",
            "schema": {
              "type": "string",
              "enum": [
                "rising",
                "persistent",
                "new",
                "all"
              ]
            },
            "example": "rising"
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "posts (most posts first) or recent (latest post first); default rising first",
            "schema": {
              "type": "string",
              "enum": [
                "posts",
                "recent"
              ]
            },
            "example": "posts"
          },
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Words in the statement or company names",
            "schema": {
              "type": "string"
            },
            "example": "rate limit"
          },
          {
            "name": "verified",
            "in": "query",
            "required": false,
            "description": "true for corroborated problems only",
            "schema": {
              "type": "boolean"
            },
            "example": true
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows active or first seen at or after this date (YYYY-MM-DD)",
            "schema": {
              "type": "string"
            },
            "example": "2026-09-01"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page, 1 to 200",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 200
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Items to skip, for the next page",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "problems with id, statement, category, company, companies named, posts, people, places, posts in the last 7 and previous 7 days, momentum (rising, new, steady, fading), persistent, days active, frustration 0 to 3, first and last post, daily posts for 30 days, source kinds, top 3 links, an evidence line, verified and the page URL",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "problems": [
                    {
                      "id": "claude-issues",
                      "statement": "Claude app gets 1 and 2 star reviews",
                      "category": "llm-apps",
                      "issue": "general",
                      "company": {
                        "slug": "claude",
                        "name": "Claude",
                        "domain": "anthropic.com",
                        "url": "https://problems.fru.dev/companies/claude"
                      },
                      "companies": [
                        {
                          "slug": "claude",
                          "name": "Claude",
                          "domain": "anthropic.com",
                          "posts": 34
                        },
                        {
                          "slug": "chatgpt",
                          "name": "ChatGPT",
                          "domain": "openai.com",
                          "posts": 6
                        }
                      ],
                      "posts": 34,
                      "people": 34,
                      "places": 11,
                      "last_7_days": 28,
                      "previous_7_days": 2,
                      "momentum": "rising",
                      "persistent": true,
                      "days_active": 13
                    },
                    {
                      "id": "chatgpt-issues",
                      "statement": "ChatGPT app gets 1 and 2 star reviews",
                      "category": "llm-apps",
                      "issue": "general",
                      "company": {
                        "slug": "chatgpt",
                        "name": "ChatGPT",
                        "domain": "openai.com",
                        "url": "https://problems.fru.dev/companies/chatgpt"
                      },
                      "companies": [
                        {
                          "slug": "chatgpt",
                          "name": "ChatGPT",
                          "domain": "openai.com",
                          "posts": 23
                        },
                        {
                          "slug": "openai-codex",
                          "name": "Codex",
                          "domain": "openai.com",
                          "posts": 6
                        }
                      ],
                      "posts": 23,
                      "people": 23,
                      "places": 5,
                      "last_7_days": 17,
                      "previous_7_days": 1,
                      "momentum": "rising",
                      "persistent": true,
                      "days_active": 11
                    }
                  ],
                  "total": 45,
                  "limit": 3,
                  "offset": 0,
                  "next": "/api/problems?view=rising&limit=3&offset=3",
                  "note": "From public posts only: short, attributed excerpts that link to the originals. Problems are grouped by rules; verified=true means at leas..."
                }
              }
            }
          }
        }
      }
    },
    "/api/problems/{id}": {
      "get": {
        "operationId": "get_problem",
        "summary": "One problem with every linked post, its posts per day, related problems and change history",
        "description": "One problem with every linked post, its posts per day, related problems and change history. Returns the problem with daily_posts (every day with posts), posts_list (url, source, title, short excerpt, public handle, date, score, companies), related problems, provenance and history.",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Problem id, as in /problems/<id>",
            "schema": {
              "type": "string"
            },
            "example": "rate-limits"
          }
        ],
        "responses": {
          "200": {
            "description": "the problem with daily_posts (every day with posts), posts_list (url, source, title, short excerpt, public handle, date, score, companies), related problems, provenance and history",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "problem": {
                    "id": "rate-limits",
                    "statement": "API rate limits and usage caps block real work",
                    "category": "llm-apps",
                    "issue": "rate-limits",
                    "company": null,
                    "companies": [
                      {
                        "slug": "deepseek",
                        "name": "DeepSeek",
                        "domain": "deepseek.com",
                        "posts": 4
                      },
                      {
                        "slug": "ollama",
                        "name": "Ollama",
                        "domain": "ollama.com",
                        "posts": 3
                      }
                    ],
                    "posts": 16,
                    "people": 16,
                    "places": 8,
                    "last_7_days": 3,
                    "previous_7_days": 3,
                    "momentum": "steady",
                    "persistent": true,
                    "days_active": 12
                  },
                  "note": "From public posts only: short, attributed excerpts that link to the originals. Problems are grouped by rules; verified=true means at leas..."
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          }
        }
      }
    },
    "/api/companies": {
      "get": {
        "operationId": "list_companies",
        "summary": "Companies and products with problems, with their problems as dated items (the companies.fru.dev registry feed)",
        "description": "Companies and products with problems, with their problems as dated items (the companies.fru.dev registry feed). Returns companies with slug (registry slug when known), site_slug, name, kind (company, product, project), parent, domain, in_registry, the page here, problems, posts, posts in the last 7 days, first seen, updated, and items (each problem with type, date, title, url, source, verified, posts, momentum).",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows active or first seen at or after this date (YYYY-MM-DD)",
            "schema": {
              "type": "string"
            },
            "example": "2026-09-01"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page, 1 to 200",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 200
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Items to skip, for the next page",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "companies with slug (registry slug when known), site_slug, name, kind (company, product, project), parent, domain, in_registry, the page here, problems, posts, posts in the last 7 days, first seen, updated, and items (each problem with type, date, title, url, source, verified, posts, momentum)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "companies": [
                    {
                      "slug": "github",
                      "site_slug": "github",
                      "name": "GitHub",
                      "kind": "company",
                      "parent": null,
                      "domain": "github.com",
                      "in_registry": true,
                      "url": "https://problems.fru.dev/companies/github",
                      "problems": 146,
                      "posts": 352,
                      "last_7_days": 73,
                      "first_seen": "2026-09-25 12:30:30",
                      "updated": "2026-09-25",
                      "items": [
                        {
                          "type": "problem",
                          "date": "2026-09-25",
                          "first_date": "2026-08-28",
                          "title": "Claude app gets 1 and 2 star reviews",
                          "url": "https://problems.fru.dev/problems/claude-issues",
                          "source": "appstore,github,reddit,discourse,stackoverflow",
                          "verified": true,
                          "posts": 34,
                          "momentum": "rising"
                        },
                        {
                          "type": "problem",
                          "date": "2026-09-24",
                          "first_date": "2026-08-27",
                          "title": "Upgrades and new releases break working setups",
                          "url": "https://problems.fru.dev/problems/breaking-changes",
                          "source": "github,reddit,discourse",
                          "verified": true,
                          "posts": 20,
                          "momentum": "rising"
                        }
                      ]
                    },
                    {
                      "slug": "anthropic",
                      "site_slug": "claude",
                      "name": "Claude",
                      "kind": "product",
                      "parent": "anthropic",
                      "domain": "anthropic.com",
                      "in_registry": false,
                      "url": "https://problems.fru.dev/companies/claude",
                      "problems": 56,
                      "posts": 134,
                      "last_7_days": 56,
                      "first_seen": "2026-09-25 12:30:30",
                      "updated": "2026-09-25",
                      "items": [
                        {
                          "type": "problem",
                          "date": "2026-09-25",
                          "first_date": "2026-08-28",
                          "title": "Claude app gets 1 and 2 star reviews",
                          "url": "https://problems.fru.dev/problems/claude-issues",
                          "source": "appstore,github,reddit,discourse,stackoverflow",
                          "verified": true,
                          "posts": 34,
                          "momentum": "rising"
                        },
                        {
                          "type": "problem",
                          "date": "2026-09-25",
                          "first_date": "2026-09-20",
                          "title": "Cursor users keep asking for help",
                          "url": "https://problems.fru.dev/problems/cursor-issues",
                          "source": "discourse",
                          "verified": true,
                          "posts": 17,
                          "momentum": "new"
                        }
                      ]
                    }
                  ],
                  "total": 146,
                  "limit": 2,
                  "offset": 0,
                  "next": "/api/companies?since=2026-09-01&limit=2&offset=2"
                }
              }
            }
          }
        }
      }
    },
    "/api/stats": {
      "get": {
        "operationId": "list_stats",
        "summary": "Counts: growth, categories, source kinds and problem posts per day for 30 days",
        "description": "Counts: growth, categories, source kinds and problem posts per day for 30 days. Returns growth (problems, corroborated, posts, posts in 7 days, companies, sources), categories and source kinds with problems, posts and posts this week, and daily posts.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "growth (problems, corroborated, posts, posts in 7 days, companies, sources), categories and source kinds with problems, posts and posts this week, and daily posts",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "growth": {
                    "problems": 327,
                    "corroborated": 198,
                    "posts": 1706,
                    "posts7d": 472,
                    "added7d": 0,
                    "added30d": 0,
                    "companies": 146,
                    "sources": 177,
                    "sourcesAdded30d": 2,
                    "rising": 45
                  },
                  "categories": [
                    {
                      "key": "llm-apps",
                      "problems": 49,
                      "posts": 328,
                      "last7": 119,
                      "rising": 12
                    },
                    {
                      "key": "dev-tooling",
                      "problems": 34,
                      "posts": 256,
                      "last7": 78,
                      "rising": 5
                    }
                  ],
                  "sources": [
                    {
                      "key": "github",
                      "problems": 263,
                      "posts": 1068,
                      "last7": 195,
                      "rising": 0
                    },
                    {
                      "key": "reddit",
                      "problems": 84,
                      "posts": 142,
                      "last7": 67,
                      "rising": 0
                    }
                  ],
                  "daily_posts_30d": [
                    {
                      "day": "2026-08-27",
                      "posts": 60
                    },
                    {
                      "day": "2026-08-28",
                      "posts": 75
                    }
                  ],
                  "registry": {
                    "enrolled": 761,
                    "withProblems": 77
                  },
                  "built_at": "2026-09-25 12:51:30",
                  "note": "Counts grow every run. posts are problem posts (a post that states a pain and was grouped)."
                }
              }
            }
          }
        }
      }
    },
    "/api/sources": {
      "get": {
        "operationId": "list_sources",
        "summary": "The growing list of places the scan reads, with when each last answered and what it yielded",
        "description": "The growing list of places the scan reads, with when each last answered and what it yielded. Returns sources with id, name, kind, URL, scope, status (active, policy, needs-key, failing, dropped), found by, first seen, last ok, items read and problem posts added.",
        "parameters": [],
        "responses": {
          "200": {
            "description": "sources with id, name, kind, URL, scope, status (active, policy, needs-key, failing, dropped), found by, first seen, last ok, items read and problem posts added",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "sources": [
                    {
                      "id": "appstore:6448311069",
                      "name": "ChatGPT App Store reviews",
                      "kind": "appstore",
                      "url": "https://apps.apple.com/us/app/id6448311069",
                      "scope": "1 and 2 star reviews (Apple public RSS)",
                      "status": "active",
                      "foundBy": "seed",
                      "foundAtUrl": "",
                      "firstSeen": "2026-09-25 12:30:30",
                      "lastChecked": "2026-09-25 12:39:52",
                      "lastOk": "2026-09-25 12:39:52",
                      "lastError": "",
                      "yield": 11,
                      "added": 11
                    },
                    {
                      "id": "appstore:6473753684",
                      "name": "Claude App Store reviews",
                      "kind": "appstore",
                      "url": "https://apps.apple.com/us/app/id6473753684",
                      "scope": "1 and 2 star reviews (Apple public RSS)",
                      "status": "active",
                      "foundBy": "seed",
                      "foundAtUrl": "",
                      "firstSeen": "2026-09-25 12:30:30",
                      "lastChecked": "2026-09-25 12:39:52",
                      "lastOk": "2026-09-25 12:39:52",
                      "lastError": "",
                      "yield": 28,
                      "added": 28
                    }
                  ],
                  "total": 179,
                  "note": "The list grows: each daily run adds subreddits, repos, forums and tags it finds linked from posts."
                }
              }
            }
          }
        }
      }
    },
    "/api/changes": {
      "get": {
        "operationId": "list_changes",
        "summary": "The append-only history: problems added, momentum that changed, clusters corroborated, sources found",
        "description": "The append-only history: problems added, momentum that changed, clusters corroborated, sources found. Returns changes with time, item type, item, field, old and new value, source URL and who made it (daily, midday, seed, admin, model).",
        "parameters": [
          {
            "name": "since",
            "in": "query",
            "required": false,
            "description": "Only rows active or first seen at or after this date (YYYY-MM-DD)",
            "schema": {
              "type": "string"
            },
            "example": "2026-09-01"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Items per page, 1 to 200",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 200,
              "default": 200
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "description": "Items to skip, for the next page",
            "schema": {
              "type": "integer",
              "minimum": 0,
              "default": 0
            }
          }
        ],
        "responses": {
          "200": {
            "description": "changes with time, item type, item, field, old and new value, source URL and who made it (daily, midday, seed, admin, model)",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "changes": [
                    {
                      "at": "2026-09-25 12:51:30",
                      "type": "problem",
                      "item": "npm-issues",
                      "field": "statement",
                      "old": "npm users keep asking for help",
                      "new": "npm users keep filing bugs",
                      "source": "https://github.com/modelcontextprotocol/servers/issues/4721",
                      "by": "seed"
                    },
                    {
                      "at": "2026-09-25 12:51:30",
                      "type": "problem",
                      "item": "vercel-issues",
                      "field": "statement",
                      "old": "Vercel users keep asking for help",
                      "new": "Vercel users keep filing bugs",
                      "source": "https://github.com/vercel/next.js/issues/99109",
                      "by": "seed"
                    }
                  ],
                  "limit": 3,
                  "offset": 0,
                  "next": "/api/changes?since=2026-09-01&limit=3&offset=3",
                  "note": "Append-only."
                }
              }
            }
          }
        }
      }
    },
    "/api/search": {
      "get": {
        "operationId": "search",
        "summary": "Search problems, companies and pages",
        "description": "Search problems, companies and pages. Returns up to 20 ranked results with title, link and one line.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "A problem, company or product",
            "schema": {
              "type": "string"
            },
            "example": "airflow"
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "Results, 1 to 20",
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 20,
              "default": 20
            }
          }
        ],
        "responses": {
          "200": {
            "description": "up to 20 ranked results with title, link and one line",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                },
                "example": {
                  "q": "snowflake",
                  "results": [
                    {
                      "id": "co:snowflake",
                      "group": "companies",
                      "title": "Snowflake",
                      "subtitle": "8 problems · 12 posts · +7 this week",
                      "href": "/companies/snowflake",
                      "keywords": [
                        "snowflake",
                        "snowflake.com"
                      ],
                      "logo": "https://problems.fru.dev/api/logo?domain=snowflake.com&size=64",
                      "boost": 4,
                      "score": 1044
                    },
                    {
                      "id": "co:streamlit",
                      "group": "companies",
                      "title": "Streamlit",
                      "subtitle": "5 problems · 10 posts",
                      "href": "/companies/streamlit",
                      "keywords": [
                        "streamlit",
                        "streamlit.io"
                      ],
                      "logo": "https://problems.fru.dev/api/logo?domain=streamlit.io&size=64",
                      "boost": 3.3333333333333335,
                      "score": 993.3333333333334
                    }
                  ]
                }
              }
            }
          }
        }
      }
    }
  }
}