{
  "title": "Channel location parsing",
  "content": "OpenClaw normalizes shared locations from chat channels into:\n\n* human-readable text appended to the inbound body, and\n* structured fields in the auto-reply context payload.\n\n* **Telegram** (location pins + venues + live locations)\n* **WhatsApp** (locationMessage + liveLocationMessage)\n* **Matrix** (`m.location` with `geo_uri`)\n\nLocations are rendered as friendly lines without brackets:\n\n* Pin:\n  * `📍 48.858844, 2.294351 ±12m`\n* Named place:\n  * `📍 Eiffel Tower — Champ de Mars, Paris (48.858844, 2.294351 ±12m)`\n* Live share:\n  * `🛰 Live location: 48.858844, 2.294351 ±12m`\n\nIf the channel includes a caption/comment, it is appended on the next line:\n\nWhen a location is present, these fields are added to `ctx`:\n\n* `LocationLat` (number)\n* `LocationLon` (number)\n* `LocationAccuracy` (number, meters; optional)\n* `LocationName` (string; optional)\n* `LocationAddress` (string; optional)\n* `LocationSource` (`pin | place | live`)\n* `LocationIsLive` (boolean)\n\n* **Telegram**: venues map to `LocationName/LocationAddress`; live locations use `live_period`.\n* **WhatsApp**: `locationMessage.comment` and `liveLocationMessage.caption` are appended as the caption line.\n* **Matrix**: `geo_uri` is parsed as a pin location; altitude is ignored and `LocationIsLive` is always false.",
  "code_samples": [
    {
      "code": "📍 48.858844, 2.294351 ±12m\nMeet here",
      "language": "unknown"
    }
  ],
  "headings": [
    {
      "level": "h2",
      "text": "Text formatting",
      "id": "text-formatting"
    },
    {
      "level": "h2",
      "text": "Context fields",
      "id": "context-fields"
    },
    {
      "level": "h2",
      "text": "Channel notes",
      "id": "channel-notes"
    }
  ],
  "url": "llms-txt#channel-location-parsing",
  "links": []
}