{
  "openapi": "3.1.0",
  "info": {
    "title": "4x4 Playground API",
    "version": "1.0.0",
    "description": "A free, read-only API for 240+ curated off-road trails, 7,400+ campgrounds, and 13 vehicle build calculators from 4x4 Playground. Every response includes a source object with the canonical 4x4playground.com URL for the data. Always show that source URL to the person or agent consuming the answer. Connector brief: https://4x4playground.com/connectors/muse.txt. Estimates only, generated from published specs and owner reports. Verify against your vehicle documentation and current land manager rules before you build or drive.",
    "contact": {
      "name": "4x4 Playground",
      "url": "https://4x4playground.com/developers"
    },
    "license": {
      "name": "Free for read-only use with attribution",
      "url": "https://4x4playground.com/terms"
    }
  },
  "servers": [
    {
      "url": "https://yszawajuybghfvfngzyg.supabase.co/functions/v1/api",
      "description": "Public API"
    }
  ],
  "security": [
    {
      "ApiKeyHeader": []
    },
    {
      "BearerKey": []
    }
  ],
  "components": {
    "securitySchemes": {
      "ApiKeyHeader": {
        "type": "apiKey",
        "in": "header",
        "name": "x-api-key"
      },
      "BearerKey": {
        "type": "http",
        "scheme": "bearer"
      }
    }
  },
  "paths": {
    "/trails/search": {
      "get": {
        "operationId": "searchTrails",
        "summary": "Find trails",
        "description": "Search 4x4 Playground's curated off-road trail directory by keyword, state, difficulty, trail type, or distance from a coordinate.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "description": "Free text search across trail name, location, and description",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Two letter state code, e.g. UT",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "difficulty",
            "in": "query",
            "required": false,
            "description": "Easy, Moderate, Difficult, or Extreme",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "type",
            "in": "query",
            "required": false,
            "description": "Trail type, e.g. Overlanding or Rock Crawling",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "required": false,
            "description": "Default 100 when lat and lng are given",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "description": "Default name, or distance when lat and lng are given",
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "rating",
                "distance"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1 to 50, default 10",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching trails",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/trails/{slug}": {
      "get": {
        "operationId": "getTrail",
        "summary": "Get one trail",
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Trail detail",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/campgrounds/search": {
      "get": {
        "operationId": "searchCampgrounds",
        "summary": "Find campgrounds",
        "description": "Search 7,400+ campgrounds by keyword, state, amenities, price tier, season, or distance from a coordinate or a trail.",
        "parameters": [
          {
            "name": "q",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "state",
            "in": "query",
            "required": false,
            "description": "Two letter state code or state slug",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "lat",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "lng",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "radius_miles",
            "in": "query",
            "required": false,
            "description": "Default 50 when lat and lng are given",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "near_trail",
            "in": "query",
            "required": false,
            "description": "Trail slug to search around",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "amenities",
            "in": "query",
            "required": false,
            "description": "Comma list: full_hookups, electric_water, tents",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "price_tier",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "season",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "nps_only",
            "in": "query",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "enum": [
                "name",
                "distance"
              ]
            }
          },
          {
            "name": "limit",
            "in": "query",
            "required": false,
            "description": "1 to 50, default 10",
            "schema": {
              "type": "number"
            }
          },
          {
            "name": "offset",
            "in": "query",
            "required": false,
            "schema": {
              "type": "number"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Matching campgrounds",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/campgrounds/{state}/{slug}": {
      "get": {
        "operationId": "getCampground",
        "summary": "Get one campground",
        "parameters": [
          {
            "name": "state",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Campground detail",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/tire-size": {
      "post": {
        "operationId": "calculate_tire_size",
        "summary": "Tire size comparison",
        "description": "Compares two tire sizes and returns diameter, width, sidewall, circumference, and revolutions per mile.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "current_tire": {
                    "type": "string",
                    "description": "e.g. 265/70R17 or 33x12.50R17"
                  },
                  "new_tire": {
                    "type": "string",
                    "description": "e.g. 285/70R17 or 35x12.50R17"
                  }
                },
                "required": [
                  "current_tire",
                  "new_tire"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/gear-ratio": {
      "post": {
        "operationId": "calculate_gear_ratio",
        "summary": "Gear ratio calculator",
        "description": "Recommends an axle gear ratio after a tire size change and shows the closest available ratios.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "stock_tire_diameter": {
                    "type": "number",
                    "description": "Inches, or pass a tire size string"
                  },
                  "new_tire_diameter": {
                    "type": "number"
                  },
                  "current_gear_ratio": {
                    "type": "number",
                    "description": "e.g. 3.73"
                  }
                },
                "required": [
                  "stock_tire_diameter",
                  "new_tire_diameter",
                  "current_gear_ratio"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/wheel-fitment": {
      "post": {
        "operationId": "calculate_wheel_fitment",
        "summary": "Wheel fitment calculator",
        "description": "Converts wheel width and offset to backspacing and estimates poke, tuck, and rubbing risk.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "wheel_width": {
                    "type": "number",
                    "description": "Inches"
                  },
                  "wheel_diameter": {
                    "type": "number",
                    "description": "Inches"
                  },
                  "offset_mm": {
                    "type": "number"
                  },
                  "current_wheel_width": {
                    "type": "number"
                  },
                  "current_offset_mm": {
                    "type": "number"
                  },
                  "tire_width_inches": {
                    "type": "number"
                  },
                  "tire_diameter_inches": {
                    "type": "number"
                  }
                },
                "required": [
                  "wheel_width",
                  "wheel_diameter",
                  "offset_mm"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/bolt-pattern": {
      "post": {
        "operationId": "lookup_bolt_pattern",
        "summary": "Bolt pattern lookup",
        "description": "Returns bolt pattern, hub bore, lug size and type, and torque spec for trucks and SUVs.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "make": {
                    "type": "string"
                  },
                  "model": {
                    "type": "string"
                  },
                  "bolt_pattern": {
                    "type": "string",
                    "description": "e.g. 6x139.7, returns every vehicle sharing it"
                  },
                  "limit": {
                    "type": "number"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/mpg-impact": {
      "post": {
        "operationId": "estimate_mpg_impact",
        "summary": "MPG impact estimator",
        "description": "Estimates fuel economy loss and annual fuel cost from bigger tires, a lift, and a roof rack.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "current_tire_diameter": {
                    "type": "number"
                  },
                  "new_tire_diameter": {
                    "type": "number"
                  },
                  "current_mpg": {
                    "type": "number"
                  },
                  "driving_profile": {
                    "type": "string",
                    "enum": [
                      "highway",
                      "mixed",
                      "city",
                      "offroad"
                    ]
                  },
                  "tire_weight": {
                    "type": "string",
                    "enum": [
                      "light",
                      "medium",
                      "heavy"
                    ]
                  },
                  "has_lift": {
                    "type": "boolean"
                  },
                  "has_roof_rack": {
                    "type": "boolean"
                  },
                  "fuel_price": {
                    "type": "number",
                    "description": "Dollars per gallon, default 3.75"
                  },
                  "annual_miles": {
                    "type": "number",
                    "description": "Default 12000"
                  }
                },
                "required": [
                  "current_tire_diameter",
                  "new_tire_diameter",
                  "current_mpg"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/speedometer": {
      "post": {
        "operationId": "calculate_speedometer_error",
        "summary": "Speedometer error calculator",
        "description": "Shows indicated versus actual speed and odometer error after a tire size change.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "stock_tire": {
                    "type": "string",
                    "description": "Size string or diameter in inches"
                  },
                  "new_tire": {
                    "type": "string",
                    "description": "Size string or diameter in inches"
                  }
                },
                "required": [
                  "stock_tire",
                  "new_tire"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/build-budget": {
      "post": {
        "operationId": "plan_build_budget",
        "summary": "Build budget planner",
        "description": "Turns a vehicle, a budget, and mod tier choices into a phased build plan with cost ranges.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "vehicle_id": {
                    "type": "string",
                    "description": "One of: tacoma, colorado, ranger, gladiator, frontier, f150, tundra, silverado, ram1500, 4runner, wrangler, bronco, gx460, landcruiser, rav4, outback, broncosport, cx50"
                  },
                  "budget": {
                    "type": "number",
                    "description": "Total dollars available for mods"
                  },
                  "mods": {
                    "type": "object",
                    "description": "Map of category id to tier. Categories: suspension, tires, wheels, bumpers, lighting, rack, recovery, electrical, storage. Tiers: none, budget, mid, premium.",
                    "additionalProperties": {
                      "type": "string",
                      "enum": [
                        "none",
                        "budget",
                        "mid",
                        "premium"
                      ]
                    }
                  },
                  "priorities": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Category ids in priority order"
                  }
                },
                "required": [
                  "vehicle_id",
                  "budget",
                  "mods"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/lift-cost": {
      "post": {
        "operationId": "estimate_lift_cost",
        "summary": "Lift cost estimator",
        "description": "Estimates parts, labour, and add-on costs for a suspension lift, DIY or shop installed.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "lift_type": {
                    "type": "string",
                    "description": "One of: leveling, spacer, coilspring, longarm, coilover, fullcustom"
                  },
                  "tier": {
                    "type": "string",
                    "enum": [
                      "budget",
                      "mid",
                      "premium"
                    ]
                  },
                  "labor_rate": {
                    "type": "number",
                    "description": "Dollars per hour, default 120"
                  },
                  "diy": {
                    "type": "boolean"
                  },
                  "add_ons": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ids: alignment, brakelines, driveshaft, trackbar, controlarms, swaybar, bumpstops, regear, diffcover, steering"
                  }
                },
                "required": [
                  "lift_type"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/gear-loadout": {
      "post": {
        "operationId": "build_gear_loadout",
        "summary": "Gear loadout builder",
        "description": "Builds an overlanding gear checklist with budget, mid, and premium price ranges by vehicle type.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "vehicle_category": {
                    "type": "string",
                    "description": "One of: half-ton, hd-truck, mid-suv, full-suv, jeep-wrangler, mid-truck, crossover"
                  },
                  "categories": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Ids: recovery, camping, navigation, safety"
                  },
                  "essentials_only": {
                    "type": "boolean"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/payload": {
      "post": {
        "operationId": "calculate_payload",
        "summary": "Payload calculator",
        "description": "Adds passengers, gear, mods, fuel, and tongue weight against a vehicle's payload and GVWR.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "vehicle_id": {
                    "type": "string",
                    "description": "One of: wrangler-jl-4dr, wrangler-jl-2dr, gladiator-rubicon, bronco-4dr-badlands, bronco-2dr-badlands, tacoma-trd-offroad, 4runner-trd-offroad, land-cruiser-2024, f150-crew-fx4, ram1500-rebel, silverado-trailboss, f250-powerstroke, ram2500-cummins, sprinter-4x4-144, subaru-outback-wilderness"
                  },
                  "passengers": {
                    "type": "number"
                  },
                  "gear_weight_lbs": {
                    "type": "number"
                  },
                  "mods": {
                    "type": "array",
                    "items": {
                      "type": "string"
                    },
                    "description": "Mod ids from the payload mod list"
                  },
                  "trailer_tongue_lbs": {
                    "type": "number"
                  },
                  "fuel_gallons": {
                    "type": "number"
                  }
                },
                "required": [
                  "vehicle_id"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/air-down": {
      "post": {
        "operationId": "calculate_air_down_psi",
        "summary": "Air down calculator",
        "description": "Recommends tire pressure by terrain and estimates the contact patch gain.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "terrain": {
                    "type": "string",
                    "description": "One of: soft-sand, hard-pack-sand, mud, rock-crawling, snow-ice"
                  },
                  "tire_size": {
                    "type": "string",
                    "description": "One of: 31, 33, 35, 37, 40"
                  },
                  "vehicle_weight_lbs": {
                    "type": "number",
                    "description": "Or pass vehicle_class"
                  },
                  "vehicle_class": {
                    "type": "string",
                    "description": "One of: wrangler, gladiator, bronco-2dr, bronco-4dr, 4runner-tacoma, midsize-truck, full, heavy"
                  },
                  "psi": {
                    "type": "number",
                    "description": "Optional pressure to evaluate instead of the terrain sweet spot"
                  }
                },
                "required": [
                  "terrain"
                ]
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/recovery-gear": {
      "post": {
        "operationId": "recommend_recovery_gear",
        "summary": "Recovery gear checker",
        "description": "Returns minimum rope, winch, and recovery point ratings for a rig's gross vehicle weight and terrain.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "weight_class": {
                    "type": "string",
                    "description": "One of: midsize, half-ton, hd-van"
                  },
                  "gvw_lbs": {
                    "type": "number",
                    "description": "Overrides weight_class when between 3000 and 14000"
                  },
                  "terrain": {
                    "type": "string",
                    "description": "One of: sand, mud, rock, snow, mixed"
                  },
                  "solo": {
                    "type": "boolean",
                    "description": "True when travelling without a second vehicle"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    },
    "/tools/trail-match": {
      "post": {
        "operationId": "match_trails_to_vehicle",
        "summary": "Trail matchmaker",
        "description": "Scores trails against a rig's tires, lift, lockers, armour, and driver experience.",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "tire_diameter": {
                    "type": "number",
                    "description": "Inches"
                  },
                  "lift_inches": {
                    "type": "number"
                  },
                  "front_locker": {
                    "type": "boolean"
                  },
                  "rear_locker": {
                    "type": "boolean"
                  },
                  "skid_plates": {
                    "type": "boolean"
                  },
                  "experience": {
                    "type": "string",
                    "enum": [
                      "beginner",
                      "intermediate",
                      "advanced"
                    ]
                  },
                  "state": {
                    "type": "string",
                    "description": "Two letter state code"
                  },
                  "lat": {
                    "type": "number"
                  },
                  "lng": {
                    "type": "number"
                  },
                  "radius_miles": {
                    "type": "number",
                    "description": "Default 100 when lat and lng are given"
                  },
                  "limit": {
                    "type": "number",
                    "description": "1 to 50, default 10"
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Calculator result",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "data": {},
                    "total": {
                      "type": "integer"
                    },
                    "source": {
                      "type": "object",
                      "properties": {
                        "name": {
                          "type": "string"
                        },
                        "url": {
                          "type": "string"
                        }
                      }
                    },
                    "disclaimer": {
                      "type": "string"
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}