{
  "openapi": "3.1.0",
  "info": {
    "title": "DogPolicies data API",
    "version": "1.1.2",
    "summary": "Verified dog rules for California and Nevada travel, as static JSON.",
    "description": "Verified, sourced dog rules for California and Nevada: which parks, beaches, trails and hotels allow dogs, with leash rules, weight limits and pet fees. Every fact links to its official source and the date we checked it. Every record carries a copy-ready citation, its sources with quotes and dates, per-fact confidence and freshness. Facts in notStated are ones the source does not give: say so rather than guessing. The API is static: no key, no rate limit beyond the host's; use ETag / If-None-Match for polling. Fields are only ever added in v1.",
    "termsOfService": "https://dogpolicies.com/terms/",
    "license": {
      "name": "CC BY 4.0",
      "url": "https://creativecommons.org/licenses/by/4.0/"
    },
    "contact": {
      "name": "DogPolicies",
      "url": "https://dogpolicies.com/corrections/"
    },
    "x-attribution": "DogPolicies, https://dogpolicies.com, CC BY 4.0",
    "x-data-version": "2026.10.31"
  },
  "servers": [
    {
      "url": "https://dogpolicies.com/api/v1"
    }
  ],
  "paths": {
    "/index.json": {
      "get": {
        "summary": "API catalog: endpoints and counts",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/places.json": {
      "get": {
        "summary": "Every CC BY place",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "places": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Place"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/places/{id}.json": {
      "get": {
        "summary": "One place by slug",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            },
            "example": "carmel-beach"
          }
        ],
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "place": {
                          "$ref": "#/components/schemas/Place"
                        }
                      }
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "No such place"
          }
        }
      }
    },
    "/osm-hotels.json": {
      "get": {
        "summary": "Chain hotels located through OpenStreetMap (ODbL) with their brand's policy",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "hotels": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Place"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/rules.json": {
      "get": {
        "summary": "Every rule across every place, flat",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "rules": {
                          "type": "array",
                          "items": {
                            "$ref": "#/components/schemas/Rule"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/brands.json": {
      "get": {
        "summary": "Hotel chain pet policies",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "brands": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/regions.json": {
      "get": {
        "summary": "Regions and their counties",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "regions": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/areas.json": {
      "get": {
        "summary": "Areas: the Bay Area sub-areas and cross-boundary destinations, with their cities and place ids",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "areas": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/cities.json": {
      "get": {
        "summary": "Every town the places name, with the city's own dog rules when on file; `page` says whether it has a page",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "cities": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/changes.json": {
      "get": {
        "summary": "The rule-change log",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    },
    "/verifications.json": {
      "get": {
        "summary": "Every verification event, newest first",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "allOf": [
                    {
                      "$ref": "#/components/schemas/Envelope"
                    },
                    {
                      "type": "object",
                      "properties": {
                        "count": {
                          "type": "integer"
                        },
                        "events": {
                          "type": "array",
                          "items": {
                            "type": "object"
                          }
                        }
                      }
                    }
                  ]
                }
              }
            }
          }
        }
      }
    },
    "/openapi.json": {
      "get": {
        "summary": "This description",
        "responses": {
          "200": {
            "description": "OK",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "Envelope": {
        "type": "object",
        "required": [
          "publisher",
          "version",
          "license",
          "attribution_text",
          "attribution_url",
          "as_of"
        ],
        "properties": {
          "publisher": {
            "type": "string"
          },
          "version": {
            "type": "string",
            "description": "Data release, YYYY.MM.DD"
          },
          "schemaVersion": {
            "type": "string"
          },
          "generatedAt": {
            "type": "string",
            "format": "date"
          },
          "as_of": {
            "type": "string",
            "format": "date"
          },
          "license": {
            "type": "object",
            "properties": {
              "name": {
                "type": "string"
              },
              "url": {
                "type": "string"
              }
            }
          },
          "attribution_text": {
            "type": "string"
          },
          "attribution_url": {
            "type": "string"
          },
          "terms_url": {
            "type": "string"
          },
          "disclaimer": {
            "type": "string"
          }
        }
      },
      "Source": {
        "type": "object",
        "required": [
          "url",
          "publisher",
          "title",
          "kind",
          "capturedAt"
        ],
        "properties": {
          "url": {
            "type": "string"
          },
          "publisher": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "kind": {
            "type": "string",
            "enum": [
              "government",
              "official_site",
              "phone",
              "email",
              "owner_submission",
              "open_data"
            ]
          },
          "capturedAt": {
            "type": "string",
            "format": "date"
          },
          "quote": {
            "type": "string",
            "maxLength": 400
          },
          "lastSeenAt": {
            "type": "string",
            "format": "date"
          },
          "contentHash": {
            "type": "string"
          }
        }
      },
      "Rule": {
        "type": "object",
        "required": [
          "id",
          "placeId",
          "kind",
          "text",
          "sourceUrl",
          "confidence",
          "verifiedAt",
          "freshness"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Stable rule id, rul_<place uid>_<kind>"
          },
          "placeId": {
            "type": "string"
          },
          "kind": {
            "type": "string"
          },
          "label": {
            "type": "string"
          },
          "value": {
            "description": "Typed value per kind (fee object, number, enum, text, list)"
          },
          "text": {
            "type": "string",
            "description": "The value as shown on the page"
          },
          "note": {
            "type": [
              "string",
              "null"
            ]
          },
          "source": {
            "type": "string",
            "description": "Key into the record's sources"
          },
          "sourceUrl": {
            "type": "string"
          },
          "sourcePublisher": {
            "type": "string"
          },
          "sourceKind": {
            "type": "string"
          },
          "quote": {
            "type": [
              "string",
              "null"
            ]
          },
          "confidence": {
            "type": "string",
            "enum": [
              "stated",
              "inferred_from_agency",
              "inherited_brand",
              "unstated"
            ]
          },
          "inheritedFrom": {
            "type": [
              "string",
              "null"
            ],
            "description": "Brand id when the rule is the chain's policy"
          },
          "verifiedAt": {
            "type": "string",
            "format": "date"
          },
          "reviewDue": {
            "type": "string",
            "format": "date"
          },
          "freshness": {
            "type": "string",
            "enum": [
              "fresh",
              "due",
              "stale",
              "unreadable"
            ]
          }
        }
      },
      "Place": {
        "type": "object",
        "required": [
          "id",
          "uid",
          "name",
          "type",
          "url",
          "citation",
          "answer",
          "verifiedAt",
          "freshness",
          "license",
          "sources"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "URL slug"
          },
          "uid": {
            "type": "string",
            "description": "Stable id that survives a rename"
          },
          "name": {
            "type": "string"
          },
          "type": {
            "type": "string",
            "enum": [
              "lodging",
              "campground",
              "cabins",
              "beach",
              "park",
              "trail",
              "rest_area",
              "stop",
              "restaurant"
            ]
          },
          "url": {
            "type": "string"
          },
          "canonical_url": {
            "type": "string"
          },
          "markdown_url": {
            "type": "string"
          },
          "json_url": {
            "type": "string"
          },
          "citation": {
            "type": "string",
            "description": "Copy-ready citation: answer, source, date checked, record URL, license"
          },
          "answer": {
            "type": "object",
            "properties": {
              "status": {
                "type": "string",
                "enum": [
                  "yes",
                  "yes_restricted",
                  "no",
                  "varies",
                  "unknown"
                ]
              },
              "headline": {
                "type": "string"
              }
            }
          },
          "status": {
            "type": "string",
            "enum": [
              "published",
              "draft",
              "disputed"
            ]
          },
          "confirmedBy": {
            "type": [
              "string",
              "null"
            ],
            "enum": [
              "business",
              "agency",
              null
            ]
          },
          "state": {
            "type": "string",
            "enum": [
              "CA",
              "NV"
            ]
          },
          "county": {
            "type": [
              "string",
              "null"
            ]
          },
          "city": {
            "type": [
              "string",
              "null"
            ]
          },
          "address": {
            "type": [
              "string",
              "null"
            ]
          },
          "zip": {
            "type": [
              "string",
              "null"
            ]
          },
          "geo": {
            "type": [
              "object",
              "null"
            ],
            "properties": {
              "lat": {
                "type": "number"
              },
              "lon": {
                "type": "number"
              }
            }
          },
          "website": {
            "type": [
              "string",
              "null"
            ]
          },
          "managingAgency": {
            "type": [
              "string",
              "null"
            ]
          },
          "brandId": {
            "type": [
              "string",
              "null"
            ]
          },
          "facts": {
            "type": "object",
            "additionalProperties": true
          },
          "notStated": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "Expected facts the sources do not state; repeat as unstated, never guess"
          },
          "rules": {
            "type": "array",
            "items": {
              "type": "string"
            }
          },
          "ruleRecords": {
            "type": "array",
            "items": {
              "type": "object",
              "required": [
                "id",
                "placeId",
                "kind",
                "text",
                "sourceUrl",
                "confidence",
                "verifiedAt",
                "freshness"
              ],
              "properties": {
                "id": {
                  "type": "string",
                  "description": "Stable rule id, rul_<place uid>_<kind>"
                },
                "placeId": {
                  "type": "string"
                },
                "kind": {
                  "type": "string"
                },
                "label": {
                  "type": "string"
                },
                "value": {
                  "description": "Typed value per kind (fee object, number, enum, text, list)"
                },
                "text": {
                  "type": "string",
                  "description": "The value as shown on the page"
                },
                "note": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "source": {
                  "type": "string",
                  "description": "Key into the record's sources"
                },
                "sourceUrl": {
                  "type": "string"
                },
                "sourcePublisher": {
                  "type": "string"
                },
                "sourceKind": {
                  "type": "string"
                },
                "quote": {
                  "type": [
                    "string",
                    "null"
                  ]
                },
                "confidence": {
                  "type": "string",
                  "enum": [
                    "stated",
                    "inferred_from_agency",
                    "inherited_brand",
                    "unstated"
                  ]
                },
                "inheritedFrom": {
                  "type": [
                    "string",
                    "null"
                  ],
                  "description": "Brand id when the rule is the chain's policy"
                },
                "verifiedAt": {
                  "type": "string",
                  "format": "date"
                },
                "reviewDue": {
                  "type": "string",
                  "format": "date"
                },
                "freshness": {
                  "type": "string",
                  "enum": [
                    "fresh",
                    "due",
                    "stale",
                    "unreadable"
                  ]
                }
              }
            }
          },
          "sources": {
            "type": "object",
            "additionalProperties": {
              "type": "object",
              "required": [
                "url",
                "publisher",
                "title",
                "kind",
                "capturedAt"
              ],
              "properties": {
                "url": {
                  "type": "string"
                },
                "publisher": {
                  "type": "string"
                },
                "title": {
                  "type": "string"
                },
                "kind": {
                  "type": "string",
                  "enum": [
                    "government",
                    "official_site",
                    "phone",
                    "email",
                    "owner_submission",
                    "open_data"
                  ]
                },
                "capturedAt": {
                  "type": "string",
                  "format": "date"
                },
                "quote": {
                  "type": "string",
                  "maxLength": 400
                },
                "lastSeenAt": {
                  "type": "string",
                  "format": "date"
                },
                "contentHash": {
                  "type": "string"
                }
              }
            }
          },
          "verifications": {
            "type": "array",
            "items": {
              "type": "object"
            }
          },
          "verifiedAt": {
            "type": "string",
            "format": "date"
          },
          "reviewDue": {
            "type": "string",
            "format": "date"
          },
          "freshness": {
            "type": "string",
            "enum": [
              "fresh",
              "due",
              "stale",
              "unreadable"
            ]
          },
          "indexable": {
            "type": "boolean"
          },
          "provenance": {
            "type": "string"
          },
          "license": {
            "type": "string",
            "enum": [
              "CC-BY-4.0",
              "ODbL-1.0"
            ]
          }
        }
      }
    }
  },
  "x-mcp": {
    "url": "https://dogpolicies.com/mcp/",
    "transport": "streamable-http",
    "auth": "none"
  },
  "x-markdown-twins": "https://dogpolicies.com/places/{id}.md",
  "x-data-catalog": "https://dogpolicies.com/data/catalog.json"
}