- Release notes are available on GitHub.
-
2026-03-18: Ensure that
RequestBuildertypes are public. -
2026-04-25: Improved error messages.
- 2026-03-16: Corrected dependencies for legacy Places API.
- 2026-03-14: Added
Othervariant forPlaceTypeenum. New and undocumented place types won't cause errors.
-
2026-03-14: Switch from rust_decimal feature
serde-floattoserde-with-float.Thank you to Francis Nimick for the pull request!
-
2026-03-14: Renamed several helper functions from
icontoemoji. -
2026-03-14: Correct issue with building the Google Maps Places Legacy API.
-
2026-03-14: Dependency updates.
-
2026-02-14: Correction for Brazil Portuguese language code.
Thank you to Luiz Fernando O. C. Real for the pull request!
-
2026-02-14: Minor clean-up in rate limiting section.
-
2026-02-14: Applied
clippysuggestions. -
2026-02-14: Updates dependencies.
-
2025-11-29: Corrected some feature-gates for
address-validationandphf.
-
2025-11-25: Some types weren't properly exposed.
-
2025-11-25: Additional type conversion traits implemented for convenience.
-
2025-11-23: Added support for Google Maps Places (New) API which is turned on by default. The legacy API is still available through
Cargo.tomlfeatures. -
2025-11-23: Dependency bump.
-
2025-05-16: Removed
skip_serializing_ifserde attributes. Some binary formats such asrmp-serdedon't handle these attributes. -
2025-05-27: Correction to
google_maps::time_zone::response::mod.rs-Pacific/Aucklandhas a timezone offset of 43200, which is larger than ani16.Thank you to tolfdog for reporting and correcting this issue!
-
2025-04-27: Reverted back to
serde_jsonfromsimd-json.Seemingly, there were issues with some Google Maps API JSON responses. Some responses failed validation according to jsonlint.com. The issue appears to be related to polyline strings.
simd-jsonwas not able to parse this JSON.serde_jsonseems to be more robust in handling this allegedly invalid JSON. -
2025-04-27: Ensured that all serde
skip_serializing_ifattributes have a matchingdefaultattribute. -
2025-04-27: Dependencies bump.
- 2025-01-10: A debug
println!was accidentally left in theClientget_requestmethod. This has been removed.
-
Important note: This release some has changes that are theoretically breaking changes. These breaking changes mostly would apply to users who are tapping into the more internal functions and actively destructuring internal
structs. However, I don't believe most crate end-users will notice a difference. -
2025-01-10: Implemented Google Maps Address Validation API. Basic example:
use google_maps::prelude::*; let google_maps_client = google_maps::Client::try_new("YOUR_API_KEY_HERE")?; let postal_address = PostalAddress::builder() .region_code(&Country::UnitedStates) .address_lines(vec![ "1600 Amphitheatre Pkwy", "Mountain View, CA, 94043" ]) .build(); let response = google_maps_client .validate_address() .address(postal_address) .build() .execute() .await?; // Dump entire response: println!("{response:#?}");
-
2025-01-04: Implemented a generic
getmethod that covers all of the Google Maps APIs and handles the requests, responses, and errors. -
2025-01-01: Updated several dependencies.
-
2024-12-29: Switched from the currently unmaintained backoff crate to Xuanwo's backon crate for an exponential back-off retry implementation.
Thank you to Dan Groshev for reporting this issue!
backonis not a drop-in replacement forbackoff. During the transition, some much needed internal clean-up was done.
- 2024-12-12: Merged PR to correct validations for directions requests. Thank you ARBaart and congrats on your first single character PR!
- 2024-11-07: Merged a patch for an enum to allow for round-tripping. Thank you for the PR xyres137.
- 2024-11-07: Corrected issue with
Statusenums not round-tripping through de-serialisation and re-serialisation.
- 2024-10-15: Small tweaks to the features. Put back
enable-reqwest.
-
2024-10-05: If your crate directly references the
enable-reqwestfeature in this crate, it has been renamed toreqwestas of version 3.7.0. -
2024-10-05: Many features have been added, some features have been renamed. Please see the Cargo.toml for a complete list of available features. The default features have changed a bit (for example,
reqwest/http2had been accidentally left out but is now enabled). No negative effect is expected. -
2024-10-05: Moved crate from using serde_json for JSON parsing over to simd-json.
- 2024-09-21: Dependencies bump.
- 2024-07-25: Added additional conversion traits from
LatLngtype toLocationandWaypointtypes for improved ergonomics.
-
2024-07-25: Added support for getting
LatLngstructs from tuples, i.e.(43.68, 7.32) -
2024-07-25: Applied
clippysuggestions -
2024-07-25: Dependency bumps
-
2024-07-19: Adjusts
reqwestclient's default timeouts for more reliable operation. -
2024-06-15: This crate now instructs
serdeto not serialize empty fields. This may potentially save a bit of disk space and bandwidth.
-
2024-06-09: Increased flexibility of interface by using more
impl Into<Type>parameters. -
2024-06-09: Clean-up of
tracingmessages, instrumentation and log levels.
-
2024-06-05: New, optional
polylinefeature. This allows for easy conversion ofgoogle_mapstypes (such as theRouteand theStep) to a geo LineString. Both thepolylineandgeofeatures must be enabled for these traits and methods to be available. -
2024-06-05: Improved support for rust's geo eco-system with more type conversion traits.
-
2024-06-04: Fixed some
Vecfields by ensuring that the serdedefaultfield attribute is applied to allVecfields in response structs. Thanks to chunhui2001 for the pull request and to PrinceOfBorgo for issue #27. -
2024-05-20: Added
durationhelper method to thePlaceOpeningHoursPeriodtype which will measure the length of the opening hours period. -
2024-05-19: Improved
GoogleMapsClientinterface ergonomics. Client methods now useimpl Into<Type>and generics extensively. This means that rust will automatically take care of many type conversions needed to build your Google Maps requests. -
2024-05-11: Added an
Othervariant to most enums. The will future-proof the crate for when Google Maps adds additional variants. Previously, serde would return an error when encountering unknown variants.
-
2024-05-03: Improved ergonomics surrounding
LocationandWaypointtypes. New functions:from_address,from_place_id,try_from_f32andtry_from_f64. -
2024-05-03:
reqwest-maybe-middlewarewas forked and integrated intogoogle_mapsfor now, until the crate can be updated. maybe-middleware has also been properly feature-gated and is turned-off by default. -
2024-03-10: Addressed deprecated functions in the new
chronoversion0.4.37. -
2024-03-10: The ol'
cargo clippy --fix -
2024-03-03: Fixes for certain feature gate combinations.
-
2024-02-28: Improved string-passing ergonomics.
-
2024-02-22: ⚠ Breaking change: Replaced all instances of
Option<Vec<_>>with aVec<_>.The
Option<Vec<_>>was originally employed to getserdeto deserialize Google Maps data without any extra options. However, working around anOptionis extra, unnecessary work.#[serde(default)]is now used to return an emptyVecwhen there are no elements, rather than returning aNone.
-
3.4.2: 2024-02-08:
google_maps::GoogleMapsClient::newhas been deprecated in favour ofgoogle_maps::GoogleMapsClient::try_new -
3.4.2: 2024-02-08: Minor breaking change:
google_maps::GoogleMapsClient.with_ratenow uses a reference to the selected API (i.e..with_rate(&google_maps::Api::All)instead of.with_rate(google_maps::Api::All)) -
3.4.2: 2024-02-07:
README.mdmakeover. Thank you seanpianka! -
3.4.2: 2024-02-07: Applied many
clippysuggestions.
-
3.4.1: 2023-12-23: Added
LandmarkandOthervariants to thePlaceTypeenum. -
3.4.1: 2023-12-10: Added default timeouts for the
reqwestclient.
-
3.4.0: 2023-11-15: Add Copy to types where it makes semantic sense and is efficient.
-
3.4.0: 2023-11-15: Switch over to use reqwest-maybe-middleware crate to enable users to pass in a request client with middleware.
-
3.4.0: 2023-11-15: Run
rustfmtThanks for the contributions, ChristianGoldapp!
-
3.3.2: 2023-08-08: Add support for distance_meters in Places Autocomplete response. Thanks for the contribution, victorcrimea!
-
3.3.2: 2023-08-08: Use u64 type to accomodate all possible values for
user_ratings_totalfrom Google Maps API. Thanks for the contribution, victorcrimea!
- 3.3.1: 2023-09-01: Place Details does not always return a result, now an
Option.
-
3.3.0: 2023-07-23: ⚠ Breaking change: Corrections to Google Maps Places API “Text Search” implementation.
-
3.3.0: 2023-07-23: Implemented to Google Maps Places API “Nearby Search” interface.
use google_maps::prelude::*;
use rust_decimal_macros::dec;
let google_maps_client = GoogleMapsClient::new("YOUR_GOOGLE_API_KEY_HERE");
let search_results = google_maps_client.nearby_search(LatLng::try_from_dec(dec!(53.540_989), dec!(-113.493_768))?, 1_000)
.with_type(PlaceType::Restaurant)
.execute()
.await?;
println!("{:#?}", search_results);- 3.3.0: 2023-07-23: Improvements to documentation.
- 3.2.4: 2023-06-17: Emergency update. Important types were moved.
- 3.2.3: 2023-06-17: Fixes for using this crate's optional feature flags.
-
3.2.2: 2023-06-16:
time 0.1dependency was removed usingchronofeature flags. Thanks for the contribution, popen2! -
3.2.2: 2023-06-16: More streamlining of crate's
Errortypes. Not expected to have much impact to end-users. -
3.2.2: 2023-06-16: Fixes for
geofeature.
- 3.2.1: 2023-06-13: By default,
google_mapswill now use therust_decimalcrate'sserdefeature. To switch back to the explicitserde-floatformat, use thegoogle_mapscrate'sdecimal-serde-floatfeature. Thanks for the contribution, popen2!
-
3.2.0: 2023-06-01: ⚠ Breaking change:
google_mapstypes will now round-trip through strings.This crate previously “took advantage” of the
String::fromandToStringtraits being able to have different outputs. However, this clever setup did not play nice with other crates.This is a “breaking change” because the
DisplayandToStringtraits both now have different outputs compared to previous versions of thegoogle_mapscrate:-
Previously:
println!("{}", Language::ChineseHongKong)would result inChinese (Hong Kong). -
Now:
println!("{}", Language::ChineseHongKong)will result inzh-HK. -
Now, to see the
Chinese (Hong Kong)name, use thedisplaymethod. For example:println!("{}", Language::ChineseHongKong.display())
This update applies to all
google_mapscrateenumtypes, includingCountry,PlaceType, and so on. -
-
3.2.0: 2023-05-31: ⚠ Breaking change: All
GoogleMapsClientmethods will now return the same error type. Previously, each API would return a different error type. This could be tedious or annoying when using several different APIs. -
3.2.0: 2023-05-31: Adjusted
tracinglog levels. -
3.2.0: 2023-05-31: Some house-keeping.
- 3.1.1: 2023-01-29: Update to Chinese languages. Thanks rick68!
-
3.1.0: 2022-11-27: ⚠ Breaking change:
Geometry.location_typeis now anOption. -
3.1.0: 2022-11-27: Add basic support for Google Maps Places Text Search and Places Details.
- 3.0.1: 2022-10-01: Added
UNKNOWN_ERRORvariant to Directions API's geocoder status.
-
3.0.0: 2022-09-03: ⚠ Breaking change:
LatLng::try_fromhad to be renamed toLatLng::try_from_decto fix name collision with the TryFrom trait. Addedtry_from_f32andtry_from_f64methods for theLatLngtype. -
3.0.0: 2022-09-04: Initial support for Google Maps Roads API: the Snap To Roads and the Nearest Roads services have been implemented. Unsure about supporting Speed Limits since, according to the documentation, it requires a special Google Maps plan.
-
3.0.0: 2022-09-03: Optional basic support for the geo crate and GeoRust ecosystem. This support may be enabled using the
geofeature flag. When thegeofeature is enabled, some types may loose support forserdeserialization & deserialization. If I've missed something you want or if you think of a better way of doing this, feel free to reach out. -
3.0.0: 2022-09-03: This crate's
WaypointandLocationtypes now have variants that represent the geo crate'sCoordinateandPointtypes.Locationstype now has variants that represent the geo crate'sLineandLineStringtypes. It's now possible to make most Google Maps API requests using geo types, using the provided special helper methods when thegeofeature flag is enabled. -
3.0.0: 2022-08-27: Optional type conversion support for the geo crate. This feature can be enabled with the
geofeature flag. It makes using these crates together a little less burdensome. Includes some unidirectional and some bidirectional TryFrom conversions between this crate'sLatLng,Waypoint,Bounds, and geo'sCoordinate,Point,Rect,Polygontypes. -
3.0.0: 2022-09-04:
ClientSettingsrenamed toGoogleMapsClient. -
3.0.0: 2022-08-27: Adjusted
tracinglog levels.
-
2.1.7: 2022-08-27:
Stringtoenumtable look-ups are now powered by the phf (perfect hash functions) crate. Added manual implementations ofserdedeserializers for Google Maps client types, which take advantage of the newphftables. -
2.1.7: 2022-08-27: Google Maps client types now implement
FromStrwhich gives access toparse. For example:let the_golden_boy: LatLng = "49.8845224,-97.1469436".parse()?; -
2.1.7: 2022-08-22: Added debug logging message to show Google Maps client's request activity.
-
2.1.6: 2022-08-19: Support for geocoding from Google Maps Place IDs. Thank you E-gy!
-
2.1.6: 2022-04-10:
countrywas moved up the hierarchy because it's now being shared amongst several APIs. Madegoogle_maps::countrymodule public.
- 2.1.5: 2022-03-23: Partial support for the
Google MapsPlaces API. Implemented thePlace AutocompleteandQuery Autocompleteservices. Example of basic usage:
let google_maps_client = GoogleMapsClient::new("YOUR_API_KEY_HERE");
let predictions = google_maps_client.place_autocomplete("51".to_string())
.with_location_and_radius(LatLng::try_from_dec(dec!(54), dec!(-114))?, 1_000)
.with_type(AutocompleteType::Address)
.execute()
.await?;
println!("{:#?}", predictions);- 2.1.3: 2021-07-22: Web Assembly (WASM) support: if Google Maps API Client's
default-featuresare set to false, all desired reqwest features (brotli,rustls, etc.) must be manually added to theCargo.tomlfile. Now, theenable-reqwestfeature starts with no reqwest features so that Web Assembly users may rely on reqwest's JS fetch API. Also, changedquery_string()toquery_url(). Examplequery_url()usage:
use google_maps::prelude::*;
let google_maps_client = GoogleMapsClient::new("YOUR_GOOGLE_API_KEY_HERE");
// Get query string from builder pattern:
let query_url = google_maps_client.time_zone(
LatLng::try_from_dec(dec!(50.090_903), dec!(14.400_512))?,
Utc::now()
).query_url();
// Insert your favourite HTTP client here:
let json = reqwest::get(query_url).await?.text().await?;
// Parse JSON string into a TimeZoneResponse structure:
let time_zone: TimeZoneResponse = json.parse()?;
// Dump entire response:
println!("{:#?}", time_zone);- 2.1.2: 2021-07-18: Sorry for all of the updates. Made more dependencies
optional. This adds the ability to slim down this client when needed. Also,
spruced up the
query_string()methods.
- 2.1.1: 2021-07-18: House-keeping. Fixed issue with Google Maps API
features. Added support for using your own HTTP client.
- 2.1.0: 2021-07-17: Transitioned from an in-house retry/backoff implementation
to the
backoffcrate. Google Maps APIs are now optional through the use of feature flags. Improved examples.
- 2.0.2: 2021-07-16: Added support for using rustls-tls in reqwest dependency -
thanks seanpianka! Transitioned from
logcrate to thetracingcrate.
- 2.0.1: 2022-07-15: Now supports a user-configured Reqwest client in the Google
Maps client builder.
GoogleMapsClient::new("YOUR_API_KEY_HERE").with_reqwest_client(your_reqwest_client).build();
- 2.0.0: 2022-07-13: The Rust Google Maps client is now async thanks to seanpianka!
- 1.0.3: 2021-01-06: Updated dependencies. A few minor corrections. Async support is planned for the next month or two.
- 1.0.2: 2020-08-07: Corrected error where string formatted for display were being sent to the Google Maps Platform API. Thanks victorct-pronto!
- 1.0.1: 2020-05-25: Ensuring all public structures use Serde's serialize and deserialize traits. Thanks qrayven!
- 1.0.0: 2020-05-16: Interface stable. (This was a lie!)
- 0.7.3: 2020-04-25: For the Distance-Matrix API, some response fields that should have been public weren't. Fixed. Thanks sroebuck!
- 0.7.2: 2020-04-21: Small bug fixes. Also, some logging was causing stack overflows, so it had to be disabled.
-
0.7.1: 2020-03-10: Added in as many derivable traits as possible. Changed transit fare amount from
f64torust_decimal::Decimal. Clean-ups as commanded by Clippy. -
0.7.1: 2020-03-10: For Time Zone API requests from this crate has moved from expressing the time in
chrono::NaiveDateTimetochrono::DateTime<Utc>. See the updated time zone example.
-
0.7.0: 2020-03-08: Transitioned from
f64torust_decimal::Decimalfor latitude and longitude coordinates. This eliminates rounding errors. TheDecimaltype is also hashable. Nice.LatLng,Waypoint,Locationtypes can now be used as keys for hash maps. To define aDecimalvalue in your code, currently you must add therust_decimal_macrosdependency into yourCargo.tomlfile. Use thedec!()macro like so:dec!(12.345). This is the preferred way to define latitude and longitude coordinates. If you do not want to add this line to yourCargo.tomlfile, you may also create aDecimalfrom a&strlike so:Decimal::from_str("12.345").unwrap(). See the new examples. Also, see the rust_decimal crate for more information. -
0.7.0: 2020-03-08: To better align this crate with Rust conventions, I've converted many
Stringparameters to&strparameters. If you're receiving new compilations errors likethe trait bound google_maps::directions::response:: driving_maneuver::DrivingManeuver: std::convert::From<std::string::String> is not satisfiedyou will have to change your code to borrow the string. For example, changeTransitCurrency::try_from(currency)toTransitCurrency::try_from(¤cy)or toTransitCurrency::try_from(&*currency)if its aStringtype.
- 0.6.0: 2020-02-29: Cleaned up the
modandusedeclarations. To glob import everything from google_maps into your project, you can use theuse google_maps::prelude::*convention now.
-
0.5.2: 2020-02-29: I'm a procedural programmer at heart, so using handles is second nature to me. In an oversight, I was forcing library users to use handles without being consciously aware of it. I have improved the ergonomics of the library. Check out the new examples.
-
0.5.2: 2020-02-29: There were inaccuracies in the rate limiting examples. Sorry if these poor examples caused you any frustration.
- 0.5.0: 2020-02-23: The
timecrate has deprecated thePrimitiveDateTimestruct. This crate has moved from thetimecrate to thechronocrate. Since there is no reasonable way for this crate to always know which time zone is intended in every context, this crate relies on theNaiveDateTimestruct. That means that time and time zone considerations must be tracked and handled by you, the programmer. Check into thechrono-tzcrate which integrates nicely with thechronocrate.
-
0.4.6: 2020-02-19: Emergency update! Case conflict for TransitMode. Had to force to lower case in URL query string builder.
-
0.4.6: 2020-02-19: Connected Travis CI.
-
0.4.6: 2020-02-19: Added support for sub-steps in Directions API.
- 0.4.5: 2020-02-19: Emergency update! Custom deserializer for Durations was not included in the 0.4.4 release.
-
0.4.4: 2020-02-19: Interface should be stablizing.
-
0.4.4: Added some helper functions for destructuring responses.
-
0.4.4: Ensured response structures are all declared as public.
-
0.4.4: 2020-02-18: Aliased
DistanceandDurationstructs toDirectionsDistanceandDirectionsDurationrespectively to prevent name collisions. -
0.4.4: 2020-02-18: Changed
DirectionsDuration.valuetype fromu32totime::Durationtype. -
0.4.4: 2020-02-18: Dropped my custom Serde deserializer in favour of the
timecrate's built-in Serde feature. -
0.4.4: 2020-02-17: Added support for waypoint optimization.
-
0.4.3: 2020-02-09: Happy 15th birthday to Google Maps!
-
0.4.3: 2020-02-09: Ensured request rate limiting was applied to all API requests.
-
0.4.2: 2020-02-06: Unix timestamps received from the Google Maps Platform are now automatically deserialized into
time::PrimitiveDateTimestructs for convenience. -
0.4.2: 2020-02-06: Removed precision limit for Google Maps Platform requests.
-
0.4.1: 2020-02-06: Added time zone and currency enumerations for look-up tables, conversions, and additional handling to be added in the future.
-
0.4.1: 2020-02-06: Fixed some errors in the examples.
-
0.4.1: 2020-02-05: Some internal restructuring to make the library more consistent. Improved many comments, better documentation.
- 0.4.0: ⚠ Breaking change: API keys are no longer passed directly to Google Maps requests. Now, a structure containing your API key, and several optional settings, is passed instead. For example:
Before:
let location = GeocodingReverseRequest::new(
YOUR_GOOGLE_API_KEY_HERE,
// 10 Downing St, Westminster, London
LatLng { lat: 51.5033635, lng: -0.1276248 }
)After. Note to Rust newbies: you may need to change the ? to an .unwrap()
if you're running these examples in your main() function.
let my_settings = ClientSettings::new(YOUR_GOOGLE_API_KEY_HERE);
let location = GeocodingReverseRequest::new(
&mut my_settings,
// 10 Downing St, Westminster, London
LatLng(LatLng::try_from(51.5033635, -0.1276248)?),
)-
0.4.0: ⚠ Breaking change: All response structures, such as
DirectionsResponse, have been altered. -
0.4.0: ⚠ Breaking change: All LatLng enum variants have had the { lat, lng } fields removed in favour of LatLng structs. Use
LatLng::try_from(lat, lng)to define latitude/longitude pairs. See the updated examples. -
0.4.0: ⚠ Breaking change: The Elevation API methods
positional_request()&sampled_path_request()have been renamed tofor_positional_request()&for_sampled_path_request()respectively. See the updated examples. -
0.4.0: ⚠ Breaking change: All
f32fields have been increased tof64fields. -
0.4.0: Implemented automatic retry with exponential backoff. This client library will now attempt to query the Google Cloud Platform several times before giving up and returning an error. Temporary network hiccups will no longer cause your program to fail.
-
0.4.0: Implemented request rate limiting. Each API can have different request rate limits.
-
0.4.0: Now implements the
logcrate with some logging messages for debugging.