{
  "openapi": "3.1.0",
  "info": {
    "title": "MeByte Public API",
    "version": "1.0.0",
    "summary": "Free GEO/AI-visibility tools plus the authenticated partner data API.",
    "description": "Two families of endpoints live under `/api/public`:\n\n1. **Free tools** (`/api/public/v1/tools/*`) — keyless, CORS-open. Without an API key you receive a shareable result URL and a headline summary (`X-RateLimit-Mode: share-link`). Send `x-api-key: mbk_live_...` from a paid plan to receive the full machine-readable payload and a multiplied quota.\n2. **Partner API** (`/api/public/v1/articles`, `/geo`, `/events`) — requires a partner client key and scope; returns brand-scoped data.\n\n**Rate limits.** Every tools response carries `X-RateLimit-*` headers describing the hourly and daily windows for that endpoint and tier. When a window is exhausted you get `429` with `Retry-After` in seconds plus a `quota` object. Wait `Retry-After` seconds, then retry with exponential backoff and jitter. Cache responses for at least 5 minutes.",
    "contact": {
      "name": "MeByte",
      "url": "https://mebyte.ai/developers"
    },
    "license": {
      "name": "Fair use — attribution required",
      "url": "https://mebyte.ai/terms"
    }
  },
  "servers": [
    {
      "url": "https://mebyte.ai",
      "description": "Production"
    }
  ],
  "tags": [
    {
      "name": "Free tools",
      "description": "Keyless GEO utilities. Tiered quotas via API key."
    },
    {
      "name": "Catalog",
      "description": "Machine-readable index of the tool API."
    },
    {
      "name": "Partner API",
      "description": "Brand-scoped data for authenticated partner clients."
    }
  ],
  "externalDocs": {
    "description": "Developer platform",
    "url": "https://mebyte.ai/developers"
  },
  "paths": {
    "/api/public/v1/openapi.json": {
      "get": {
        "operationId": "getOpenApiSpec",
        "summary": "This OpenAPI document",
        "tags": [
          "Catalog"
        ],
        "responses": {
          "200": {
            "description": "OpenAPI 3.1 document.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/tools": {
      "get": {
        "operationId": "getToolCatalog",
        "summary": "Tool catalog",
        "description": "Machine-readable index of every free tool endpoint, quota and tier.",
        "tags": [
          "Catalog"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          }
        ],
        "responses": {
          "200": {
            "description": "Catalog document.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/tools/crawler-check": {
      "get": {
        "operationId": "crawlerCheckGet",
        "summary": "AI crawler access check",
        "description": "Fetches the site's robots.txt and llms.txt live and reports whether each major AI crawler is allowed. Base quota 20/hour, 100/day.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "parameters": [
          {
            "name": "url",
            "in": "query",
            "required": true,
            "description": "Website address, with or without protocol.",
            "schema": {
              "type": "string",
              "example": "example.com"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/CrawlerCheckResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "crawlerCheckPost",
        "summary": "AI crawler access check",
        "description": "Same as GET, with a JSON body.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/UrlInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/CrawlerCheckResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/tools/llms-txt": {
      "get": {
        "operationId": "llmsTxtGet",
        "summary": "llms.txt generator",
        "description": "Builds the llms.txt file AI crawlers read first. Base quota 60/hour, 400/day. Use `format=text` to get the raw file.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "parameters": [
          {
            "name": "brand",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "summary",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "products",
            "in": "query",
            "description": "Pipe-separated list, e.g. `Widgets|Gadgets`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "differentiators",
            "in": "query",
            "description": "Pipe-separated list.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "audience",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "contact",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "description": "`json` (default) or `text` for the raw llms.txt body.",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "text"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/LlmsTxtResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "llmsTxtPost",
        "summary": "llms.txt generator",
        "description": "Same as GET, with a JSON body (arrays allowed for products/differentiators).",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/LlmsTxtInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/LlmsTxtResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/tools/schema": {
      "get": {
        "operationId": "schemaGenGet",
        "summary": "JSON-LD schema generator",
        "description": "Builds Organization, Product or FAQPage JSON-LD. Base quota 60/hour, 400/day. Use `format=script` for a ready-to-paste <script> tag.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "parameters": [
          {
            "name": "type",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "Organization",
                "Product",
                "FAQPage"
              ]
            }
          },
          {
            "name": "name",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "url",
            "in": "query",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "description",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "logo",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sameAs",
            "in": "query",
            "description": "Pipe-separated URLs.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "price",
            "in": "query",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "currency",
            "in": "query",
            "schema": {
              "type": "string",
              "example": "USD"
            }
          },
          {
            "name": "faqs",
            "in": "query",
            "description": "`question::answer|question::answer`.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "format",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "json",
                "script"
              ]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/SchemaResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "schemaGenPost",
        "summary": "JSON-LD schema generator",
        "description": "Same as GET, with a JSON body.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/SchemaInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/SchemaResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/tools/value": {
      "get": {
        "operationId": "valueEstimateGet",
        "summary": "AI visibility value estimate",
        "description": "Turns a target AI mention rate into revenue, profit, ROI and payback. Base quota 120/hour, 800/day.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "description": "Monthly buyer questions in AI assistants.",
            "schema": {
              "type": "number",
              "default": 4000
            }
          },
          {
            "name": "now",
            "in": "query",
            "description": "Current mention rate (%).",
            "schema": {
              "type": "number",
              "default": 8
            }
          },
          {
            "name": "goal",
            "in": "query",
            "description": "Target mention rate (%).",
            "schema": {
              "type": "number",
              "default": 35
            }
          },
          {
            "name": "aov",
            "in": "query",
            "description": "Average order value.",
            "schema": {
              "type": "number",
              "default": 480
            }
          },
          {
            "name": "cvr",
            "in": "query",
            "description": "Visit to customer conversion (%).",
            "schema": {
              "type": "number",
              "default": 2.5
            }
          },
          {
            "name": "margin",
            "in": "query",
            "description": "Gross margin (%).",
            "schema": {
              "type": "number",
              "default": 60
            }
          },
          {
            "name": "cost",
            "in": "query",
            "description": "Monthly spend on getting recommended.",
            "schema": {
              "type": "number",
              "default": 79
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValueResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "post": {
        "operationId": "valueEstimatePost",
        "summary": "AI visibility value estimate",
        "description": "Same as GET, with a JSON body.",
        "tags": [
          "Free tools"
        ],
        "security": [
          {},
          {
            "ApiKeyHeader": []
          },
          {
            "BearerApiKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ValueInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Success. With an API key you get the full payload; keyless callers get the ShareLink shape instead.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "oneOf": [
                    {
                      "$ref": "#/components/schemas/ValueResult"
                    },
                    {
                      "$ref": "#/components/schemas/ShareLinkResponse"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "description": "Invalid input. `details` maps each failing field to its validation messages.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/InvalidInputError"
                },
                "example": {
                  "error": "invalid_input",
                  "details": {
                    "url": [
                      "Enter a valid website address"
                    ]
                  }
                }
              }
            }
          },
          "429": {
            "description": "Rate limited. The quota object says which window (hourly or daily) is exhausted and when it resets.",
            "headers": {
              "X-RateLimit-Tier": {
                "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "anonymous",
                    "solo",
                    "growth",
                    "partner"
                  ]
                }
              },
              "X-RateLimit-Mode": {
                "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "share-link",
                    "full"
                  ]
                }
              },
              "X-RateLimit-Scope": {
                "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
                "schema": {
                  "type": "string"
                }
              },
              "X-RateLimit-Subject": {
                "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
                "schema": {
                  "type": "string",
                  "enum": [
                    "key",
                    "brand",
                    "ip"
                  ]
                }
              },
              "X-RateLimit-Limit": {
                "description": "Requests allowed in the current hourly window for this scope and tier.",
                "schema": {
                  "type": "integer",
                  "example": 20
                }
              },
              "X-RateLimit-Remaining": {
                "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
                "schema": {
                  "type": "integer",
                  "example": 17
                }
              },
              "X-RateLimit-Reset": {
                "description": "ISO 8601 timestamp when the hourly window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "X-RateLimit-Daily-Limit": {
                "description": "Requests allowed in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 100
                }
              },
              "X-RateLimit-Daily-Remaining": {
                "description": "Requests left in the current daily window.",
                "schema": {
                  "type": "integer",
                  "example": 84
                }
              },
              "X-RateLimit-Daily-Reset": {
                "description": "ISO 8601 timestamp when the daily window resets.",
                "schema": {
                  "type": "string",
                  "format": "date-time"
                }
              },
              "Retry-After": {
                "description": "Seconds to wait before retrying. Only present on 429. Honour it first, then add exponential backoff with jitter.",
                "schema": {
                  "type": "integer",
                  "example": 42
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RateLimitError"
                },
                "example": {
                  "error": "rate_limited",
                  "message": "You reached the hourly quota for tools:crawler-check on the anonymous tier (20/hour, 100/day per ip). Retry in 42s, or cache results for at least 5 minutes. Add an API key header (x-api-key) from a paid plan for a higher limit.",
                  "tier": "anonymous",
                  "quota": {
                    "per": "ip",
                    "tier": "anonymous",
                    "hour_limit": 20,
                    "hour_remaining": 0,
                    "hour_reset": "2026-08-01T09:00:00.000Z",
                    "day_limit": 100,
                    "day_remaining": 63,
                    "day_reset": "2026-08-02T00:00:00.000Z",
                    "retry_after_seconds": 42
                  },
                  "upgrade": "https://mebyte.ai/pricing",
                  "docs": "https://mebyte.ai/developers"
                }
              }
            }
          },
          "500": {
            "description": "Unexpected server error.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GenericError"
                }
              }
            }
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/articles": {
      "get": {
        "operationId": "listArticles",
        "summary": "List published articles",
        "description": "Cursor-paginated feed of published articles for the authenticated client's brand. Requires the `articles:read` scope.",
        "tags": [
          "Partner API"
        ],
        "security": [
          {
            "PartnerClientKey": []
          }
        ],
        "parameters": [
          {
            "name": "updated_since",
            "in": "query",
            "description": "ISO 8601 timestamp filter.",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "cursor",
            "in": "query",
            "description": "Opaque cursor from the previous page.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "schema": {
              "type": "integer",
              "default": 100,
              "maximum": 200
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Article page with `items` and an optional `next_cursor`.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/articles/{id}": {
      "get": {
        "operationId": "getArticle",
        "summary": "Get one article",
        "tags": [
          "Partner API"
        ],
        "security": [
          {
            "PartnerClientKey": []
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Article id or slug.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Article.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "404": {
            "description": "Not found."
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/geo": {
      "get": {
        "operationId": "getGeoVisibility",
        "summary": "Brand AI visibility (and readiness kit)",
        "description": "Requires the `geo:read` scope. Add `include=kit` for llms.txt, robots.txt and schema assets.",
        "tags": [
          "Partner API"
        ],
        "security": [
          {
            "PartnerClientKey": []
          }
        ],
        "parameters": [
          {
            "name": "brand_id",
            "in": "query",
            "description": "Required for multi-brand clients.",
            "schema": {
              "type": "string",
              "format": "uuid"
            }
          },
          {
            "name": "include",
            "in": "query",
            "description": "Comma list; `kit` adds readiness assets.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Visibility payload.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "brand_id is required for this client."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          },
          "403": {
            "$ref": "#/components/responses/Forbidden"
          },
          "404": {
            "description": "Brand not found."
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    },
    "/api/public/v1/events": {
      "post": {
        "operationId": "ingestEvent",
        "summary": "Ingest a conversion event",
        "description": "Server-side conversion ingestion. Requires the `events:write` scope.",
        "tags": [
          "Partner API"
        ],
        "security": [
          {
            "PartnerClientKey": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ConversionEvent"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Accepted.",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Invalid payload."
          },
          "401": {
            "$ref": "#/components/responses/Unauthorized"
          }
        }
      },
      "options": {
        "summary": "CORS preflight",
        "description": "Returns 204 with permissive CORS headers. All rate limit headers are exposed.",
        "responses": {
          "204": {
            "description": "No content."
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "Paid-plan tool key (`mbk_live_...`) issued per brand at /developers. Unlocks full payloads and a multiplied quota."
      },
      "BearerApiKey": {
        "type": "http",
        "scheme": "bearer",
        "description": "Same tool key sent as `Authorization: Bearer mbk_live_...`."
      },
      "PartnerClientKey": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key",
        "description": "Partner client key with scopes (`articles:read`, `geo:read`, `events:write`)."
      }
    },
    "responses": {
      "Unauthorized": {
        "description": "Missing or invalid client key.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/GenericError"
            }
          }
        }
      },
      "Forbidden": {
        "description": "Key lacks the required scope, or the request is outside the client's brand scope.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/GenericError"
            }
          }
        }
      }
    },
    "headers": {
      "X-RateLimit-Tier": {
        "description": "Quota tier applied to this call: anonymous, solo, growth or partner.",
        "schema": {
          "type": "string",
          "enum": [
            "anonymous",
            "solo",
            "growth",
            "partner"
          ]
        }
      },
      "X-RateLimit-Mode": {
        "description": "`share-link` for keyless calls (shareable result URL + headline summary only) or `full` when a valid API key unlocked the machine-readable payload.",
        "schema": {
          "type": "string",
          "enum": [
            "share-link",
            "full"
          ]
        }
      },
      "X-RateLimit-Scope": {
        "description": "Endpoint bucket the quota was counted against, e.g. `tools:crawler-check`.",
        "schema": {
          "type": "string"
        }
      },
      "X-RateLimit-Subject": {
        "description": "What the quota was counted per: `key` when an API key was sent, else `brand` when you passed brand_id, else `ip`.",
        "schema": {
          "type": "string",
          "enum": [
            "key",
            "brand",
            "ip"
          ]
        }
      },
      "X-RateLimit-Limit": {
        "description": "Requests allowed in the current hourly window for this scope and tier.",
        "schema": {
          "type": "integer",
          "example": 20
        }
      },
      "X-RateLimit-Remaining": {
        "description": "Requests left in the current hourly window. Slow down as this approaches 0.",
        "schema": {
          "type": "integer",
          "example": 17
        }
      },
      "X-RateLimit-Reset": {
        "description": "ISO 8601 timestamp when the hourly window resets.",
        "schema": {
          "type": "string",
          "format": "date-time"
        }
      },
      "X-RateLimit-Daily-Limit": {
        "description": "Requests allowed in the current daily window.",
        "schema": {
          "type": "integer",
          "example": 100
        }
      },
      "X-RateLimit-Daily-Remaining": {
        "description": "Requests left in the current daily window.",
        "schema": {
          "type": "integer",
          "example": 84
        }
      },
      "X-RateLimit-Daily-Reset": {
        "description": "ISO 8601 timestamp when the daily window resets.",
        "schema": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "schemas": {
      "RateLimitError": {
        "type": "object",
        "required": [
          "error",
          "message",
          "quota"
        ],
        "properties": {
          "error": {
            "type": "string",
            "const": "rate_limited"
          },
          "message": {
            "type": "string"
          },
          "tier": {
            "type": "string"
          },
          "quota": {
            "type": "object",
            "properties": {
              "per": {
                "type": "string",
                "enum": [
                  "key",
                  "brand",
                  "ip"
                ]
              },
              "tier": {
                "type": "string"
              },
              "hour_limit": {
                "type": "integer"
              },
              "hour_remaining": {
                "type": "integer"
              },
              "hour_reset": {
                "type": "string",
                "format": "date-time"
              },
              "day_limit": {
                "type": "integer"
              },
              "day_remaining": {
                "type": "integer"
              },
              "day_reset": {
                "type": "string",
                "format": "date-time"
              },
              "retry_after_seconds": {
                "type": "integer"
              }
            }
          },
          "upgrade": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "InvalidInputError": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string",
            "const": "invalid_input"
          },
          "details": {
            "type": "object",
            "additionalProperties": {
              "type": "array",
              "items": {
                "type": "string"
              }
            }
          }
        }
      },
      "GenericError": {
        "type": "object",
        "properties": {
          "error": {
            "type": "string"
          }
        }
      },
      "ShareLinkResponse": {
        "type": "object",
        "description": "Keyless response shape: a shareable result page plus a headline summary.",
        "properties": {
          "mode": {
            "type": "string",
            "const": "share_link"
          },
          "tool": {
            "type": "string"
          },
          "message": {
            "type": "string"
          },
          "share_url": {
            "type": "string",
            "format": "uri"
          },
          "summary": {
            "type": "object"
          },
          "tier": {
            "type": "string"
          },
          "quota": {
            "type": "object"
          },
          "get_a_key": {
            "type": "string",
            "format": "uri"
          },
          "docs": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "UrlInput": {
        "type": "object",
        "required": [
          "url"
        ],
        "properties": {
          "url": {
            "type": "string",
            "example": "example.com"
          }
        }
      },
      "CrawlerCheckResult": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string"
          },
          "hasRobots": {
            "type": "boolean"
          },
          "hasLlms": {
            "type": "boolean"
          },
          "blanketBlock": {
            "type": "boolean"
          },
          "allowedCount": {
            "type": "integer"
          },
          "score": {
            "type": "integer"
          },
          "rows": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "bot": {
                  "type": "string"
                },
                "allowed": {
                  "type": "boolean"
                },
                "note": {
                  "type": "string"
                }
              }
            }
          },
          "share_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "LlmsTxtInput": {
        "type": "object",
        "required": [
          "brand",
          "url",
          "summary"
        ],
        "properties": {
          "brand": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "summary": {
            "type": "string"
          },
          "products": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "differentiators": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "audience": {
            "type": "string"
          },
          "contact": {
            "type": "string"
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "text"
            ]
          }
        }
      },
      "LlmsTxtResult": {
        "type": "object",
        "properties": {
          "content": {
            "type": "string",
            "description": "The llms.txt file body."
          },
          "filename": {
            "type": "string",
            "example": "llms.txt"
          },
          "share_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "SchemaInput": {
        "type": "object",
        "required": [
          "type",
          "name",
          "url"
        ],
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "Organization",
              "Product",
              "FAQPage"
            ]
          },
          "name": {
            "type": "string"
          },
          "url": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "logo": {
            "type": "string"
          },
          "sameAs": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "price": {
            "type": "string"
          },
          "currency": {
            "type": "string"
          },
          "faqs": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "question",
                "answer"
              ],
              "properties": {
                "question": {
                  "type": "string"
                },
                "answer": {
                  "type": "string"
                }
              }
            }
          },
          "format": {
            "type": "string",
            "enum": [
              "json",
              "script"
            ]
          }
        }
      },
      "SchemaResult": {
        "type": "object",
        "properties": {
          "schema": {
            "type": "object",
            "description": "The JSON-LD document."
          },
          "script": {
            "type": "string",
            "description": "Ready-to-paste <script type=\"application/ld+json\"> tag."
          },
          "share_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ValueInput": {
        "type": "object",
        "properties": {
          "q": {
            "type": "number",
            "default": 4000
          },
          "now": {
            "type": "number",
            "default": 8
          },
          "goal": {
            "type": "number",
            "default": 35
          },
          "aov": {
            "type": "number",
            "default": 480
          },
          "cvr": {
            "type": "number",
            "default": 2.5
          },
          "margin": {
            "type": "number",
            "default": 60
          },
          "cost": {
            "type": "number",
            "default": 79
          }
        }
      },
      "ValueResult": {
        "type": "object",
        "properties": {
          "inputs": {
            "$ref": "#/components/schemas/ValueInput"
          },
          "click_share": {
            "type": "number",
            "example": 0.28
          },
          "monthly": {
            "type": "object",
            "properties": {
              "extra_answers": {
                "type": "integer"
              },
              "extra_visits": {
                "type": "integer"
              },
              "extra_customers": {
                "type": "integer"
              },
              "extra_revenue": {
                "type": "integer"
              },
              "extra_profit": {
                "type": "integer"
              }
            }
          },
          "annual": {
            "type": "object",
            "properties": {
              "extra_revenue": {
                "type": "integer"
              },
              "extra_profit": {
                "type": "integer"
              }
            }
          },
          "revenue_per_point": {
            "type": "integer"
          },
          "roi": {
            "type": [
              "number",
              "null"
            ]
          },
          "payback_days": {
            "type": [
              "integer",
              "null"
            ]
          },
          "share_url": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "ConversionEvent": {
        "type": "object",
        "required": [
          "event_name",
          "event_id"
        ],
        "properties": {
          "event_name": {
            "type": "string",
            "example": "Purchase"
          },
          "event_id": {
            "type": "string",
            "description": "Idempotency key."
          },
          "event_time": {
            "type": "integer",
            "description": "Unix seconds."
          },
          "value": {
            "type": "number"
          },
          "currency": {
            "type": "string",
            "example": "USD"
          },
          "email_hash": {
            "type": "string",
            "description": "SHA-256 of the lowercased email."
          },
          "event_source_url": {
            "type": "string",
            "format": "uri"
          },
          "attribution": {
            "type": "object",
            "additionalProperties": true
          }
        }
      }
    }
  }
}