А это очень надо - защищать?
А почему сразу злоумышленник?
Вот вы вообще пишете, что у вас публичное API, и тут же пишете, что хотите запретить им пользоваться. :)
как в таких случаях определить реально ли клиентский запрос, или он идет от какого-то PHP парсера
Если хотите проверить идет ли запрос от браузера или от парсера, то проверяйте HTTP-заголовки, если парсер "кривой" то это поможет, еще лучше примените HTTPS с HSTS, а еще лучше перейдите с HTTP на другой протокол, вот это серьезно повысит "планку" для квалификации так называемого "злоумышленника".
должны же быть какие то способы проверки?
Кроме IP-адреса все остальное подделывается, вообще весь этот стек IP-TCP-HTTP мало что "должен", в прошлом веке о таких вещах не думали, в протоколе TCP нет и гораздо более нужных возможностей.