{
  "openapi": "3.1.0",
  "info": {
    "title": "PromptQL.io Public API",
    "version": "1.3.0",
    "description": "Version 1 of the read-only discovery and Markdown API for the public PromptQL website. PromptQL project data and actions are not exposed here. Backward-compatible additive changes may be made within v1; breaking changes require a new URL version. Canonical responses advertise the RFC 9727 API catalog, ARD catalog, and OpenAPI service description with RFC 8288 Link headers. The unversioned aliases are deprecated, but no removal date is scheduled. Deprecations are announced before removal in the public API lifecycle policy and this OpenAPI document. GET and HEAD requests to the catalog and Markdown operations share an enforced quota of 120 requests per 60 seconds for each client and host at each Cloudflare location. Successful and error responses advertise that policy with RateLimit-Policy; quota rejections return 429 application/problem+json with Retry-After. Cloudflare's limiter is intentionally permissive and eventually consistent, so no remaining-request count is claimed. For authenticated project-scoped MCP setup, open the MCP page inside your PromptQL project.",
    "contact": {
      "name": "PromptQL",
      "url": "https://promptql.io/contact-us"
    },
    "x-api-version": "v1",
    "x-versioning-policy": {
      "additiveChanges": "Backward-compatible additive changes may be made within v1.",
      "breakingChanges": "Breaking changes require a new URL version.",
      "deprecation": "The unversioned aliases are deprecated. Deprecations are announced in the public API lifecycle policy and OpenAPI document before removal. No alias removal date is currently scheduled."
    },
    "x-lifecycle-policy": "https://promptql.io/api-lifecycle.md"
  },
  "servers": [
    {
      "url": "https://promptql.io",
      "description": "Production"
    }
  ],
  "security": [],
  "tags": [
    {
      "name": "Discovery",
      "description": "Machine-readable public product discovery."
    },
    {
      "name": "Content",
      "description": "Agent-readable public website content."
    }
  ],
  "paths": {
    "/api/v1": {
      "get": {
        "operationId": "getV1PublicApiCatalog",
        "summary": "Get the v1 public API catalog",
        "description": "Returns the canonical v1 endpoint links, versioning policy, OpenAPI contract, llms.txt, and a pointer to authenticated project-scoped MCP setup. No authentication is required.",
        "tags": ["Discovery"],
        "security": [],
        "responses": {
          "200": {
            "description": "Public discovery catalog.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiCatalog"
                }
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headV1PublicApiCatalog",
        "summary": "Check the v1 public API catalog",
        "description": "Returns the same status and headers as GET without a response body.",
        "tags": ["Discovery"],
        "security": [],
        "responses": {
          "200": {
            "description": "The public discovery catalog is available.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              }
            }
          }
        }
      }
    },
    "/api/v1/markdown": {
      "get": {
        "operationId": "getV1PageMarkdown",
        "summary": "Get a public PromptQL.io page as Markdown",
        "description": "Returns the bundled Markdown twin for a known public route. Use /sitemap.xml or /llms.txt to discover pages before calling this endpoint.",
        "tags": ["Content"],
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/MarkdownRoute"
          }
        ],
        "responses": {
          "200": {
            "description": "Markdown representation of the requested page.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "400": {
            "description": "The route query parameter is missing or malformed.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No Markdown twin exists for the requested route.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headV1PageMarkdown",
        "summary": "Check whether a Markdown page exists",
        "description": "Returns the same status and headers as GET without a response body.",
        "tags": ["Content"],
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/MarkdownRoute"
          }
        ],
        "responses": {
          "200": {
            "description": "The Markdown representation exists.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              }
            }
          },
          "400": {
            "description": "The route query parameter is missing or malformed.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              }
            }
          },
          "404": {
            "description": "No Markdown twin exists for the requested route.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Link": {
                "$ref": "#/components/headers/DiscoveryLink"
              },
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              }
            }
          }
        }
      }
    },
    "/api": {
      "get": {
        "operationId": "getPublicApiCatalogAlias",
        "summary": "Get the public API catalog through the compatibility alias",
        "description": "Compatibility alias for GET /api/v1. New integrations should use the versioned URL.",
        "deprecated": true,
        "tags": ["Discovery"],
        "security": [],
        "responses": {
          "200": {
            "description": "Public discovery catalog.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiCatalog"
                }
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headPublicApiCatalogAlias",
        "summary": "Check the public API catalog through the compatibility alias",
        "description": "Compatibility alias for HEAD /api/v1. New integrations should use the versioned URL.",
        "deprecated": true,
        "tags": ["Discovery"],
        "security": [],
        "responses": {
          "200": {
            "description": "The public discovery catalog is available.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          }
        }
      }
    },
    "/api/markdown": {
      "get": {
        "operationId": "getPageMarkdownAlias",
        "summary": "Get page Markdown through the compatibility alias",
        "description": "Compatibility alias for GET /api/v1/markdown. New integrations should use the versioned URL.",
        "deprecated": true,
        "tags": ["Content"],
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/MarkdownRoute"
          }
        ],
        "responses": {
          "200": {
            "description": "Markdown representation of the requested page.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "400": {
            "description": "The route query parameter is missing or malformed.",
            "headers": {
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "404": {
            "description": "No Markdown twin exists for the requested route.",
            "headers": {
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            },
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          }
        }
      },
      "head": {
        "operationId": "headPageMarkdownAlias",
        "summary": "Check page Markdown through the compatibility alias",
        "description": "Compatibility alias for HEAD /api/v1/markdown. New integrations should use the versioned URL.",
        "deprecated": true,
        "tags": ["Content"],
        "security": [],
        "parameters": [
          {
            "$ref": "#/components/parameters/MarkdownRoute"
          }
        ],
        "responses": {
          "200": {
            "description": "The Markdown representation exists.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          },
          "429": {
            "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
            "headers": {
              "RateLimit-Policy": {
                "$ref": "#/components/headers/RateLimitPolicy"
              },
              "Retry-After": {
                "$ref": "#/components/headers/RetryAfter"
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          },
          "400": {
            "description": "The route query parameter is missing or malformed.",
            "headers": {
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          },
          "404": {
            "description": "No Markdown twin exists for the requested route.",
            "headers": {
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          },
          "405": {
            "description": "The HTTP method is not supported.",
            "headers": {
              "Allow": {
                "schema": {
                  "type": "string"
                },
                "description": "Supported methods."
              },
              "Deprecation": {
                "$ref": "#/components/headers/Deprecation"
              },
              "Link": {
                "$ref": "#/components/headers/LifecycleLink"
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "parameters": {
      "MarkdownRoute": {
        "name": "route",
        "in": "query",
        "required": true,
        "description": "Normalized website route, such as /product or /en/docs. Use /index for the homepage.",
        "schema": {
          "type": "string",
          "minLength": 1,
          "pattern": "^/"
        },
        "example": "/product"
      }
    },
    "schemas": {
      "ApiCatalog": {
        "type": "object",
        "additionalProperties": false,
        "required": [
          "name",
          "version",
          "canonical",
          "aliases",
          "openapi",
          "llms",
          "endpoints",
          "versioningPolicy",
          "rateLimitPolicy",
          "projectMcp"
        ],
        "properties": {
          "name": {
            "type": "string",
            "example": "PromptQL.io Public API"
          },
          "version": {
            "type": "string",
            "const": "v1"
          },
          "canonical": {
            "type": "string",
            "format": "uri"
          },
          "aliases": {
            "type": "array",
            "items": {
              "type": "string",
              "format": "uri"
            },
            "minItems": 1,
            "uniqueItems": true
          },
          "openapi": {
            "type": "string",
            "format": "uri"
          },
          "llms": {
            "type": "string",
            "format": "uri"
          },
          "endpoints": {
            "$ref": "#/components/schemas/ApiEndpoints"
          },
          "versioningPolicy": {
            "$ref": "#/components/schemas/VersioningPolicy"
          },
          "rateLimitPolicy": {
            "$ref": "#/components/schemas/RateLimitPolicy"
          },
          "projectMcp": {
            "$ref": "#/components/schemas/ProjectMcp"
          }
        }
      },
      "ApiEndpoints": {
        "type": "object",
        "additionalProperties": false,
        "required": ["catalog", "markdown"],
        "properties": {
          "catalog": {
            "type": "string",
            "format": "uri"
          },
          "markdown": {
            "type": "string",
            "format": "uri"
          }
        }
      },
      "VersioningPolicy": {
        "type": "object",
        "additionalProperties": false,
        "required": ["additiveChanges", "breakingChanges", "deprecation"],
        "properties": {
          "additiveChanges": {
            "type": "string"
          },
          "breakingChanges": {
            "type": "string"
          },
          "deprecation": {
            "type": "string"
          }
        }
      },
      "RateLimitPolicy": {
        "type": "object",
        "additionalProperties": false,
        "required": ["quota", "windowSeconds", "scope", "responseHeaders"],
        "properties": {
          "quota": {
            "type": "integer",
            "const": 120
          },
          "windowSeconds": {
            "type": "integer",
            "const": 60
          },
          "scope": {
            "type": "string"
          },
          "responseHeaders": {
            "type": "string"
          }
        }
      },
      "ProjectMcp": {
        "type": "object",
        "additionalProperties": false,
        "required": ["setup", "note"],
        "properties": {
          "setup": {
            "type": "string",
            "example": "<project_url>/mcp"
          },
          "note": {
            "type": "string"
          }
        }
      },
      "Problem": {
        "type": "object",
        "additionalProperties": false,
        "description": "RFC 9457-style structured error with a stable machine-readable code and recovery hint.",
        "required": ["type", "title", "status", "detail", "code", "resolution"],
        "properties": {
          "type": {
            "type": "string",
            "format": "uri-reference"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "integer",
            "minimum": 400,
            "maximum": 599
          },
          "detail": {
            "type": "string"
          },
          "code": {
            "type": "string",
            "pattern": "^[a-z0-9_]+$"
          },
          "resolution": {
            "type": "string"
          },
          "instance": {
            "type": "string",
            "format": "uri-reference"
          }
        }
      }
    },
    "responses": {
      "ApiCatalogSuccess": {
        "description": "Public discovery catalog.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/ApiCatalog"
            }
          }
        }
      },
      "ApiCatalogHeadSuccess": {
        "description": "The public discovery catalog is available.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        }
      },
      "MarkdownSuccess": {
        "description": "Markdown representation of the requested page.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        },
        "content": {
          "text/markdown": {
            "schema": {
              "type": "string"
            }
          }
        }
      },
      "MarkdownHeadSuccess": {
        "description": "The Markdown representation exists.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          }
        }
      },
      "InvalidRoute": {
        "description": "The route query parameter is missing or malformed.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "HeadInvalidRoute": {
        "description": "The route query parameter is missing or malformed.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          }
        }
      },
      "MarkdownRouteNotFound": {
        "description": "No Markdown twin exists for the requested route.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "HeadMarkdownRouteNotFound": {
        "description": "No Markdown twin exists for the requested route.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          }
        }
      },
      "ApiRouteNotFound": {
        "description": "No public API operation matches the requested /api path.",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "RateLimitExceeded": {
        "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "HeadRateLimitExceeded": {
        "description": "The per-client, per-host public API quota at this Cloudflare location has been exceeded.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "RateLimit-Policy": {
            "$ref": "#/components/headers/RateLimitPolicy"
          },
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        }
      },
      "MethodNotAllowed": {
        "description": "The HTTP method is not supported.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "Allow": {
            "schema": {
              "type": "string"
            },
            "description": "Supported methods."
          }
        },
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem"
            }
          }
        }
      },
      "HeadMethodNotAllowed": {
        "description": "The HTTP method is not supported.",
        "headers": {
          "Link": {
            "$ref": "#/components/headers/DiscoveryLink"
          },
          "Allow": {
            "schema": {
              "type": "string"
            },
            "description": "Supported methods."
          }
        }
      }
    },
    "headers": {
      "Deprecation": {
        "description": "Signals that an unversioned compatibility alias is deprecated. Canonical versioned routes do not send this header.",
        "schema": {
          "type": "string",
          "const": "true"
        }
      },
      "LifecycleLink": {
        "description": "Links a deprecated alias to the public API lifecycle policy using the deprecation relation.",
        "schema": {
          "type": "string",
          "const": "<https://promptql.io/api-lifecycle.md>; rel=\"deprecation\"; type=\"text/markdown\""
        }
      },
      "DiscoveryLink": {
        "description": "Advertises the RFC 9727 API catalog, ARD catalog, and OpenAPI service description from canonical API responses.",
        "schema": {
          "type": "string",
          "const": "<https://promptql.io/.well-known/api-catalog>; rel=\"api-catalog\"; type=\"application/linkset+json\", <https://promptql.io/.well-known/ard.json>; rel=\"ard\"; type=\"application/json\", <https://promptql.io/openapi.json>; rel=\"service-desc\"; type=\"application/json\""
        }
      },
      "RateLimitPolicy": {
        "description": "RFC RateLimit policy identifier, enforced request quota, and window. The Cloudflare binding does not expose remaining/reset counters, so those values are not fabricated.",
        "schema": {
          "type": "string",
          "const": "\"promptql-public-api\";q=120;w=60"
        }
      },
      "RetryAfter": {
        "description": "Seconds to wait before retrying after a quota rejection.",
        "schema": {
          "type": "integer",
          "const": 60
        }
      }
    }
  }
}
