{
  "name": "La Maison du Mile-End public API",
  "description": "Live availability and all-in pricing for a seven-room bed and breakfast in Mile End, Montreal. No authentication required.",
  "version": "v1",
  "base_url": "https://www.maisonmileend.ca/api/v1",
  "documentation_url": "https://www.maisonmileend.ca/agents.md",
  "openapi_url": "https://www.maisonmileend.ca/openapi.json",
  "api_catalog_url": "https://www.maisonmileend.ca/.well-known/api-catalog",
  "mcp": {
    "url": "https://www.maisonmileend.ca/api/mcp",
    "transport": "streamable-http",
    "authentication": "none",
    "tools": [
      "check_availability",
      "get_property_info",
      "list_rooms"
    ],
    "restEquivalent": "https://www.maisonmileend.ca/api/v1/booking/availability",
    "versioning": "https://www.maisonmileend.ca/deprecation-policy.md"
  },
  "authentication": {
    "required": false,
    "note": "Every endpoint listed here is public. Everything else under /api needs a guest session, a staff session, a kiosk device token or a cron secret, and is not part of this contract."
  },
  "endpoints": [
    {
      "id": "availability",
      "method": "GET",
      "url": "https://www.maisonmileend.ca/api/v1/booking/availability",
      "unversioned_alias": "https://www.maisonmileend.ca/api/booking/availability",
      "parameters": [
        {
          "name": "arrival",
          "required": true,
          "example": "2026-09-12"
        },
        {
          "name": "departure",
          "required": true,
          "example": "2026-09-15"
        },
        {
          "name": "adults",
          "required": false,
          "example": "2"
        },
        {
          "name": "children",
          "required": false,
          "example": "0"
        }
      ],
      "example": "https://www.maisonmileend.ca/api/v1/booking/availability?arrival=2026-09-12&departure=2026-09-15&adults=2&children=0"
    }
  ],
  "rate_limit": {
    "requests": 40,
    "window_seconds": 60,
    "headers": [
      "RateLimit-Limit",
      "RateLimit-Remaining",
      "RateLimit-Reset",
      "RateLimit-Policy"
    ],
    "on_exceeded": {
      "status": 429,
      "header": "Retry-After"
    }
  },
  "versioning": {
    "scheme": "url-path",
    "policyPath": "/deprecation-policy.md",
    "current": "v1",
    "additive": [
      "new endpoints",
      "new optional request parameters",
      "new fields on an existing response object",
      "new error codes on an existing status"
    ],
    "breaking": [
      "removing or renaming a response field",
      "changing the type or meaning of a response field",
      "making an optional request parameter required",
      "removing an endpoint",
      "changing an HTTP status for an existing outcome"
    ],
    "sunsetNoticeDays": 180,
    "deprecationHeaders": [
      {
        "name": "Deprecation",
        "spec": "RFC 9745",
        "meaning": "the date this version became deprecated"
      },
      {
        "name": "Sunset",
        "spec": "RFC 8594",
        "meaning": "the date it stops answering"
      },
      {
        "name": "Link",
        "spec": "RFC 8288",
        "meaning": "rel=\"successor-version\" pointing at the replacement"
      }
    ],
    "policy_url": "https://www.maisonmileend.ca/deprecation-policy.md",
    "deprecated_versions": []
  },
  "errors": [
    {
      "code": "invalid_request",
      "status": 400,
      "message": "The request failed validation.",
      "hint": "Check `details` for the failing fields. Dates are YYYY-MM-DD and departure must be after arrival."
    },
    {
      "code": "not_found",
      "status": 404,
      "message": "No such endpoint on this API.",
      "hint": "The endpoints that exist are listed at https://www.maisonmileend.ca/api and described at https://www.maisonmileend.ca/openapi.json."
    },
    {
      "code": "method_not_allowed",
      "status": 405,
      "message": "That HTTP method is not supported on this endpoint.",
      "hint": "See https://www.maisonmileend.ca/openapi.json for the methods each endpoint accepts."
    },
    {
      "code": "rate_limited",
      "status": 429,
      "message": "Too many requests from this client.",
      "hint": "Wait for the number of seconds in `Retry-After`, then retry. `RateLimit-Reset` says when the window rolls over."
    },
    {
      "code": "upstream_error",
      "status": 502,
      "message": "A service this endpoint depends on did not answer.",
      "hint": "Retry after a short backoff. If it persists, contact the property directly."
    }
  ],
  "contact": {
    "telephone": "+1-514-700-3932",
    "email": "info@maisonmileend.ca"
  }
}
