You need actually to use function webwrite, so you can write a POST request to the web server, and then to examine the response.
csv file is actually generated only when user click on the symbol for download button and this file is generated inside the browser itself.
So, your best bet is to obtain the data and then process it somehow.
What I managed to do is the following:
url = 'https://visualisations.aemo.com.au/aemo/apps/api/report/5MIN';
body = '{"timeScale": ["30MIN"]}';
response = webwrite(url, body);
resp_period_type = {response.x5MIN.PERIODTYPE};
ind_actual = find(strcmp(resp_period_type,'ACTUAL'));
ind_forecast = find(strcmp(resp_period_type,'FORECAST'));
resp_date_time = {response.x5MIN.SETTLEMENTDATE};
date_time_arr = datetime(strrep(resp_date_time,'T',' '),'InputFormat','yyyy-MM-dd HH:mm:ss');
resp_date_time_actual = date_time_arr(ind_actual);
resp_date_time_forecast = date_time_arr(ind_forecast);
resp_spot_price = [response.x5MIN.RRP];
resp_spot_price_actual = resp_spot_price(ind_actual);
resp_spot_price_forecast = resp_spot_price(ind_forecast);
resp_sch_demand = [response.x5MIN.TOTALDEMAND];
resp_sch_demand_actual = resp_sch_demand(ind_actual);
resp_sch_demand_forecast = resp_sch_demand(ind_forecast);
plot(resp_date_time_actual, resp_spot_price_actual)
plot(resp_date_time_forecast, resp_spot_price_forecast)
I believe this code will be useful to you. This is the data that is returned, I have randomly checked 2 or three values at particular date and time and it seems to be a match to those values in the csv file, even though more data is returned in ths request.