{
  "openapi": "3.1.0",
  "info": {
    "title": "1VPS Public API",
    "version": "2026-02-06",
    "summary": "Read-only VPS provider comparison data.",
    "description": "1VPS.com publishes its VPS provider comparison dataset, guide index, and workload recommendations as a public, unauthenticated, read-only JSON API. Every response is a static document served from the edge, so it is safe to poll and cheap to cache. Use it to answer questions like 'which VPS provider is cheapest for 4 GB of RAM' or 'what should I run n8n on' without scraping HTML.",
    "termsOfService": "https://1vps.com/disclaimer/",
    "contact": {
      "name": "1VPS Team",
      "email": "hey@1vps.com",
      "url": "https://1vps.com/contact/"
    },
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    }
  },
  "servers": [
    {
      "url": "https://1vps.com",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "description": "Developer portal",
    "url": "https://1vps.com/developers/"
  },
  "tags": [
    {
      "name": "providers",
      "description": "VPS hosting providers and their plans."
    },
    {
      "name": "content",
      "description": "Published guides, reviews, and comparisons."
    },
    {
      "name": "recommendations",
      "description": "Workload-based hosting recommendations."
    }
  ],
  "paths": {
    "/api/index.json": {
      "get": {
        "operationId": "getApiIndex",
        "summary": "API discovery document",
        "description": "Lists every available endpoint, the OpenAPI spec location, the authentication model (none), and the advertised rate limit. Start here when exploring the API.",
        "tags": [
          "providers"
        ],
        "responses": {
          "200": {
            "description": "Endpoint catalogue.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ApiIndex"
                }
              }
            }
          },
          "404": {
            "description": "Unknown API path.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/providers.json": {
      "get": {
        "operationId": "listProviders",
        "summary": "List all VPS providers",
        "description": "Returns every VPS provider 1VPS has reviewed, including star rating, entry price, data-centre count, uptime, pros and cons, the editorial verdict, and the full plan matrix (vCPU, RAM, storage, bandwidth, monthly price).",
        "tags": [
          "providers"
        ],
        "responses": {
          "200": {
            "description": "The full provider dataset.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderList"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/providers/{providerId}.json": {
      "get": {
        "operationId": "getProvider",
        "summary": "Get one VPS provider",
        "description": "Returns a single provider record by its stable id. Ids are lowercase slugs and never change.",
        "tags": [
          "providers"
        ],
        "parameters": [
          {
            "name": "providerId",
            "in": "path",
            "required": true,
            "description": "Stable lowercase provider id.",
            "schema": {
              "type": "string",
              "enum": [
                "hostinger",
                "digitalocean",
                "vultr",
                "hetzner",
                "linode",
                "contabo",
                "ovh",
                "racknerd"
              ],
              "example": "hostinger"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A single provider record.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ProviderEnvelope"
                }
              }
            }
          },
          "404": {
            "description": "No provider with that id.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/guides.json": {
      "get": {
        "operationId": "listGuides",
        "summary": "List published guides",
        "description": "Returns the index of every English guide, review, and comparison, newest first. Each entry carries both the HTML URL and a `markdownUrl` that serves the raw article body as text/markdown.",
        "tags": [
          "content"
        ],
        "responses": {
          "200": {
            "description": "Guide index.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/GuideList"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    },
    "/api/use-cases.json": {
      "get": {
        "operationId": "listUseCases",
        "summary": "List workload recommendations",
        "description": "Returns workload profiles (Docker, game servers, AI inference, databases, …) with the minimum and recommended VPS specification for each and the providers 1VPS recommends for that workload.",
        "tags": [
          "recommendations"
        ],
        "responses": {
          "200": {
            "description": "Use-case catalogue.",
            "headers": {
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/UseCaseList"
                }
              }
            }
          },
          "429": {
            "description": "Rate limit exceeded.",
            "headers": {
              "Retry-After": {
                "description": "Seconds to wait before retrying. Present on 429 and 503.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Limit": {
                "description": "Requests allowed in the current 60s window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Remaining": {
                "description": "Requests left in the current window.",
                "schema": {
                  "type": "integer",
                  "example": 600
                }
              },
              "RateLimit-Reset": {
                "description": "Seconds until the current window resets.",
                "schema": {
                  "type": "integer",
                  "example": 60
                }
              },
              "RateLimit-Policy": {
                "description": "RFC 9331 policy string for the advertised quota.",
                "schema": {
                  "type": "string",
                  "example": "600;w=60"
                }
              }
            },
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Error"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Error": {
        "type": "object",
        "description": "Uniform error envelope returned by every failing request.",
        "required": [
          "error"
        ],
        "properties": {
          "error": {
            "type": "object",
            "required": [
              "code",
              "message",
              "status",
              "resolution"
            ],
            "properties": {
              "code": {
                "type": "string",
                "description": "Machine-readable error code.",
                "example": "not_found"
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation.",
                "example": "No API resource matches /api/nope.json."
              },
              "status": {
                "type": "integer",
                "description": "HTTP status code, repeated for convenience.",
                "example": 404
              },
              "resolution": {
                "type": "string",
                "description": "Concrete next step that resolves the error.",
                "example": "List available endpoints at https://1vps.com/api/index.json."
              },
              "documentation": {
                "type": "string",
                "format": "uri",
                "description": "Link to the developer portal."
              }
            }
          }
        }
      },
      "Plan": {
        "type": "object",
        "description": "One purchasable VPS tier.",
        "required": [
          "name",
          "price",
          "currency",
          "cpu",
          "ram",
          "storage",
          "bandwidth"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "Plan name as sold by the provider."
          },
          "price": {
            "type": "number",
            "description": "Monthly price."
          },
          "currency": {
            "type": "string",
            "description": "ISO 4217 currency code.",
            "example": "USD"
          },
          "cpu": {
            "type": "string",
            "description": "vCPU allocation.",
            "example": "2 vCPU"
          },
          "ram": {
            "type": "string",
            "description": "Memory allocation.",
            "example": "4GB"
          },
          "storage": {
            "type": "string",
            "description": "Disk allocation.",
            "example": "80GB NVMe"
          },
          "bandwidth": {
            "type": "string",
            "description": "Monthly transfer allowance.",
            "example": "4TB"
          }
        }
      },
      "Provider": {
        "type": "object",
        "description": "A reviewed VPS hosting provider.",
        "required": [
          "id",
          "name",
          "rating",
          "startingPrice",
          "currency",
          "plans",
          "url"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable lowercase slug.",
            "example": "hostinger"
          },
          "name": {
            "type": "string",
            "description": "Brand name."
          },
          "rating": {
            "type": "number",
            "description": "1VPS editorial rating out of 5.",
            "minimum": 0,
            "maximum": 5
          },
          "startingPrice": {
            "type": "number",
            "description": "Cheapest monthly plan price."
          },
          "currency": {
            "type": "string",
            "description": "ISO 4217 currency code."
          },
          "billingCycle": {
            "type": "string",
            "description": "Billing period the price refers to.",
            "example": "monthly"
          },
          "locations": {
            "type": "integer",
            "description": "Number of data-centre regions."
          },
          "uptime": {
            "type": "string",
            "description": "Advertised uptime SLA.",
            "example": "99.9%"
          },
          "support": {
            "type": "string",
            "description": "Support channels and hours."
          },
          "bestFor": {
            "type": "array",
            "description": "Workload slugs this provider suits.",
            "items": {
              "type": "string"
            }
          },
          "features": {
            "type": "array",
            "description": "Notable platform features.",
            "items": {
              "type": "string"
            }
          },
          "pros": {
            "type": "array",
            "description": "Editorial strengths.",
            "items": {
              "type": "string"
            }
          },
          "cons": {
            "type": "array",
            "description": "Editorial weaknesses.",
            "items": {
              "type": "string"
            }
          },
          "verdict": {
            "type": "string",
            "description": "One-line editorial summary."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "1VPS review page."
          },
          "affiliateUrl": {
            "type": "string",
            "format": "uri",
            "description": "Tracked signup link. 1VPS earns a commission."
          },
          "statusPageUrl": {
            "type": "string",
            "format": "uri",
            "description": "Provider status page."
          },
          "plans": {
            "type": "array",
            "description": "Plan matrix.",
            "items": {
              "$ref": "#/components/schemas/Plan"
            }
          },
          "self": {
            "type": "string",
            "format": "uri",
            "description": "Canonical URL of this record."
          }
        }
      },
      "Recommendations": {
        "type": "object",
        "description": "Editorial picks keyed by scenario, valued by provider id.",
        "additionalProperties": {
          "type": "string"
        }
      },
      "ProviderList": {
        "type": "object",
        "required": [
          "version",
          "count",
          "providers"
        ],
        "properties": {
          "version": {
            "type": "string",
            "description": "Dataset version (ISO date)."
          },
          "lastUpdated": {
            "type": "string",
            "format": "date",
            "description": "Date the pricing was last verified."
          },
          "source": {
            "type": "string",
            "description": "Publisher."
          },
          "description": {
            "type": "string",
            "description": "What the dataset covers."
          },
          "count": {
            "type": "integer",
            "description": "Number of providers returned."
          },
          "recommendations": {
            "$ref": "#/components/schemas/Recommendations"
          },
          "providers": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Provider"
            }
          }
        }
      },
      "ProviderEnvelope": {
        "type": "object",
        "required": [
          "version",
          "provider"
        ],
        "properties": {
          "version": {
            "type": "string",
            "description": "Dataset version (ISO date)."
          },
          "provider": {
            "$ref": "#/components/schemas/Provider"
          }
        }
      },
      "Guide": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "description",
          "type",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "URL slug."
          },
          "title": {
            "type": "string",
            "description": "Article title."
          },
          "description": {
            "type": "string",
            "description": "Meta description."
          },
          "type": {
            "type": "string",
            "description": "Article kind.",
            "example": "comparison"
          },
          "keywords": {
            "type": "array",
            "description": "Target keywords.",
            "items": {
              "type": "string"
            }
          },
          "published": {
            "type": "string",
            "format": "date",
            "description": "Publication date."
          },
          "readTimeMinutes": {
            "type": "integer",
            "description": "Estimated reading time."
          },
          "author": {
            "type": "string",
            "description": "Author id."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "HTML URL."
          },
          "markdownUrl": {
            "type": "string",
            "format": "uri",
            "description": "Raw markdown URL (text/markdown)."
          }
        }
      },
      "GuideList": {
        "type": "object",
        "required": [
          "version",
          "count",
          "guides"
        ],
        "properties": {
          "version": {
            "type": "string",
            "description": "Dataset version (ISO date)."
          },
          "count": {
            "type": "integer",
            "description": "Number of guides returned."
          },
          "guides": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Guide"
            }
          }
        }
      },
      "Spec": {
        "type": "object",
        "description": "A VPS sizing recommendation.",
        "properties": {
          "cpu": {
            "type": "string",
            "description": "vCPU count."
          },
          "ram": {
            "type": "string",
            "description": "Memory."
          },
          "storage": {
            "type": "string",
            "description": "Disk."
          },
          "bandwidth": {
            "type": "string",
            "description": "Monthly transfer."
          }
        }
      },
      "UseCase": {
        "type": "object",
        "required": [
          "slug",
          "title",
          "description",
          "url"
        ],
        "properties": {
          "slug": {
            "type": "string",
            "description": "Workload slug."
          },
          "title": {
            "type": "string",
            "description": "Workload name."
          },
          "description": {
            "type": "string",
            "description": "What the workload involves."
          },
          "tags": {
            "type": "array",
            "description": "Related topic tags.",
            "items": {
              "type": "string"
            }
          },
          "minimumSpec": {
            "$ref": "#/components/schemas/Spec"
          },
          "recommendedSpec": {
            "$ref": "#/components/schemas/Spec"
          },
          "startingAt": {
            "type": "string",
            "description": "Typical monthly entry cost.",
            "example": "$5"
          },
          "recommendedProviders": {
            "type": "array",
            "description": "Providers 1VPS recommends for this workload, with rationale.",
            "items": {
              "type": "object",
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Provider id."
                },
                "reason": {
                  "type": "string",
                  "description": "Why this provider fits."
                }
              }
            }
          },
          "url": {
            "type": "string",
            "format": "uri",
            "description": "HTML guide URL."
          }
        }
      },
      "UseCaseList": {
        "type": "object",
        "required": [
          "version",
          "count",
          "useCases"
        ],
        "properties": {
          "version": {
            "type": "string",
            "description": "Dataset version (ISO date)."
          },
          "count": {
            "type": "integer",
            "description": "Number of use cases returned."
          },
          "useCases": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/UseCase"
            }
          }
        }
      },
      "ApiIndex": {
        "type": "object",
        "required": [
          "name",
          "version",
          "endpoints"
        ],
        "properties": {
          "name": {
            "type": "string",
            "description": "API name."
          },
          "version": {
            "type": "string",
            "description": "Dataset version (ISO date)."
          },
          "description": {
            "type": "string",
            "description": "What the API serves."
          },
          "documentation": {
            "type": "string",
            "format": "uri",
            "description": "Developer portal."
          },
          "openapi": {
            "type": "string",
            "format": "uri",
            "description": "OpenAPI document."
          },
          "llmsTxt": {
            "type": "string",
            "format": "uri",
            "description": "llms.txt summary for agents."
          },
          "authentication": {
            "type": "string",
            "description": "Auth model. Always \"none\"."
          },
          "rateLimit": {
            "type": "object",
            "description": "Advertised quota and the headers used to report it.",
            "properties": {
              "requests": {
                "type": "integer",
                "description": "Requests per window."
              },
              "windowSeconds": {
                "type": "integer",
                "description": "Window length in seconds."
              },
              "headers": {
                "type": "array",
                "description": "Rate-limit headers returned.",
                "items": {
                  "type": "string"
                }
              }
            }
          },
          "endpoints": {
            "type": "array",
            "description": "Every available operation.",
            "items": {
              "type": "object",
              "properties": {
                "operationId": {
                  "type": "string",
                  "description": "Matches the OpenAPI operationId."
                },
                "method": {
                  "type": "string",
                  "description": "HTTP method."
                },
                "url": {
                  "type": "string",
                  "description": "Absolute URL template."
                },
                "description": {
                  "type": "string",
                  "description": "What the operation returns."
                }
              }
            }
          }
        }
      }
    }
  }
}
