Looks like USPS API data is free and usable only for package shipping. Not that I bet they would notice. At any rate, this seems to be a great start with a great API recommendation: http://stackoverflow.com/questions/7129313/zip-code-lookup-a...
I found a town called Bakersfield that has more than one zip fro the town, it does JSON back with more data than I thought would be part of free plan.
For some reason I could not get "san_francisco","san-francisco", "sanfrancisco", or "sf" to work.