I have tested the API call with my mode set to driving and it works.
I have searched around and some say that the call requires departure_time or arrival_time. I have tried that as well, but to no avail.
Here is the call:
https://maps.googleapis.com/maps/api/directions/json?origin=place_id:ChIJLfEUakca2jERraIvPP1CUVE&destination=place_id:ChIJLfEUakca2jERraIvPP1CUVE&waypoints=place_id:ChIJK7xLl1gZ2jERP_GdUY9XNLo|place_id:ChIJ18C-mwoZ2jERlpSawcucgk0|place_id:ChIJB5c91rsZ2jERPX9_QUwrSsc®ion=sg&arrival_time=1456676295&mode=transit&key=YOUR_OWN_KEY
To dissect the URL, these are the parameters that I put:
Notice that I use place_id for the places. That should not affect anything though, as the geocoded waypoints are actually returning the correct places.
The odd thing is that the returned status is not NOT_FOUND, but INVALID_REQUEST.
Any ideas why?
As per the documents, apparently Google Directions does not allow waypoints for transit. Driving, walking and bicycling are permitted.
Therefore, my workaround right now is just to get a waypoint order by calling the API by driving mode first, and then using that waypoint order call the API with one origin and one destination a few times to get all the routes.
This really puts a strain in the daily quota though.