{
  "openapi": "3.1.0",
  "info": {
    "title": "Rent-a-Skip public API",
    "version": "1.0.0",
    "description": "Read-only access to the public data behind Rent-a-Skip, a UK skip hire price comparison site: indicative skip hire price ranges by town or postcode area, council skip permit rules, a recommended skip size for a job, and whether a town is covered.\n\nPrices are indicative ranges in GBP, based on June 2026 research into local skip hire prices. The firm price is confirmed on the booking call.\n\nBooking happens by phone: each town has a number that connects the caller to a vetted local operator. This API does not take bookings.\n\nNo authentication is needed. Requests are rate limited to 60 per 5 minutes per IP address; a 429 response carries a Retry-After header. Successful responses are publicly cacheable for an hour.\n\nEvery success is wrapped as {\"data\": ..., \"meta\": {...}} and every error as {\"error\": {\"code\", \"message\", \"hint\"}}. The same lookups are also available as tools on the MCP server at /api/mcp.",
    "contact": {
      "url": "https://www.rent-a-skip.co.uk/developers"
    }
  },
  "servers": [
    {
      "url": "https://www.rent-a-skip.co.uk",
      "description": "Production"
    }
  ],
  "externalDocs": {
    "url": "https://www.rent-a-skip.co.uk/developers",
    "description": "Developer guide"
  },
  "security": [],
  "tags": [
    {
      "name": "prices",
      "description": "Indicative skip hire price ranges."
    },
    {
      "name": "permits",
      "description": "Council skip permit rules."
    },
    {
      "name": "skip-sizes",
      "description": "Skip size recommendations."
    },
    {
      "name": "coverage",
      "description": "Town coverage."
    }
  ],
  "paths": {
    "/api/v1/prices": {
      "get": {
        "operationId": "getSkipPrices",
        "summary": "Skip hire prices for a town or postcode area",
        "description": "Returns indicative skip hire price ranges (low, median and high, in GBP) per skip size for a covered town or a UK postcode area. Provide exactly one of town or postcode_area. A town lookup also returns the town page link and booking phone number. Same payload as the get_skip_prices MCP tool.",
        "tags": [
          "prices"
        ],
        "parameters": [
          {
            "name": "town",
            "in": "query",
            "required": false,
            "description": "Town slug, for example \"westbury\" or \"milton-keynes\". Use checkCoverage to find one. Provide this or postcode_area, not both.",
            "schema": {
              "type": "string",
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9-]+$"
            },
            "example": "westbury"
          },
          {
            "name": "postcode_area",
            "in": "query",
            "required": false,
            "description": "UK postcode area letters, for example \"BA\" or \"M\". A district or full postcode such as \"BA13 3AB\" is reduced to its area. Provide this or town, not both.",
            "schema": {
              "type": "string",
              "maxLength": 10
            },
            "example": "BA"
          }
        ],
        "responses": {
          "200": {
            "description": "Indicative price ranges for the area.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PricesResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/api/v1/permits": {
      "get": {
        "operationId": "getPermitInfo",
        "summary": "Council skip permit rules",
        "description": "Returns the council skip permit rules for placing a skip on a public road: fee, permit period, notice needed, renewal, application link, last-verified date and data confidence. Provide exactly one of council or town. When a council name matches several councils the response is a candidates list; repeat the call with one exact name. A skip on a private driveway needs no permit. Same payload as the get_permit_info MCP tool.",
        "tags": [
          "permits"
        ],
        "parameters": [
          {
            "name": "council",
            "in": "query",
            "required": false,
            "description": "Highways authority name, case-insensitive, for example \"Kent\" or \"Wiltshire Council\". Provide this or town, not both.",
            "schema": {
              "type": "string",
              "maxLength": 100
            },
            "example": "Kent"
          },
          {
            "name": "town",
            "in": "query",
            "required": false,
            "description": "Town slug; the permit rules of the council covering that town are returned. Provide this or council, not both.",
            "schema": {
              "type": "string",
              "maxLength": 80,
              "pattern": "^[A-Za-z0-9-]+$"
            },
            "example": "westbury"
          }
        ],
        "responses": {
          "200": {
            "description": "Permit rules, or a list of candidate councils.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PermitsResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "404": {
            "$ref": "#/components/responses/NotFound"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/api/v1/skip-size-recommendation": {
      "get": {
        "operationId": "recommendSkipSize",
        "summary": "Recommend a skip size for a job",
        "description": "Recommends a skip size from the job type, waste type and scale, using the same rules as the skip size calculator on the site. Returns capacity, weight guidance, the national indicative price range, one size up and down, and the calculator link. Same payload as the recommend_skip_size MCP tool.",
        "tags": [
          "skip-sizes"
        ],
        "parameters": [
          {
            "name": "job_type",
            "in": "query",
            "required": true,
            "description": "The kind of job. One of: \"home-garage-clearance\" (Home or garage clearance: Decluttering, furniture, general household waste); \"bathroom-refit\" (Bathroom refit: Suite, tiles, a little plasterboard); \"kitchen-refit\" (Kitchen refit: Cabinets, worktops, flooring, appliances); \"garden-clearance\" (Garden clearance: Greenery, turf, branches, landscaping waste); \"general-renovation\" (General renovation: Multiple rooms or a whole-house refresh); \"construction-trade\" (Construction or trade: Building sites, extensions, partition walls).",
            "schema": {
              "type": "string",
              "enum": [
                "home-garage-clearance",
                "bathroom-refit",
                "kitchen-refit",
                "garden-clearance",
                "general-renovation",
                "construction-trade"
              ]
            },
            "example": "home-garage-clearance"
          },
          {
            "name": "waste_type",
            "in": "query",
            "required": true,
            "description": "The waste type. One of: \"general\" (General or light: Mixed household, wood, furniture, garden waste); \"heavy\" (Heavy: Soil, rubble, brick, concrete).",
            "schema": {
              "type": "string",
              "enum": [
                "general",
                "heavy"
              ]
            },
            "example": "general"
          },
          {
            "name": "scale",
            "in": "query",
            "required": true,
            "description": "Job scale as a whole number: 1 = Small, a car boot or two; 2 = Modest, a small van load; 3 = Average, about one full room; 4 = Large, several rooms; 5 = Very large, a whole property.",
            "schema": {
              "type": "integer",
              "enum": [
                1,
                2,
                3,
                4,
                5
              ]
            },
            "example": 3
          },
          {
            "name": "placement",
            "in": "query",
            "required": false,
            "description": "Optional. Where the skip will sit; adds permit guidance and never changes the size. One of: \"driveway\" (Driveway or private land: No council permit needed); \"road\" (Road, pavement or verge: Needs a council permit).",
            "schema": {
              "type": "string",
              "enum": [
                "driveway",
                "road"
              ]
            },
            "example": "driveway"
          }
        ],
        "responses": {
          "200": {
            "description": "The recommended skip size.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/RecommendationResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    },
    "/api/v1/coverage": {
      "get": {
        "operationId": "checkCoverage",
        "summary": "Check whether a town is covered",
        "description": "Checks whether a UK town, given by name or slug, has a covered town page, and returns its slug, town page link, county hub link and booking phone number. Suburbs served by a parent town page resolve to that town. A town that is not covered returns 200 with covered set to false. Same payload as the check_coverage MCP tool.",
        "tags": [
          "coverage"
        ],
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": true,
            "description": "A UK town name or town slug, for example \"Westbury\" or \"leigh-on-sea\".",
            "schema": {
              "type": "string",
              "minLength": 2,
              "maxLength": 100
            },
            "example": "Westbury"
          }
        ],
        "responses": {
          "200": {
            "description": "Coverage for the town.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CoverageResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/BadRequest"
          },
          "429": {
            "$ref": "#/components/responses/RateLimited"
          },
          "500": {
            "$ref": "#/components/responses/InternalError"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Meta": {
        "type": "object",
        "description": "Links to the developer guide and this OpenAPI document.",
        "properties": {
          "docs": {
            "type": "string",
            "description": "Developer guide for this API.",
            "format": "uri"
          },
          "openapi": {
            "type": "string",
            "description": "This OpenAPI document.",
            "format": "uri"
          }
        },
        "required": [
          "docs",
          "openapi"
        ]
      },
      "Error": {
        "type": "object",
        "description": "Error envelope returned with every non-2xx status.",
        "properties": {
          "error": {
            "type": "object",
            "description": "What went wrong and how to fix the call.",
            "properties": {
              "code": {
                "type": "string",
                "description": "Machine-readable error code. The HTTP status matches the code.",
                "enum": [
                  "invalid_request",
                  "not_found",
                  "rate_limited",
                  "method_not_allowed",
                  "internal_error"
                ]
              },
              "message": {
                "type": "string",
                "description": "A human-readable sentence describing the problem."
              },
              "hint": {
                "type": "string",
                "description": "How to fix the request, or where to find the documentation."
              }
            },
            "required": [
              "code",
              "message",
              "hint"
            ]
          }
        },
        "required": [
          "error"
        ]
      },
      "SkipSizeSlug": {
        "type": "string",
        "description": "A standard skip size slug from the skip size calculator.",
        "enum": [
          "mini-2-yard",
          "midi-4-yard",
          "builders-6-yard",
          "large-builders-8-yard",
          "maxi-10-yard",
          "large-maxi-12-yard"
        ]
      },
      "SizePrice": {
        "type": "object",
        "description": "Indicative price range for one skip size in the area.",
        "properties": {
          "size": {
            "type": "string",
            "description": "Display name of the skip size."
          },
          "slug": {
            "type": "string",
            "description": "Skip size slug."
          },
          "yards": {
            "type": [
              "number",
              "null"
            ],
            "description": "Capacity in cubic yards, when known."
          },
          "lowGbp": {
            "type": "number",
            "description": "Low end of the indicative range, in GBP."
          },
          "medianGbp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Median of the indicative range, in GBP, when recorded."
          },
          "highGbp": {
            "type": "number",
            "description": "High end of the indicative range, in GBP."
          },
          "operatorQuoted": {
            "type": "boolean",
            "description": "True when the range is the quote of the local operator assigned to the area rather than the general area range."
          }
        },
        "required": [
          "size",
          "slug",
          "yards",
          "lowGbp",
          "medianGbp",
          "highGbp",
          "operatorQuoted"
        ]
      },
      "Prices": {
        "type": "object",
        "description": "Indicative skip hire price ranges for a town or postcode area.",
        "properties": {
          "area": {
            "type": "object",
            "description": "The area the prices apply to.",
            "properties": {
              "postcodeArea": {
                "type": "string",
                "description": "UK postcode area letters, for example \"BA\"."
              },
              "town": {
                "type": "string",
                "description": "Town name, present for a town lookup."
              },
              "townSlug": {
                "type": "string",
                "description": "Town slug, present for a town lookup."
              },
              "county": {
                "type": [
                  "string",
                  "null"
                ],
                "description": "County of the town, present for a town lookup."
              }
            },
            "required": [
              "postcodeArea"
            ]
          },
          "currency": {
            "type": "string",
            "description": "Currency of every price.",
            "const": "GBP"
          },
          "prices": {
            "type": "array",
            "description": "One entry per priced skip size.",
            "items": {
              "$ref": "#/components/schemas/SizePrice"
            }
          },
          "lastVerified": {
            "type": [
              "string",
              "null"
            ],
            "description": "Latest date any of these prices was verified.",
            "format": "date"
          },
          "note": {
            "type": "string",
            "description": "How to read the prices: indicative ranges, firm price confirmed on the call."
          },
          "booking": {
            "type": "string",
            "description": "How booking works: by phone to a vetted local operator."
          },
          "townPageUrl": {
            "type": "string",
            "description": "The town page on the site, present for a town lookup.",
            "format": "uri"
          },
          "bookingPhone": {
            "type": "string",
            "description": "Phone number for the town, present when one is assigned."
          }
        },
        "required": [
          "area",
          "currency",
          "prices",
          "lastVerified",
          "note",
          "booking"
        ]
      },
      "Permit": {
        "type": "object",
        "description": "Council skip permit rules for placing a skip on a public road.",
        "properties": {
          "council": {
            "type": "string",
            "description": "Highways authority name."
          },
          "town": {
            "type": "string",
            "description": "Town name, present for a town lookup."
          },
          "townPageUrl": {
            "type": "string",
            "description": "The town page on the site, present for a town lookup.",
            "format": "uri"
          },
          "region": {
            "type": [
              "string",
              "null"
            ],
            "description": "Region of the council."
          },
          "permitFeeGbp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Published skip permit fee in GBP, null when not published."
          },
          "feeNote": {
            "type": "string",
            "description": "Present when the council does not publish a fee."
          },
          "permitPeriodDays": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days the permit lasts."
          },
          "noticeWorkingDays": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Working days of notice the council needs."
          },
          "renewalFeeGbp": {
            "type": [
              "number",
              "null"
            ],
            "description": "Fee to renew the permit, in GBP."
          },
          "renewalPeriodDays": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Days a renewal adds."
          },
          "maxTotalDays": {
            "type": [
              "integer",
              "null"
            ],
            "description": "Longest total period allowed."
          },
          "restrictions": {
            "type": [
              "string",
              "null"
            ],
            "description": "Summary of any placement restrictions."
          },
          "applicationUrl": {
            "type": [
              "string",
              "null"
            ],
            "description": "The council application page.",
            "format": "uri"
          },
          "lastVerified": {
            "type": "string",
            "description": "Date the permit record was last verified.",
            "format": "date"
          },
          "confidence": {
            "type": "string",
            "description": "Confidence in the permit record.",
            "enum": [
              "high",
              "medium",
              "low",
              "unverified"
            ]
          },
          "privateLand": {
            "type": "string",
            "description": "A skip on a private driveway or private land needs no permit."
          },
          "note": {
            "type": "string",
            "description": "Who usually applies for the permit."
          },
          "permitCheckerUrl": {
            "type": "string",
            "description": "The skip permit checker on the site.",
            "format": "uri"
          }
        },
        "required": [
          "council",
          "region",
          "permitFeeGbp",
          "permitPeriodDays",
          "noticeWorkingDays",
          "renewalFeeGbp",
          "renewalPeriodDays",
          "maxTotalDays",
          "restrictions",
          "applicationUrl",
          "lastVerified",
          "confidence",
          "privateLand",
          "note",
          "permitCheckerUrl"
        ]
      },
      "CouncilCandidates": {
        "type": "object",
        "description": "Returned when a council name matches several councils. Repeat the call with one exact council name.",
        "properties": {
          "ambiguous": {
            "type": "boolean",
            "const": true,
            "description": "Always true for this shape."
          },
          "message": {
            "type": "string",
            "description": "What to do next."
          },
          "candidates": {
            "type": "array",
            "description": "Matching councils, up to 10, sorted by name.",
            "items": {
              "type": "object",
              "description": "A matching council.",
              "properties": {
                "council": {
                  "type": "string",
                  "description": "Exact council name to pass back."
                },
                "region": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Region of the council."
                }
              },
              "required": [
                "council",
                "region"
              ]
            }
          }
        },
        "required": [
          "ambiguous",
          "message",
          "candidates"
        ]
      },
      "SkipSizeSummary": {
        "type": "object",
        "description": "Capacity, weight and national indicative price for one skip size.",
        "properties": {
          "slug": {
            "$ref": "#/components/schemas/SkipSizeSlug"
          },
          "name": {
            "type": "string",
            "description": "Display name, for example \"6 Yard Skip\"."
          },
          "category": {
            "type": "string",
            "description": "Industry category, for example \"builders\"."
          },
          "cubicYards": {
            "type": "number",
            "description": "Capacity in cubic yards."
          },
          "cubicMetres": {
            "type": "number",
            "description": "Capacity in cubic metres."
          },
          "binBags": {
            "type": "string",
            "description": "Approximate capacity in household bin bags."
          },
          "maxWeightTonnes": {
            "type": "number",
            "description": "Typical maximum payload in tonnes."
          },
          "dimensionsMetric": {
            "type": "object",
            "description": "External dimensions in metres.",
            "properties": {
              "length": {
                "type": "string",
                "description": "Length."
              },
              "width": {
                "type": "string",
                "description": "Width."
              },
              "height": {
                "type": "string",
                "description": "Height."
              }
            },
            "required": [
              "length",
              "width",
              "height"
            ]
          },
          "indicativePriceGbp": {
            "type": "object",
            "description": "National indicative price range in GBP.",
            "properties": {
              "low": {
                "type": "number",
                "description": "Low end, in GBP."
              },
              "high": {
                "type": "number",
                "description": "High end, in GBP."
              }
            },
            "required": [
              "low",
              "high"
            ]
          }
        },
        "required": [
          "slug",
          "name",
          "category",
          "cubicYards",
          "cubicMetres",
          "binBags",
          "maxWeightTonnes",
          "dimensionsMetric",
          "indicativePriceGbp"
        ]
      },
      "Recommendation": {
        "type": "object",
        "description": "A recommended skip size for the job, from the skip size calculator rules.",
        "properties": {
          "input": {
            "type": "object",
            "description": "The inputs the recommendation was made from.",
            "properties": {
              "jobType": {
                "type": "string",
                "description": "Job type.",
                "enum": [
                  "home-garage-clearance",
                  "bathroom-refit",
                  "kitchen-refit",
                  "garden-clearance",
                  "general-renovation",
                  "construction-trade"
                ]
              },
              "wasteType": {
                "type": "string",
                "description": "Waste type.",
                "enum": [
                  "general",
                  "heavy"
                ]
              },
              "scale": {
                "type": "integer",
                "description": "Job scale.",
                "enum": [
                  1,
                  2,
                  3,
                  4,
                  5
                ]
              }
            },
            "required": [
              "jobType",
              "wasteType",
              "scale"
            ]
          },
          "recommended": {
            "$ref": "#/components/schemas/SkipSizeSummary"
          },
          "reason": {
            "type": "string",
            "description": "Plain-English reason for the recommendation."
          },
          "weightNote": {
            "type": "string",
            "description": "Weight guidance for the recommended size."
          },
          "sizeDown": {
            "description": "One size smaller, or null.",
            "anyOf": [
              {
                "$ref": "#/components/schemas/SkipSizeSlug"
              },
              {
                "type": "null"
              }
            ]
          },
          "sizeUp": {
            "description": "One size larger, or null.",
            "anyOf": [
              {
                "$ref": "#/components/schemas/SkipSizeSlug"
              },
              {
                "type": "null"
              }
            ]
          },
          "notes": {
            "type": "array",
            "description": "Advisory notes for this job.",
            "items": {
              "type": "string"
            }
          },
          "permit": {
            "type": "string",
            "description": "Permit guidance, present when placement was given."
          },
          "priceNote": {
            "type": "string",
            "description": "How to read the indicative price."
          },
          "calculatorUrl": {
            "type": "string",
            "description": "The skip size calculator on the site.",
            "format": "uri"
          }
        },
        "required": [
          "input",
          "recommended",
          "reason",
          "weightNote",
          "sizeDown",
          "sizeUp",
          "notes",
          "priceNote",
          "calculatorUrl"
        ]
      },
      "CoverageCovered": {
        "type": "object",
        "description": "The town has a covered town page.",
        "properties": {
          "query": {
            "type": "string",
            "description": "The query as received, trimmed."
          },
          "covered": {
            "type": "boolean",
            "const": true,
            "description": "Always true for this shape."
          },
          "matchedAlias": {
            "type": "string",
            "description": "Present when the query was a suburb served by a parent town page."
          },
          "town": {
            "type": "string",
            "description": "Town name."
          },
          "townSlug": {
            "type": "string",
            "description": "Town slug, usable as the town parameter on other endpoints."
          },
          "townPageUrl": {
            "type": "string",
            "description": "The town page on the site.",
            "format": "uri"
          },
          "county": {
            "type": [
              "string",
              "null"
            ],
            "description": "County of the town."
          },
          "countyHubUrl": {
            "type": "string",
            "description": "The county hub page, present when the county is known.",
            "format": "uri"
          },
          "region": {
            "type": [
              "string",
              "null"
            ],
            "description": "Region of the town."
          },
          "bookingPhone": {
            "type": "string",
            "description": "Phone number for the town, present when one is assigned."
          },
          "booking": {
            "type": "string",
            "description": "How booking works: by phone to a vetted local operator."
          }
        },
        "required": [
          "query",
          "covered",
          "town",
          "townSlug",
          "townPageUrl",
          "county",
          "region",
          "booking"
        ]
      },
      "CoverageNotCovered": {
        "type": "object",
        "description": "No covered town page matches the query.",
        "properties": {
          "query": {
            "type": "string",
            "description": "The query as received, trimmed."
          },
          "covered": {
            "type": "boolean",
            "const": false,
            "description": "Always false for this shape."
          },
          "message": {
            "type": "string",
            "description": "What to try next."
          },
          "areasUrl": {
            "type": "string",
            "description": "The list of covered areas on the site.",
            "format": "uri"
          }
        },
        "required": [
          "query",
          "covered",
          "message",
          "areasUrl"
        ]
      },
      "PricesResponse": {
        "type": "object",
        "description": "Success envelope for GET /api/v1/prices.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Prices"
          },
          "meta": {
            "$ref": "#/components/schemas/Meta"
          }
        },
        "required": [
          "data",
          "meta"
        ]
      },
      "PermitsResponse": {
        "type": "object",
        "description": "Success envelope for GET /api/v1/permits: permit rules, or candidates when the council name is ambiguous.",
        "properties": {
          "data": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/Permit"
              },
              {
                "$ref": "#/components/schemas/CouncilCandidates"
              }
            ]
          },
          "meta": {
            "$ref": "#/components/schemas/Meta"
          }
        },
        "required": [
          "data",
          "meta"
        ]
      },
      "RecommendationResponse": {
        "type": "object",
        "description": "Success envelope for GET /api/v1/skip-size-recommendation.",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/Recommendation"
          },
          "meta": {
            "$ref": "#/components/schemas/Meta"
          }
        },
        "required": [
          "data",
          "meta"
        ]
      },
      "CoverageResponse": {
        "type": "object",
        "description": "Success envelope for GET /api/v1/coverage.",
        "properties": {
          "data": {
            "oneOf": [
              {
                "$ref": "#/components/schemas/CoverageCovered"
              },
              {
                "$ref": "#/components/schemas/CoverageNotCovered"
              }
            ]
          },
          "meta": {
            "$ref": "#/components/schemas/Meta"
          }
        },
        "required": [
          "data",
          "meta"
        ]
      }
    },
    "responses": {
      "BadRequest": {
        "description": "The query parameters are missing or invalid. The message names the parameter and, for enums, lists the allowed values.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "NotFound": {
        "description": "No record matches the town, postcode area or council given.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      },
      "RateLimited": {
        "description": "Too many requests from this IP address.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        },
        "headers": {
          "Retry-After": {
            "$ref": "#/components/headers/RetryAfter"
          }
        }
      },
      "InternalError": {
        "description": "The lookup failed unexpectedly. Retry after a short pause.",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Error"
            }
          }
        }
      }
    },
    "headers": {
      "RetryAfter": {
        "description": "Seconds to wait before retrying, currently 300.",
        "schema": {
          "type": "integer"
        }
      }
    }
  }
}