I would recommend to utilize the Keywords Performance Report and include a filter using the CampaignName field to get the campaigns that contains '404' in its name. You should then inlcude the Date field as well so you can check the earliest date as to when impressions were generated.
However, since you want to retrieve the data and impressions of keywords that is working since 2018, the output will be extremely large. If you encounter timeouts because of this reason, try a shorter date range or use predicates to break up the report request into multiple, smaller requests.
Let me know if this is what you're looking for.
Regards,
Ejay
Google Ads API Team
Then, before we proceed to your question on how to download a report, I noticed that you've used 'LIKE' operator in the report definition. However, this operator is not supported in the AdWords Query Language (AWQL). With this, instead of using the 'LIKE' operator, you can use the 'CONTAINS' as its usage is the same.
For your convenience, you can use these sample codes (which is also available in other supported client libraries) to download the report. Provided in this link are all the supported download formats that you can use based on your preferences.
Moving forward to your question about retrieving the actual name of the keywords, you may include the Criteria field in the report.
As for your last question, you can only filter dates by using them in the DURING clause. I hope this has been helpful.
Regards,
Ejay
Google Ads API Team