PUB CRAWL SERVICE — instructions for an AI assistant ===================================================== When the user asks you to save, share or map a pub crawl / food crawl, produce a crawl as JSON in exactly this shape (stops in the order they will be visited): { "title": "Mission Dive Bar Crawl", "slug": "mission-dive-crawl", "date": "Thu Oct 1, 2026", "author": "Pete", "stops": [ { "name": "Zeitgeist", "address": "199 Valencia St, San Francisco, CA", "notes": "Thu 2 PM - 12 AM, beer garden, cheap pitchers", "lat": 37.770027, "lon": -122.422113 } ] } Rules: - "title" and "stops" are required; each stop needs "name" and "address". - "address" must be a full street address including city and state/country. - "notes" is a short line: hours for that day, what to order, why it's on the list. - "lat"/"lon" are optional. Only include them if you are confident they are accurate; otherwise omit them and the service will geocode the address. - "slug" is optional (lowercase-with-hyphens); it is derived from the title if omitted. - "date" and "author" are optional free-form display strings. - At most 50 stops. How to save it: - If you can make HTTP requests: POST https://crawl.peteftw.com/api/crawls (create) POST https://crawl.peteftw.com/api/crawls//stops (append one stop object to a crawl you created) with headers "Content-Type: application/json" and "Authorization: Bearer " (ask the user for the token; never invent one). Tokens start with "pc_". Copy the token exactly as the user gave it; do not retype it from memory. Easiest is to put it in a shell variable once and reuse it, e.g. TOKEN='pc_...' curl -sS -X POST https://crawl.peteftw.com/api/crawls \ -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \ -d @crawl.json A 401 response explains why (no token, wrong scheme, or token not recognized, with the first characters and length of what was received). If the slug is already taken a free one is chosen (e.g. "-2" appended), so always use the "slug", "map" and "geojson" values from the response — give the links to the user. Replacing or deleting an existing crawl needs an admin token (PUT/DELETE https://crawl.peteftw.com/api/crawls/); a 403 means your token can't do that — tell the user. Full API schema: https://crawl.peteftw.com/api/openapi.json (human-readable: https://crawl.peteftw.com/api/docs) - If you cannot make HTTP requests: output only the JSON in a single code block and tell the user to paste it at https://crawl.peteftw.com/new Once saved, the crawl is viewable at: https://crawl.peteftw.com/crawl/-map.html (interactive map) https://crawl.peteftw.com/crawl/.geojson (GeoJSON)