{
  "openapi": "3.1.0",
  "info": {
    "title": "Vibe Radar API",
    "version": "1.0.0",
    "description": "Read-only SaaS price and rebuild data. Every tool is also available over MCP at /mcp. GET with query parameters works too (arrays as comma lists)."
  },
  "servers": [
    {
      "url": "https://viberadar.si"
    }
  ],
  "components": {
    "securitySchemes": {
      "apiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "Optional Business plan key (br_live_…)."
      }
    }
  },
  "security": [
    {},
    {
      "apiKey": []
    }
  ],
  "paths": {
    "/api/v1/search_apps": {
      "post": {
        "operationId": "search_apps",
        "summary": "Search the Vibe Radar catalog of ~1,100 SaaS apps by name, description or category. Filter by verdict (yes = rebuildable with an AI agent in one session, kinda = with trade-offs, no = better to subscribe) and monthly USD price, sort by price. Returns apps with price, verdict and page URL.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "query": {
                    "type": "string",
                    "description": "Words to match in name, tagline or category, e.g. \"meeting notes\"."
                  },
                  "category": {
                    "type": "string",
                    "description": "Category slug from list_categories, e.g. \"project-management\"."
                  },
                  "verdict": {
                    "type": "string",
                    "enum": [
                      "yes",
                      "kinda",
                      "no"
                    ]
                  },
                  "max_monthly_usd": {
                    "type": "number"
                  },
                  "min_monthly_usd": {
                    "type": "number"
                  },
                  "sort": {
                    "type": "string",
                    "enum": [
                      "price_desc",
                      "price_asc",
                      "name"
                    ],
                    "default": "price_desc"
                  },
                  "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 50,
                    "default": 15
                  },
                  "currency": {
                    "type": "string",
                    "enum": [
                      "USD",
                      "EUR",
                      "GBP",
                      "BRL",
                      "INR",
                      "JPY",
                      "CAD",
                      "AUD",
                      "MXN"
                    ],
                    "description": "Also return prices converted to this currency."
                  },
                  "locale": {
                    "type": "string",
                    "enum": [
                      "en",
                      "pt-BR",
                      "de",
                      "fr"
                    ],
                    "default": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/get_app": {
      "post": {
        "operationId": "get_app",
        "summary": "Everything Vibe Radar knows about one app: verdict and reasoning, what you lose by rebuilding, requirements, all plans with monthly/annual prices and limits, free tier, hidden costs, free alternatives, price history, official pricing URL.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "slug"
                ],
                "properties": {
                  "slug": {
                    "type": "string",
                    "description": "App slug, e.g. \"notion\" (from search_apps)."
                  },
                  "currency": {
                    "type": "string",
                    "enum": [
                      "USD",
                      "EUR",
                      "GBP",
                      "BRL",
                      "INR",
                      "JPY",
                      "CAD",
                      "AUD",
                      "MXN"
                    ]
                  },
                  "locale": {
                    "type": "string",
                    "enum": [
                      "en",
                      "pt-BR",
                      "de",
                      "fr"
                    ],
                    "default": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/compare_apps": {
      "post": {
        "operationId": "compare_apps",
        "summary": "Compare 2 to 4 apps side by side: monthly and yearly cost, billing model, free tier, extra costs, rebuild verdict and free alternatives. Says which is cheapest per year and by how much.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "slugs"
                ],
                "properties": {
                  "slugs": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "minItems": 2,
                    "maxItems": 4
                  },
                  "currency": {
                    "type": "string",
                    "enum": [
                      "USD",
                      "EUR",
                      "GBP",
                      "BRL",
                      "INR",
                      "JPY",
                      "CAD",
                      "AUD",
                      "MXN"
                    ]
                  },
                  "locale": {
                    "type": "string",
                    "enum": [
                      "en",
                      "pt-BR",
                      "de",
                      "fr"
                    ],
                    "default": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/team_cost": {
      "post": {
        "operationId": "team_cost",
        "summary": "Cheapest apps in a category for a team of N people, reading each plan table (per-user vs per-workspace prices, monthly vs annual billing, user caps, extra-seat prices). Returns the cheapest plan per app sorted by yearly cost.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "category",
                  "team_size"
                ],
                "properties": {
                  "category": {
                    "type": "string",
                    "description": "Category slug from list_categories."
                  },
                  "team_size": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 10000
                  },
                  "paid_only": {
                    "type": "boolean",
                    "default": false
                  },
                  "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 30,
                    "default": 10
                  },
                  "currency": {
                    "type": "string",
                    "enum": [
                      "USD",
                      "EUR",
                      "GBP",
                      "BRL",
                      "INR",
                      "JPY",
                      "CAD",
                      "AUD",
                      "MXN"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/stack_savings": {
      "post": {
        "operationId": "stack_savings",
        "summary": "What a list of apps costs per month and per year, and how much switching each paid app to its best free or open-source alternative would save.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "slugs"
                ],
                "properties": {
                  "slugs": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "maxItems": 60
                  },
                  "currency": {
                    "type": "string",
                    "enum": [
                      "USD",
                      "EUR",
                      "GBP",
                      "BRL",
                      "INR",
                      "JPY",
                      "CAD",
                      "AUD",
                      "MXN"
                    ]
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/price_changes": {
      "post": {
        "operationId": "price_changes",
        "summary": "Confirmed vendor price changes (same plan, same billing period), newest first, with the source of each check.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "since": {
                    "type": "string",
                    "description": "YYYY-MM-DD"
                  },
                  "slugs": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  },
                  "limit": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 200,
                    "default": 50
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/convert_price": {
      "post": {
        "operationId": "convert_price",
        "summary": "Convert a USD amount to another currency with the day’s reference rate (ECB, or Banco Central do Brasil PTAX for BRL). Optionally adds Brazil’s 3.5% IOF on card purchases.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "amount_usd",
                  "currency"
                ],
                "properties": {
                  "amount_usd": {
                    "type": "number"
                  },
                  "currency": {
                    "type": "string",
                    "enum": [
                      "USD",
                      "EUR",
                      "GBP",
                      "BRL",
                      "INR",
                      "JPY",
                      "CAD",
                      "AUD",
                      "MXN"
                    ]
                  },
                  "include_brazil_iof": {
                    "type": "boolean",
                    "default": false
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/build_vs_buy": {
      "post": {
        "operationId": "build_vs_buy",
        "summary": "Estimate whether building your own version of an app with an AI coding agent pays off versus subscribing, over 12–36 months. Uses the research’s time estimate and requirements as defaults; every number can be overridden.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "slug"
                ],
                "properties": {
                  "slug": {
                    "type": "string"
                  },
                  "hourly_rate_usd": {
                    "type": "number",
                    "default": 50
                  },
                  "hours_to_build": {
                    "type": "number"
                  },
                  "running_cost_usd_month": {
                    "type": "number"
                  },
                  "upkeep_hours_month": {
                    "type": "number",
                    "default": 1
                  },
                  "seats": {
                    "type": "integer",
                    "minimum": 1,
                    "default": 1
                  },
                  "months": {
                    "type": "integer",
                    "minimum": 1,
                    "maximum": 60,
                    "default": 24
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    },
    "/api/v1/list_categories": {
      "post": {
        "operationId": "list_categories",
        "summary": "All catalog categories with slug, localized name and number of apps.",
        "requestBody": {
          "required": false,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "locale": {
                    "type": "string",
                    "enum": [
                      "en",
                      "pt-BR",
                      "de",
                      "fr"
                    ],
                    "default": "en"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid input"
          },
          "429": {
            "description": "Rate limit or quota reached"
          }
        }
      }
    }
  }
}