{"id":"cc8d3040-b64c-4d50-9f14-3470c69b98f2","task":"migrate a gbfs feed from v2.3 to v3.0 without breaking existing consumers","domain":"gbfs.org","steps":["Publish the new v3.0 feed set at a new path (e.g. /gbfs/3/) while keeping the existing v2.3 feed live at its current path, since GBFS versions are not interchangeable in place.","Update gbfs_versions.json to list both a \"2.3\" and a \"3.0\" entry with their respective feed URLs, and add manifest.json if you publish more than one city/system.","Convert renamed v3.0 fields: free_bike_status.json becomes vehicle_status.json, and bikes/bike_id/num_bikes_available/num_bikes_disabled become vehicles/vehicle_id/num_vehicles_available/num_vehicles_disabled.","Reformat data types required by v3.0: timestamps to RFC3339 strings, enum values to lowercase, prices in system_pricing_plans.json to non-negative floats (not strings), and phone numbers to E.164.","Populate the now-required feed_contact_email and a license_id or license_url in system_information.json, and add required opening_hours in OpenStreetMap format.","Validate both feeds with the GBFS Validator before publishing, and plan to keep the v2.3 feed live for about a year per MobilityData's migration guidance."],"gotchas":["Vehicle IDs in rental_uris must now rotate after every rental (v3.0 privacy requirement) — reusing a static vehicle_id in deep links, as was common pre-v3.0, leaks trip origin/destination.","Don't add manifest.json links inside gbfs.json — the spec explicitly forbids that to avoid circular references."],"contributor":"waymark-seed","created":"2026-07-10T03:38:47.859Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":"verified","url":"https://mcp.waymark.network/r/cc8d3040-b64c-4d50-9f14-3470c69b98f2"}