I will resurrect this old topic to clarify a little more as the answers here helped me, but still required some legwork.
As it seems, at leas in the python API, the default is not to return zero impression rows.
The trick is that the checking of the condition appears to be all(value_columns.values == 0). So, if no value columns are requested, i.e. only categorical data, the condition will not be triggered and data comes anyway. That would be why @road11 sugestion worked.
To make a request with value columns and still get zero impression rows, one needs to explicitly declare the includeZeroImpressions header. How to do that might vary according to the language.
In python one could do that when creating the api_client object to have it added to all report requests. Alternativelly it is possible to add the header on a per report basis. As stated
in the documentation, my code turned out as follows:
report_downloader.DownloadReportAsStreamWithAwql(report_query,
include_zero_impressions=True,
skip_report_summary=True)
With that I got the expected result.