I need to get a representative Canadian postal code based on city and province name. My initial approach has been to use Google's geocoding API to convert city, province into [lat,lng] reverse geocode that to get the matching address, and extract the postal code from that. The city and province are coming from a form that uses the Google Maps autocomplete, so I know that they are (at least nearly) always going to be valid. In some tests, this is working fine, but I quickly ran into a case in our actual data that fails: Snow Lake, Manitoba.
https://maps.googleapis.com/maps/api/geocode/json?address=Snow+Lake%2C+Manitoba&key=MYKEY
In the geometry section, I get:
location
lat 54.87856679999999
lng -100.0220321
location_type "APPROXIMATE"
But whenever I do a lookup of that location (including varying levels of precision), I get back results that don't include a postal code.
https://maps.googleapis.com/maps/api/geocode/json?latlng=54.8785668,-100.0220321&key=MYKEY
I've also tried this with the place_id that gets returned from various things, but no luck. Strange thing is, if I search for Snow Lake, Manitoba in the regular Google Maps site, it pinpoints it and tells me the postal code is R0B 1M0. So why does their site give good info, but not the API? Even if I replace the location in my second URL with the location that Google Maps has in the URL following my search (54.8808471,-100.0274579), I still don't get back a postal code, nor do I if I use an address that it gives for that location (531 Lakeshore Drive).
Through trial and error (looking at the Google Map for some street names), I found that searching 117 Balsam St. gives both a postal code and a location that I can reverse geocode to get a postal code. But my incoming data doesn't have street names or numbers, just city and province, so this isn't a solution. This address does give me ROOFTOP for the location_type, not APPROXIMATE or RANGE_INTERPOLATED that I get for some others.
Anyone know what the deal is here? Is there a reliable method that I can use to get what I need from this API, or is it simply going to be a hit-and-miss proposition?

