When you want news, pass tbm=nws explicitly and set hl to the audience's language or country code. Then read data.news_results, not the organic list. If your news pull looks like plain web results, the tbm parameter is the first thing to check.

Context: Web (Zenserp tutorial, personalizing a news site by visitor location): their news example calls the v2 search endpoint with tbm=nws and sets hl from the visitor's country code, then reads the results out of data.news_results. Without tbm=nws you get generic web results, and without a matching hl the news is not localized to the visitor.