{
  "openapi": "3.1.0",
  "info": {
    "title": "LimitFacts REST API",
    "version": "1.0.0",
    "summary": "Dev-tool plan prices and limits with official source links and dates.",
    "description": "Free, read-only API. GET only, JSON only, no API key. Every response, including errors and empty results, uses one envelope with a disclosure object.\n\nDisclosure: LimitFacts is independent. It has not joined any affiliate program yet. Later, its website may carry affiliate links that earn a commission. This response contains no affiliate links. official_url is the vendor's own link.\n\nRate limit: 60 requests per 60 seconds per client, on every REST route (including /v1/dataset.json) and every MCP tool call. Over the limit: HTTP 429, error code rate_limited, Retry-After header, full envelope with disclosure.\n\nSort order is fixed and never depends on commission: lists and search by name ascending (search: exact name match first), compare in the order given.\n\nVendor names and marks belong to their owners. No endorsement is implied.",
    "license": {
      "name": "MIT (code). Data: CC BY 4.0 for our selection, arrangement and own words only; vendor facts are not licensed by us.",
      "identifier": "MIT"
    },
    "contact": {
      "email": "hello@limitfacts.com",
      "url": "https://limitfacts.dev/"
    },
    "x-disclosure": {
      "text": "LimitFacts is independent. It has not joined any affiliate program yet. Later, its website may carry affiliate links that earn a commission. This response contains no affiliate links. official_url is the vendor's own link.",
      "url": "https://limitfacts.com/affiliate-disclosure/",
      "affiliate_fields": "off"
    },
    "x-rate-limit": {
      "requests": 60,
      "period_seconds": 60
    }
  },
  "externalDocs": {
    "description": "LimitFacts developer docs",
    "url": "https://limitfacts.dev/"
  },
  "servers": [
    {
      "url": "https://api.limitfacts.dev",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "tools"
    },
    {
      "name": "dataset"
    },
    {
      "name": "service"
    }
  ],
  "paths": {
    "/v1/tools": {
      "get": {
        "operationId": "listTools",
        "tags": [
          "tools"
        ],
        "summary": "List tools",
        "parameters": [
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "hosting",
                "database",
                "app_builder",
                "email_api",
                "ai_voice_video",
                "seo",
                "automation",
                "newsletter",
                "website_builder",
                "crm",
                "other_dev_tool"
              ]
            },
            "description": "Filter by category."
          },
          {
            "name": "free_tier",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "true or false. Tools with no plans never match."
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0
            },
            "description": "Lowest monthly paid price in USD. Annual-only prices are divided by 12."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            },
            "description": "Page size."
          },
          {
            "name": "cursor",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Opaque cursor from next_cursor. Bound to the dataset_version."
          }
        ],
        "responses": {
          "200": {
            "description": "Tool list, sorted by name.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/ToolList"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    },
    "/v1/tools/{tool_id}": {
      "get": {
        "operationId": "getTool",
        "tags": [
          "tools"
        ],
        "summary": "One tool with all plans",
        "parameters": [
          {
            "name": "tool_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]{2,40}$"
            },
            "description": "Tool slug, for example digitalocean."
          }
        ],
        "responses": {
          "200": {
            "description": "Tool with plans and links.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Tool"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/v1/tools/{tool_id}/pricing": {
      "get": {
        "operationId": "getToolPricing",
        "tags": [
          "tools"
        ],
        "summary": "Plans and prices for one tool",
        "parameters": [
          {
            "name": "tool_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]{2,40}$"
            },
            "description": "Tool slug, for example digitalocean."
          },
          {
            "name": "plan_id",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Only this plan."
          }
        ],
        "responses": {
          "200": {
            "description": "Tool with plans.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Tool"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/v1/tools/{tool_id}/history": {
      "get": {
        "operationId": "getToolHistory",
        "tags": [
          "tools"
        ],
        "summary": "Dated price and limit changes",
        "parameters": [
          {
            "name": "tool_id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]{2,40}$"
            },
            "description": "Tool slug, for example digitalocean."
          },
          {
            "name": "since",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date"
            },
            "description": "Only changes on or after this date."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 100,
              "default": 20
            },
            "description": "Max changes."
          }
        ],
        "responses": {
          "200": {
            "description": "Changes. Empty list plus tracking_since when none are recorded.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/History"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          }
        }
      }
    },
    "/v1/compare": {
      "get": {
        "operationId": "compareTools",
        "tags": [
          "tools"
        ],
        "summary": "Compare 2 to 5 tools",
        "parameters": [
          {
            "name": "ids",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            },
            "description": "2 to 5 tool_ids, comma separated."
          },
          {
            "name": "plan",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "all",
                "free",
                "cheapest_paid"
              ],
              "default": "all"
            },
            "description": "Which plans to include."
          },
          {
            "name": "limit_keys",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "Comma-separated limit keys, up to 10."
          }
        ],
        "responses": {
          "200": {
            "description": "Tools in the order given.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/Compare"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    },
    "/v1/search": {
      "get": {
        "operationId": "searchTools",
        "tags": [
          "tools"
        ],
        "summary": "Text search on name, vendor and category",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "minLength": 1,
              "maxLength": 100
            },
            "description": "Search text."
          },
          {
            "name": "category",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "hosting",
                "database",
                "app_builder",
                "email_api",
                "ai_voice_video",
                "seo",
                "automation",
                "newsletter",
                "website_builder",
                "crm",
                "other_dev_tool"
              ]
            },
            "description": "Filter by category."
          },
          {
            "name": "free_tier",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            },
            "description": "true or false."
          },
          {
            "name": "max_price",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number",
              "minimum": 0
            },
            "description": "Lowest monthly paid price in USD."
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "schema": {
              "type": "integer",
              "minimum": 1,
              "maximum": 50,
              "default": 20
            },
            "description": "Max results."
          }
        ],
        "responses": {
          "200": {
            "description": "Matches. Exact name match first, then name ascending.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/ToolList"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    },
    "/v1/categories": {
      "get": {
        "operationId": "listCategories",
        "tags": [
          "tools"
        ],
        "summary": "Categories with tool counts",
        "responses": {
          "200": {
            "description": "Every category with its tool count.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "items": {
                              "type": "array",
                              "items": {
                                "type": "object",
                                "properties": {
                                  "category": {
                                    "type": "string",
                                    "enum": [
                                      "hosting",
                                      "database",
                                      "app_builder",
                                      "email_api",
                                      "ai_voice_video",
                                      "seo",
                                      "automation",
                                      "newsletter",
                                      "website_builder",
                                      "crm",
                                      "other_dev_tool"
                                    ]
                                  },
                                  "tool_count": {
                                    "type": "integer"
                                  }
                                },
                                "required": [
                                  "category",
                                  "tool_count"
                                ]
                              }
                            }
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    },
    "/v1/meta": {
      "get": {
        "operationId": "getMeta",
        "tags": [
          "dataset"
        ],
        "summary": "Dataset version, counts, freshness and terms",
        "responses": {
          "200": {
            "description": "Dataset metadata. Same data as the MCP tool get_dataset_info.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/DatasetMeta"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    },
    "/v1/dataset.json": {
      "get": {
        "operationId": "getDataset",
        "tags": [
          "dataset"
        ],
        "summary": "Full dataset, free",
        "description": "Every served tool and row. CC BY 4.0 for our selection, arrangement and own words; vendor facts are not licensed by us. No affiliate fields in any build. Same rate limit as every route.",
        "responses": {
          "200": {
            "description": "Full dataset in the envelope.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "$ref": "#/components/schemas/DatasetExport"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    },
    "/healthz": {
      "get": {
        "operationId": "health",
        "tags": [
          "service"
        ],
        "summary": "Liveness",
        "description": "Never cached (Cache-Control: no-store). Still returns the envelope.",
        "responses": {
          "200": {
            "description": "Service is up.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/Link"
              },
              "X-Request-Id": {
                "$ref": "#/components/headers/XRequestId"
              },
              "X-LimitFacts-Dataset-Version": {
                "$ref": "#/components/headers/XDatasetVersion"
              },
              "Cache-Control": {
                "$ref": "#/components/headers/CacheControl"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "data": {
                          "type": "object",
                          "properties": {
                            "status": {
                              "const": "ok"
                            },
                            "dataset_version": {
                              "type": "string"
                            }
                          },
                          "required": [
                            "status",
                            "dataset_version"
                          ]
                        }
                      }
                    }
                  ]
                },
                "example": {
                  "data": {
                    "status": "ok",
                    "dataset_version": "2026-10-19.1"
                  },
                  "error": null,
                  "meta": {
                    "api_version": "1",
                    "schema_version": "1.0",
                    "dataset_version": "2026-10-19.1",
                    "generated_at": "2026-10-19T14:05:00+04:00",
                    "request_id": "req_example",
                    "build": "default"
                  },
                  "disclosure": {
                    "text": "LimitFacts is independent. It has not joined any affiliate program yet. Later, its website may carry affiliate links that earn a commission. This response contains no affiliate links. official_url is the vendor's own link.",
                    "url": "https://limitfacts.com/affiliate-disclosure/",
                    "affiliate_fields": "off"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/InvalidArgument"
          },
          "405": {
            "$ref": "#/components/responses/MethodNotAllowed"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "503": {
            "$ref": "#/components/responses/Unavailable"
          },
          "500": {
            "$ref": "#/components/responses/Internal"
          }
        }
      }
    }
  },
  "components": {
    "headers": {
      "Link": {
        "description": "Informative disclosure link: <https://limitfacts.com/affiliate-disclosure/>; rel=\"disclosure\"",
        "schema": {
          "type": "string"
        }
      },
      "XRequestId": {
        "description": "Request ID, same as meta.request_id.",
        "schema": {
          "type": "string"
        }
      },
      "XDatasetVersion": {
        "description": "Served dataset_version.",
        "schema": {
          "type": "string"
        }
      },
      "CacheControl": {
        "description": "public, max-age up to 3600 for data; no-store for errors and /healthz.",
        "schema": {
          "type": "string"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait.",
        "schema": {
          "type": "integer"
        }
      }
    },
    "responses": {
      "InvalidArgument": {
        "description": "Bad parameter (error.code invalid_argument).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "NotFound": {
        "description": "Unknown tool or route (error.code not_found).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            },
            "example": {
              "data": null,
              "error": {
                "code": "not_found",
                "message": "No tool with tool_id \"example\".",
                "status": 404
              },
              "meta": {
                "api_version": "1",
                "schema_version": "1.0",
                "dataset_version": "2026-10-19.1",
                "generated_at": "2026-10-19T14:05:00+04:00",
                "request_id": "req_example",
                "build": "default"
              },
              "disclosure": {
                "text": "LimitFacts is independent. It has not joined any affiliate program yet. Later, its website may carry affiliate links that earn a commission. This response contains no affiliate links. official_url is the vendor's own link.",
                "url": "https://limitfacts.com/affiliate-disclosure/",
                "affiliate_fields": "off"
              }
            }
          }
        }
      },
      "MethodNotAllowed": {
        "description": "Only GET and OPTIONS (error.code invalid_argument, status 405).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Over 60 requests per 60 seconds (error.code rate_limited).",
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "Unavailable": {
        "description": "Data not servable (error.code unavailable).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      },
      "Internal": {
        "description": "Internal error (error.code internal).",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ErrorEnvelope"
            }
          }
        }
      }
    },
    "schemas": {
      "Disclosure": {
        "type": "object",
        "description": "Present on every response.",
        "properties": {
          "text": {
            "type": "string",
            "example": "LimitFacts is independent. It has not joined any affiliate program yet. Later, its website may carry affiliate links that earn a commission. This response contains no affiliate links. official_url is the vendor's own link."
          },
          "url": {
            "type": "string",
            "const": "https://limitfacts.com/affiliate-disclosure/"
          },
          "affiliate_fields": {
            "type": "string",
            "enum": [
              "off",
              "on"
            ],
            "description": "off on every surface today."
          }
        },
        "required": [
          "text",
          "url",
          "affiliate_fields"
        ]
      },
      "Meta": {
        "type": "object",
        "properties": {
          "api_version": {
            "const": "1"
          },
          "schema_version": {
            "type": "string"
          },
          "dataset_version": {
            "type": "string"
          },
          "generated_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "request_id": {
            "type": "string"
          },
          "build": {
            "type": "string",
            "enum": [
              "default",
              "clean"
            ]
          }
        },
        "required": [
          "api_version",
          "schema_version",
          "dataset_version",
          "generated_at",
          "request_id",
          "build"
        ]
      },
      "Error": {
        "type": "object",
        "properties": {
          "code": {
            "type": "string",
            "enum": [
              "not_found",
              "invalid_argument",
              "rate_limited",
              "unavailable",
              "internal"
            ]
          },
          "message": {
            "type": "string"
          },
          "status": {
            "type": "integer"
          }
        },
        "required": [
          "code",
          "message",
          "status"
        ]
      },
      "Envelope": {
        "type": "object",
        "properties": {
          "data": {},
          "error": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Error"
              },
              {
                "type": "null"
              }
            ]
          },
          "meta": {
            "$ref": "#/components/schemas/Meta"
          },
          "disclosure": {
            "$ref": "#/components/schemas/Disclosure"
          }
        },
        "required": [
          "data",
          "error",
          "meta",
          "disclosure"
        ]
      },
      "ErrorEnvelope": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Envelope"
          },
          {
            "type": "object",
            "properties": {
              "data": {
                "type": "null"
              },
              "error": {
                "$ref": "#/components/schemas/Error"
              }
            }
          }
        ]
      },
      "Links": {
        "type": "object",
        "description": "official_url is always present. The three affiliate keys are null today.",
        "properties": {
          "official_url": {
            "type": "string",
            "format": "uri"
          },
          "pricing_url": {
            "type": "string",
            "format": "uri"
          },
          "affiliate_url": {
            "type": [
              "string",
              "null"
            ],
            "description": "null today on every surface."
          },
          "affiliate_label": {
            "type": [
              "string",
              "null"
            ]
          },
          "affiliate_program": {
            "type": [
              "string",
              "null"
            ]
          }
        },
        "required": [
          "official_url",
          "pricing_url",
          "affiliate_url",
          "affiliate_label",
          "affiliate_program"
        ]
      },
      "Price": {
        "type": "object",
        "properties": {
          "row_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "stale",
              "needs_review"
            ]
          },
          "amount": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          },
          "period": {
            "type": "string",
            "enum": [
              "month",
              "year",
              "one_time",
              "usage_only"
            ]
          },
          "billed_annually": {
            "type": "boolean"
          },
          "per": {
            "type": "string"
          },
          "is_starting_price": {
            "type": "boolean"
          }
        }
      },
      "Limit": {
        "type": "object",
        "properties": {
          "row_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "stale",
              "needs_review"
            ]
          },
          "key": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "value": {
            "type": [
              "number",
              "null"
            ]
          },
          "value_text": {
            "type": [
              "string",
              "null"
            ]
          },
          "unit": {
            "type": "string"
          },
          "period": {
            "type": "string"
          },
          "hard_limit": {
            "type": [
              "boolean",
              "null"
            ]
          },
          "source_url": {
            "type": "string",
            "format": "uri"
          },
          "retrieved_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          }
        }
      },
      "Plan": {
        "type": "object",
        "properties": {
          "plan_id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "price": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Price"
              },
              {
                "type": "null"
              }
            ]
          },
          "contact_sales": {
            "type": "boolean"
          },
          "free_tier": {
            "type": "boolean"
          },
          "trial_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "limits": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Limit"
            }
          },
          "usage_prices": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "source_url": {
            "type": "string",
            "format": "uri"
          },
          "retrieved_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "notes": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Tool": {
        "type": "object",
        "properties": {
          "tool_id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "vendor": {
            "type": "string"
          },
          "category": {
            "type": "string",
            "enum": [
              "hosting",
              "database",
              "app_builder",
              "email_api",
              "ai_voice_video",
              "seo",
              "automation",
              "newsletter",
              "website_builder",
              "crm",
              "other_dev_tool"
            ]
          },
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "stale",
              "needs_review"
            ]
          },
          "needs_review_count": {
            "type": "integer"
          },
          "last_checked_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "plans": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Plan"
            }
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "vendor": {
                  "type": "string"
                },
                "text": {
                  "type": "string"
                }
              }
            }
          }
        }
      },
      "LowestPaidPrice": {
        "type": [
          "object",
          "null"
        ],
        "properties": {
          "amount": {
            "type": "number"
          },
          "currency": {
            "type": "string"
          },
          "period": {
            "type": "string"
          },
          "per": {
            "type": "string"
          },
          "billed_annually": {
            "type": "boolean"
          },
          "monthly_amount": {
            "type": "number"
          },
          "row_id": {
            "type": "string"
          },
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "stale",
              "needs_review"
            ]
          },
          "source_url": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "string"
          }
        }
      },
      "ToolListItem": {
        "type": "object",
        "properties": {
          "tool_id": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "vendor": {
            "type": "string"
          },
          "category": {
            "type": "string",
            "enum": [
              "hosting",
              "database",
              "app_builder",
              "email_api",
              "ai_voice_video",
              "seo",
              "automation",
              "newsletter",
              "website_builder",
              "crm",
              "other_dev_tool"
            ]
          },
          "lowest_paid_price": {
            "$ref": "#/components/schemas/LowestPaidPrice"
          },
          "free_tier": {
            "type": "boolean"
          },
          "links": {
            "$ref": "#/components/schemas/Links"
          },
          "last_checked_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "stale",
              "needs_review"
            ]
          },
          "needs_review_count": {
            "type": "integer"
          }
        }
      },
      "ToolList": {
        "type": "object",
        "properties": {
          "items": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/ToolListItem"
            }
          },
          "total": {
            "type": "integer"
          },
          "next_cursor": {
            "type": [
              "string",
              "null"
            ]
          }
        }
      },
      "Compare": {
        "type": "object",
        "properties": {
          "tools": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Tool"
            }
          },
          "limit_keys": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "not_found": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      },
      "History": {
        "type": "object",
        "properties": {
          "tool_id": {
            "type": "string"
          },
          "changes": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "changed_at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO 8601 with offset. Served timestamps use +04:00."
                },
                "plan_id": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "field": {
                  "type": "string"
                },
                "old_value": {},
                "new_value": {},
                "source_url": {
                  "type": "string",
                  "format": "uri"
                },
                "retrieved_at": {
                  "type": "string",
                  "format": "date-time",
                  "description": "ISO 8601 with offset. Served timestamps use +04:00."
                }
              }
            }
          },
          "tracking_since": {
            "type": "string",
            "format": "date"
          }
        },
        "required": [
          "tool_id",
          "changes",
          "tracking_since"
        ]
      },
      "Terms": {
        "type": "object",
        "properties": {
          "use": {
            "type": "string"
          },
          "warranty": {
            "type": "string"
          },
          "prices": {
            "type": "string"
          },
          "disclosure": {
            "type": "string"
          },
          "rate_limit": {
            "type": "object",
            "properties": {
              "requests": {
                "const": 60
              },
              "period_seconds": {
                "const": 60
              },
              "text": {
                "type": "string"
              }
            }
          },
          "data_licence": {
            "type": "object"
          },
          "code_licence": {
            "type": "string"
          },
          "trademarks": {
            "type": "string"
          }
        }
      },
      "DatasetMeta": {
        "type": "object",
        "properties": {
          "dataset_version": {
            "type": "string"
          },
          "schema_version": {
            "type": "string"
          },
          "generated_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "tool_count": {
            "type": "integer"
          },
          "row_count": {
            "type": "integer"
          },
          "needs_review_count": {
            "type": "integer"
          },
          "stale_count": {
            "type": "integer"
          },
          "categories": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "tracking_since": {
            "type": "string",
            "format": "date"
          },
          "methodology_url": {
            "type": "string",
            "format": "uri"
          },
          "terms": {
            "$ref": "#/components/schemas/Terms"
          }
        }
      },
      "DatasetRow": {
        "type": "object",
        "properties": {
          "row_id": {},
          "tool_id": {},
          "vendor": {},
          "product": {},
          "plan_id": {},
          "plan": {},
          "kind": {},
          "metric": {},
          "value": {},
          "unit": {},
          "currency": {},
          "period": {},
          "billed_annually": {},
          "per": {},
          "is_starting_price": {},
          "hard_limit": {},
          "status": {
            "type": "string",
            "enum": [
              "verified",
              "stale",
              "needs_review"
            ]
          },
          "stale": {},
          "stale_after_days": {},
          "source_url": {},
          "retrieved_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "checked_date": {},
          "notes": {}
        }
      },
      "DatasetExport": {
        "type": "object",
        "description": "No affiliate_ key anywhere in this object.",
        "properties": {
          "licence": {
            "const": "CC BY 4.0"
          },
          "licence_url": {
            "type": "string"
          },
          "licence_scope": {
            "type": "string"
          },
          "licensor": {
            "type": "string"
          },
          "attribution": {
            "type": "string"
          },
          "attribution_rule": {
            "type": "string"
          },
          "trademark_notice": {
            "type": "string"
          },
          "schema_version": {
            "type": "string"
          },
          "dataset_version": {
            "type": "string"
          },
          "generated_at": {
            "type": "string",
            "format": "date-time",
            "description": "ISO 8601 with offset. Served timestamps use +04:00."
          },
          "notices": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "tools": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "rows": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DatasetRow"
            }
          }
        }
      }
    }
  }
}
