Repository: azogue/aiopvpc (language: python)

Issue:
Price list for energy injected on the grid when solar installations
Hi,

Is it possible to add the hourly price for the energy injected on the grid aswell? (https://www.esios.ree.es/es/analisis/1739?vis=1&start_date=16-01-2021T00%3A00&end_date=16-01-2021T23%3A00&compare_start_date=15-01-2021T00%3A00&groupby=hour&compare_indicators=1013,1014,1015)

This would be awesome


Discussion / hints:
Hi @albetaCOM,

that data is available in https://api.esios.ree.es/indicators/1739, but needs an **access token 
from ESIOS** (`HTTP Token: Access denied.` for the public)

This library was intended to support a [Home Assistant Integration](https://www.home-assistant.io/integrations/pvpc_hourly_pricing/), by accessing only **public files** :(

If you know where to access that information without scraping the Analysis webpage (like this link: https://api.esios.ree.es/archives/70/download, used for the PVPC prices), I could try to implement this feature :)

Same goes for the prices of the new tariffs to come in the next month... I would adapt the library if I found how to read the new values🥺)

BTW, [if you have an ESIOS token](https://www.esios.ree.es/es/pagina/api), you can access the prices with:

```bash
curl "https://api.esios.ree.es/indicators/1739" \
     -H 'Authorization: Token token=<your-token-here>'
```

Output for today is:

```json
{
  "indicator": {
    "name": "Precio de la energía excedentaria del autoconsumo para el mecanismo de compensación simplificada (PVPC)",
    "short_name": "Precio de la energía excedentaria",
    "id": 1739,
    "composited": false,
    "step_type": "linear",
    "disaggregated": false,
    "magnitud": [
      {
        "name": "Precio",
        "id": 23
      }
    ],
    "tiempo": [
      {
        "name": "Hora",
        "id": 4
      }
    ],
    "geos": [
      {
        "geo_id": 3,
        "geo_name": "España"
      }
    ],
    "values_updated_at": "2021-05-15T20:19:45.000+02:00",
    "values": [
      {
        "value": 42.04,
        "datetime": "2021-05-16T00:00:00.000+02:00",
        "datetime_utc": "2021-05-15T22:00:00Z",
        "tz_time": "2021-05-15T22:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 38.38,
        "datetime": "2021-05-16T01:00:00.000+02:00",
        "datetime_utc": "2021-05-15T23:00:00Z",
        "tz_time": "2021-05-15T23:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 36.42,
        "datetime": "2021-05-16T02:00:00.000+02:00",
        "datetime_utc": "2021-05-16T00:00:00Z",
        "tz_time": "2021-05-16T00:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 21.91,
        "datetime": "2021-05-16T03:00:00.000+02:00",
        "datetime_utc": "2021-05-16T01:00:00Z",
        "tz_time": "2021-05-16T01:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 21.73,
        "datetime": "2021-05-16T04:00:00.000+02:00",
        "datetime_utc": "2021-05-16T02:00:00Z",
        "tz_time": "2021-05-16T02:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 21.62,
        "datetime": "2021-05-16T05:00:00.000+02:00",
        "datetime_utc": "2021-05-16T03:00:00Z",
        "tz_time": "2021-05-16T03:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 21.91,
        "datetime": "2021-05-16T06:00:00.000+02:00",
        "datetime_utc": "2021-05-16T04:00:00Z",
        "tz_time": "2021-05-16T04:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 25.07,
        "datetime": "2021-05-16T07:00:00.000+02:00",
        "datetime_utc": "2021-05-16T05:00:00Z",
        "tz_time": "2021-05-16T05:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 31.11,
        "datetime": "2021-05-16T08:00:00.000+02:00",
        "datetime_utc": "2021-05-16T06:00:00Z",
        "tz_time": "2021-05-16T06:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 21.91,
        "datetime": "2021-05-16T09:00:00.000+02:00",
        "datetime_utc": "2021-05-16T07:00:00Z",
        "tz_time": "2021-05-16T07:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 18.78,
        "datetime": "2021-05-16T10:00:00.000+02:00",
        "datetime_utc": "2021-05-16T08:00:00Z",
        "tz_time": "2021-05-16T08:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 10.84,
        "datetime": "2021-05-16T11:00:00.000+02:00",
        "datetime_utc": "2021-05-16T09:00:00Z",
        "tz_time": "2021-05-16T09:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 9.83,
        "datetime": "2021-05-16T12:00:00.000+02:00",
        "datetime_utc": "2021-05-16T10:00:00Z",
        "tz_time": "2021-05-16T10:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 7.33,
        "datetime": "2021-05-16T13:00:00.000+02:00",
        "datetime_utc": "2021-05-16T11:00:00Z",
        "tz_time": "2021-05-16T11:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 1.78,
        "datetime": "2021-05-16T14:00:00.000+02:00",
        "datetime_utc": "2021-05-16T12:00:00Z",
        "tz_time": "2021-05-16T12:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 0.81,
        "datetime": "2021-05-16T15:00:00.000+02:00",
        "datetime_utc": "2021-05-16T13:00:00Z",
        "tz_time": "2021-05-16T13:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 1.78,
        "datetime": "2021-05-16T16:00:00.000+02:00",
        "datetime_utc": "2021-05-16T14:00:00Z",
        "tz_time": "2021-05-16T14:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 1.78,
        "datetime": "2021-05-16T17:00:00.000+02:00",
        "datetime_utc": "2021-05-16T15:00:00Z",
        "tz_time": "2021-05-16T15:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 4.86,
        "datetime": "2021-05-16T18:00:00.000+02:00",
        "datetime_utc": "2021-05-16T16:00:00Z",
        "tz_time": "2021-05-16T16:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 35.77,
        "datetime": "2021-05-16T19:00:00.000+02:00",
        "datetime_utc": "2021-05-16T17:00:00Z",
        "tz_time": "2021-05-16T17:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 53.24,
        "datetime": "2021-05-16T20:00:00.000+02:00",
        "datetime_utc": "2021-05-16T18:00:00Z",
        "tz_time": "2021-05-16T18:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 70.82,
        "datetime": "2021-05-16T21:00:00.000+02:00",
        "datetime_utc": "2021-05-16T19:00:00Z",
        "tz_time": "2021-05-16T19:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 70.34,
        "datetime": "2021-05-16T22:00:00.000+02:00",
        "datetime_utc": "2021-05-16T20:00:00Z",
        "tz_time": "2021-05-16T20:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      },
      {
        "value": 64.88,
        "datetime": "2021-05-16T23:00:00.000+02:00",
        "datetime_utc": "2021-05-16T21:00:00Z",
        "tz_time": "2021-05-16T21:00:00.000Z",
        "geo_id": 3,
        "geo_name": "España"
      }
    ]
  }
}
```


I know is not a super clean way to do it but...

You can use the "default" token: token="request_your_personal_token_sending_email_to_consultasios@ree.es"

And it will work. I've used it until I've got my own token while developing my own solution (thousands of requests as I'm a bit slow and I need to check every 10 seconds).





```bash
curl "https://api.esios.ree.es/indicators/1739" -H 'Authorization: Token token="request_your_personal_token_sending_email_to_consultasios@ree.es"'
```
it works 🤣😂🙈🎪

is that documented anywhere??

(IMHO, that kind of GET endpoints should not require authorization, same as the one with the PVPC prices, but that _token_ make me 🤪) 
Na, of course it's not documented. I've been watching the webpage doing it's requests with this 'universal' token.

I completely agree with you that it should not require any kind of token.
> I've been watching the webpage doing it's requests with this 'universal' token.

> Para poder utilizar esta API deberán solicitar un token personal enviando un correo a consultasios@ree.es, ya que el token público que usa la propia página web cambia cada cierto tiempo.

🤣🤣🤡
oh, what a shame.

I don't really believe they change the Token, but better safe than sorry.
If their own frontend does that, maybe it's not _that bad idea_ to implement it here :)

The custom token could be optional (in the config flow in HA), same as these injection prices, and default to this _special one_ if injection prices are enabled without token...
Yep, that sounds fantastic. 
By configuration users can add their own token but if it's not provided, you can default to the universal one
Now I only need the time to do it 😅
use your superpowers as always.

Last time you said "it will take time" was with the tariff change on JUN1 and it took 40 minutes.
This is a much more important feature with the new Energy panel in HA, as the calculations there should be matching the price for the energy returned to the grid. Do you plan to have some time to work on this in the near term? I can try to provide something but my coding skills are rusty - so I don't mind to spend time on this, but I won't if you're planning to do it soon enough.

Thanks for the library and the HA integration.
A job well done deserves also being paid for it. Open Source doesn't mean "free for all" some times. If you manage to get some time to develop the necessary items for token request and energy injected, I'm up for sending you a "gift" as a reward. You say what you need and I'll provide it (if it doesn't go out of my budget).
Hi there 👋 @jcsogo, @jlopez77 @albetaCOM @EddieKnight1 @paniagualopez @danimart1991 @Albruaje 

At last, I had some time to focus a little on this problem, and I did a _proof of concept_ with a **new integration** using the ESIOS auth token to retrieve not only the PVPC, but also the **grid injection prices** and more indicators, like CO2 intensity.

I don't know yet if I'm going to split the actual library (this `aiopvpc`) or the HA Core integration (`pvpc_hourly_pricing`), or try to adapt it to use the new code if a token is provided in the config flow. 

And I also don't know when I will have another time to continue working on this, maybe a week, maybe a month :(

But in the meantime, you could **try it right now** (and provide some feedback 😜), so I'm leaving it here for you 👍

[esios.zip](https://github.com/azogue/aiopvpc/files/7531844/esios.zip)

Proceed as always and unzip the file in `config/custom_components` to create a new `esios` folder with the new integration (no need to remove/disable the current one). Then restart HA and add it by looking for 'Esios'.

This one **requires a valid esios token**, won't work other way.

**-> Some screenshots for configuration:**

<img width="546" alt="ha-esios-setup-1" src="https://user-images.githubusercontent.com/9748301/141617827-7190ebda-7f23-43a8-9ad6-210a34545966.png">

<img width="511" alt="ha-esios-setup-2" src="https://user-images.githubusercontent.com/9748301/141617975-85d60f4b-076f-4308-89c5-ef4d42ad1c62.png">

**-> How it looks:**

<img width="1079" alt="ha-esios-devices" src="https://user-images.githubusercontent.com/9748301/141618380-0e9c7db2-3704-4df2-b82a-3ffac107f07b.png">

<img width="406" alt="ha-esios-injection-sensor" src="https://user-images.githubusercontent.com/9748301/141618766-4d51bc31-8ce1-4403-9daa-f5039923afef.png">


BTW, @danimart1991, in this one, when the next-day prices are available, the ratios and other attributes are duplicated, fixing https://github.com/azogue/aiopvpc/issues/25, but also requires some changes for the lovelace card 😅

You'll see the new behavior this afternoon 🙈
> BTW, @danimart1991, in this one, when the next-day prices are available, the ratios and other attributes are duplicated, fixing #25, but also requires some changes for the lovelace card 😅
> 
> You'll see the new behavior this afternoon 🙈

I wait then for the update to avoid breaking changes with common users. Thanks for all your work 👍🏻 

> ~~ but also requires some changes for the lovelace card~~

It looks like it's working perfectly fine 🤩

<img width="360" alt="esios-2-day-values-lovelace-card" src="https://user-images.githubusercontent.com/9748301/142273724-29a5b179-ff24-46b9-bfb4-f439eaa0c5a0.png">


Hola Eugenio,Soy Eddie Knight y lo prometido es deuda. Dime si esta dirección es válida para enviarte un vale de Amazon o si prefieres otro método.

Edit: Vale, veo que al responder el correo  se envía aqui. Busco otro método :D




Hi,

After downloading esiso zip and unpacking con custom_components, followed by adding the integration, I get a message "Configuration flow could not be loaded". The log reports this:

Logger: homeassistant.config_entries
Source: config_entries.py:711
First occurred: 20:10:00 (1 occurrences)
Last logged: 20:10:00

Error occurred loading configuration flow for integration esios: No module named 'zoneinfo'

I'm using python 3.8.12 at the moment, unable to upgrade yet to python 3.9.
@EddieKnight1,

> Error occurred loading configuration flow for integration esios: No module named 'zoneinfo'
> I'm using python 3.8.12 at the moment, unable to upgrade yet to python 3.9.

That's the reason, `zoneinfo` is an internal module from python>=3.9

If you cannot upgrade, then install [`backports.zoneinfo`](https://pypi.org/project/backports.zoneinfo/) 😜

If you are using a custom python environment to run HA, just run `pip install backports.zoneinfo` on it. 

But, if you're using some _dockerized_ HomeAssistant setup (different from the one in HA OS), and accessing it is complicated, I imagine it could also work by setting that dependency in the `manifest.json` file of the custom component, setting `"requirements": ["backports.zoneinfo"],`

BTW, Python3.8 is going to be deprecated soon in HA, hurry up with that upgrade, or move to HA OS 😊

BTW(2), the `esios` custom component requires a quite modern HA version to work with (2021.10/11 at least); it won't work other way :(
> @EddieKnight1,
> 
> > Error occurred loading configuration flow for integration esios: No module named 'zoneinfo'
> > I'm using python 3.8.12 at the moment, unable to upgrade yet to python 3.9.
> 
> That's the reason, `zoneinfo` is an internal module from python>=3.9
> 
> If you cannot upgrade, then install [`backports.zoneinfo`](https://pypi.org/project/backports.zoneinfo/) 😜
> 
> If you are using a custom python environment to run HA, just run `pip install backports.zoneinfo` on it.
> 
> But, if you're using some _dockerized_ HomeAssistant setup (different from the one in HA OS), and accessing it is complicated, I imagine it could also work by setting that dependency in the `manifest.json` file of the custom component, setting `"requirements": ["backports.zoneinfo"],`
> 
> BTW, Python3.8 is going to be deprecated soon in HA, hurry up with that upgrade, or move to HA OS 😊
> 
> BTW(2), the `esios` custom component requires a quite modern HA version to work with (2021.10/11 at least); it won't work other way :(

Thanks!

I've tried several ways but finally followed the plugin developer in TrueNAS for my Jail update. Python 3.9 installed and component installed. Waiting now for the personal API key.
@EddieKnight1 ,

> I've tried several ways but finally followed the plugin developer in TrueNAS for my Jail update. Python 3.9 installed and component installed. Waiting now for the personal API key.

**Sorry about the mess and lost time**, it was entirely my fault 🙈🙏

I made an error in the code 🐛, **making it impossible to run the component under python3.8**.

And the saddest thing about that is that I discovered it by chance, just because yesterday I _literally_ copied some of the new code over the old one to quick-fix an issue in the current HA integration, about sensor attributes using 48h prices in the evening...
And that caused a failed pipeline in the PR in HA when running tests with python 3.8 😱

I'll try to **re-publish the `esios.zip`** as soon as possible, so it can work with py38, if some other user falls in the same scenario...

> Python 3.9 installed and component installed. 

Best thing you could do 👍, and again, sorry about the miss-guidance 🥺

> Waiting now for the personal API key.

BTW, is that taking too long? I remember that request was relatively quick, like < 3h. Is it slower now?



> @EddieKnight1 ,
> 
> > I've tried several ways but finally followed the plugin developer in TrueNAS for my Jail update. Python 3.9 installed and component installed. Waiting now for the personal API key.
> 
> **Sorry about the mess and lost time**, it was entirely my fault 🙈🙏
> 
> I made an error in the code 🐛, **making it impossible to run the component under python3.8**.
> 
> And the saddest thing about that is that I discovered it by chance, just because yesterday I _literally_ copied some of the new code over the old one to quick-fix an issue in the current HA integration, about sensor attributes using 48h prices in the evening... And that caused a failed pipeline in the PR in HA when running tests with python 3.8 😱
> 
> I'll try to **re-publish the `esios.zip`** as soon as possible, so it can work with py38, if some other user falls in the same scenario...
> 
> > Python 3.9 installed and component installed.
> 
> Best thing you could do 👍, and again, sorry about the miss-guidance 🥺
> 
> > Waiting now for the personal API key.
> 
> BTW, is that taking too long? I remember that request was relatively quick, like < 3h. Is it slower now?

No worries about the issues. Its part of the test/UAT. Good thing is we've found the issue and got a workaround and solution.

Regarding the key, I sent the request out of working hours so probably will get delayed til Monday. I'll bring feedback next week. 
> > @EddieKnight1 ,
> > > I've tried several ways but finally followed the plugin developer in TrueNAS for my Jail update. Python 3.9 installed and component installed. Waiting now for the personal API key.
> > 
> > 
> > **Sorry about the mess and lost time**, it was entirely my fault 🙈🙏
> > I made an error in the code 🐛, **making it impossible to run the component under python3.8**.
> > And the saddest thing about that is that I discovered it by chance, just because yesterday I _literally_ copied some of the new code over the old one to quick-fix an issue in the current HA integration, about sensor attributes using 48h prices in the evening... And that caused a failed pipeline in the PR in HA when running tests with python 3.8 😱
> > I'll try to **re-publish the `esios.zip`** as soon as possible, so it can work with py38, if some other user falls in the same scenario...
> > > Python 3.9 installed and component installed.
> > 
> > 
> > Best thing you could do 👍, and again, sorry about the miss-guidance 🥺
> > > Waiting now for the personal API key.
> > 
> > 
> > BTW, is that taking too long? I remember that request was relatively quick, like < 3h. Is it slower now?
> 
> No worries about the issues. Its part of the test/UAT. Good thing is we've found the issue and got a workaround and solution.
> 
> Regarding the key, I sent the request out of working hours so probably will get delayed til Monday. I'll bring feedback next week.

API key received and integration configured. The Energy setting in HA is also capturing the price/hour for the surplus now.

What a good job @azogue !
I'm a bit late.

It works perfect. 
Perfect. Could be added to next core update? 
How long does it take to send the token?
> How long does it take to send the token?

I have requested the token yesterday at 20:07 and received it 30 minutes ago.
But I have read that someone received it in 10 minutes. I suppose it depends on the time of the day they receive the e-mail.
Tested and working as expected. Thanks!
Hello. I have been using the esios.zip custom_component with a personal token. It works fantastic! However, since 2021.12.* the log reports some things upon setting up:
`2021-12-21 18:59:31 WARNING (MainThread) [homeassistant.helpers.frame] Detected code that uses str for device registry entry_type. This is deprecated and will stop wor
king in Home Assistant 2022.3, it should be updated to use DeviceEntryType instead. Please report this issue.
Stack (most recent call last):
  File "/usr/local/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/local/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 331, in <module>
    sys.exit(main())
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 318, in main
    exit_code = runner.run(runtime_conf)
  File "/usr/src/homeassistant/homeassistant/runner.py", line 121, in run
    return loop.run_until_complete(setup_and_run_hass(runtime_config))
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 629, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 596, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1890, in _run_once
    handle._run()
  File "/usr/local/lib/python3.9/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 500, in _async_add_entity
    device = device_registry.async_get_or_create(**processed_dev_info)  # type: ignore[arg-type]
  File "/usr/src/homeassistant/homeassistant/helpers/device_registry.py", line 360, in async_get_or_create
    report(  # type: ignore[unreachable]
  File "/usr/src/homeassistant/homeassistant/helpers/frame.py", line 74, in report
    _LOGGER.warning(msg, stack_info=True)
Stack (most recent call last):
  File "/usr/local/lib/python3.9/runpy.py", line 197, in _run_module_as_main
    return _run_code(code, main_globals, None,
  File "/usr/local/lib/python3.9/runpy.py", line 87, in _run_code
    exec(code, run_globals)
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 331, in <module>
    sys.exit(main())
  File "/usr/src/homeassistant/homeassistant/__main__.py", line 318, in main
    exit_code = runner.run(runtime_conf)
  File "/usr/src/homeassistant/homeassistant/runner.py", line 121, in run
    return loop.run_until_complete(setup_and_run_hass(runtime_config))
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 629, in run_until_complete
    self.run_forever()
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 596, in run_forever
    self._run_once()
  File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1890, in _run_once
    handle._run()
  File "/usr/local/lib/python3.9/asyncio/events.py", line 80, in _run
    self._context.run(self._callback, *self._args)
  File "/usr/src/homeassistant/homeassistant/helpers/entity_platform.py", line 500, in _async_add_entity
    device = device_registry.async_get_or_create(**processed_dev_info)  # type: ignore[arg-type]
  File "/usr/src/homeassistant/homeassistant/helpers/device_registry.py", line 360, in async_get_or_create
    report(  # type: ignore[unreachable]
  File "/usr/src/homeassistant/homeassistant/helpers/frame.py", line 74, in report
    _LOGGER.warning(msg, stack_info=True)
2021-12-21 18:59:31 WARNING (MainThread) [custom_components.esios.sensor] Setup of ESIOS PVPC (sensor.esios_pvpc) finished`

This is recorded twice, I suppose once for each sensor (pvpc and grid_injection).  I'm reluctant to it but, should I return to standard integration? I tried to a couple of weeks ago, but auth errors were still happening.

I managed to solve it, changing two lines of sensor.py:

Adding:
`from homeassistant.helpers.device_registry import DeviceEntryType
`
And in `__init__` changing `entry_type="service",` to `entry_type=DeviceEntryType.SERVICE,`

So I can keep using this "token and injection price" version until this version is integrated in the core integration.

> 
> **-> How it looks:**

> 
> <img alt="ha-esios-injection-sensor" width="406" src="https://user-images.githubusercontent.com/9748301/141618766-4d51bc31-8ce1-4403-9daa-f5039923afef.png">

excuse my ignorance. How can I add such a beautiful card? I've only added the sensors ...

Fix patch:
diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml
index d1b063d..1213018 100644
--- a/.pre-commit-config.yaml
+++ b/.pre-commit-config.yaml
@@ -43,6 +43,8 @@ repos:
       - id: "mypy"
         name: "Check type hints (mypy)"
         verbose: true
+        additional_dependencies:
+          - types-attrs
 ci:
   autofix_commit_msg: |
       [pre-commit.ci] auto fixes from pre-commit.com hooks
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 2d34ff7..e13445f 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,33 @@
 # Changelog
 
+## [v4.0.0](https://github.com/azogue/aiopvpc/tree/v4.0.0) - Implement ESIOS API Token (2023-01-09)
+
+[Full Changelog](https://github.com/azogue/aiopvpc/compare/v4.0.0...v3.0.0)
+
+- ✨ Implement **support to access the extended ESIOS API** with a personal token
+(you must request yours by mailing to [consultasios@ree.es](mailto:consultasios@ree.es?subject=Personal%20token%20request)),
+with initial support for the existent PVPC price sensor (ESIOS indicator code: **1001**), and **3 new ones** 🤩:
+  * **Inyection price** sensor (ESIOS indicator code: **1739**),
+name: "Precio de la energía excedentaria del autoconsumo para el mecanismo de compensación simplificada"
+  * **MAG price** sensor (ESIOS indicator code: **1900**),
+name: "Desglose peaje por defecto 2.0TD excedente o déficit de la liquidación del mecanismo de ajuste de costes de producción"
+  * **OMIE price** sensor (ESIOS indicator code: **10211**),
+name: "Precio medio horario final suma de componentes"
+
+- 💥 Remove 'apidatos' support as alternative _data-source_, leaving only public and private paths for https://api.esios.ree.es
+
+- ✨ Signal bad auth for esios token calls with a custom exception, to handle 'reauth' flow in Home-Assistant
+
+- ✨ Add helper methods for HA integration to manage unique ids for each sensor, to update the enabled sensors to download, and to check the API token
+
+- ♻️ Use dataclasses for `EsiosApiData` and `EsiosResponse` data containers, instead of typed dicts
+
+- ✅ tests: Update fixtures for esios sensors and adapt tests to the new interface and the multiple-sensors behaviour
+
+- 📦️ Bump mayor version to **v4** and lighten dev-env, removing pre-commit related modules and adding python-dotenv
+
+- (from #46, with v3.1.0) Remove `holidays` dependency to evaluate special days under 'P3' period and fix tests
+
 ## [v3.0.0](https://github.com/azogue/aiopvpc/tree/v3.0.0) - Change Data Source to apidatos.ree.es (2021-12-05)
 
 [Full Changelog](https://github.com/azogue/aiopvpc/compare/v3.0.0...v2.3.0)
diff --git a/aiopvpc/__init__.py b/aiopvpc/__init__.py
index 1d8d8f0..caebec1 100644
--- a/aiopvpc/__init__.py
+++ b/aiopvpc/__init__.py
@@ -1,5 +1,13 @@
 """Simple aio library to download Spanish electricity hourly prices."""
-from .const import DEFAULT_POWER_KW, TARIFFS
-from .pvpc_data import PVPCData
+from .const import DEFAULT_POWER_KW, EsiosApiData, TARIFFS
+from .ha_helpers import get_enabled_sensor_keys
+from .pvpc_data import BadApiTokenAuthError, PVPCData
 
-__all__ = ("DEFAULT_POWER_KW", "PVPCData", "TARIFFS")
+__all__ = (
+    "BadApiTokenAuthError",
+    "EsiosApiData",
+    "DEFAULT_POWER_KW",
+    "PVPCData",
+    "TARIFFS",
+    "get_enabled_sensor_keys",
+)
diff --git a/aiopvpc/const.py b/aiopvpc/const.py
index 70b3a8d..7ce8d18 100644
--- a/aiopvpc/const.py
+++ b/aiopvpc/const.py
@@ -1,9 +1,8 @@
-"""
-Simple aio library to download Spanish electricity hourly prices. Constants.
-"""
+"""Simple aio library to download Spanish electricity hourly prices. Constants."""
 import zoneinfo
-from datetime import date
-from typing import Dict, Literal
+from dataclasses import dataclass
+from datetime import date, datetime
+from typing import Literal
 
 DATE_CHANGE_TO_20TD = date(2021, 6, 1)
 
@@ -22,21 +21,75 @@
 REFERENCE_TZ = zoneinfo.ZoneInfo("Europe/Madrid")
 UTC_TZ = zoneinfo.ZoneInfo("UTC")
 
-DEFAULT_TIMEOUT = 5
+DEFAULT_TIMEOUT = 10
 PRICE_PRECISION = 5
 
-DataSource = Literal["esios_public", "apidatos"]  # , "esios"
-URL_PVPC_RESOURCE = (
+DataSource = Literal["esios_public", "esios"]
+GEOZONES = ["Península", "Canarias", "Baleares", "Ceuta", "Melilla", "España"]
+GEOZONE_ID2NAME: dict[int, str] = {
+    3: "España",
+    8741: "Península",
+    8742: "Canarias",
+    8743: "Baleares",
+    8744: "Ceuta",
+    8745: "Melilla",
+}
+URL_PUBLIC_PVPC_RESOURCE = (
     "https://api.esios.ree.es/archives/70/download_json"
     "?locale=es&date={day:%Y-%m-%d}"
 )
-URL_APIDATOS_PRICES_RESOURCE = (
-    "https://apidatos.ree.es/es/datos/mercados/precios-mercados-tiempo-real"
-    "?time_trunc=hour"
-    "&geo_ids={geo_id}"
-    "&start_date={start:%Y-%m-%dT%H:%M}&end_date={end:%Y-%m-%dT%H:%M}"
+URL_ESIOS_TOKEN_RESOURCE = (
+    "https://api.esios.ree.es/indicators/{ind}"
+    + "?start_date={day:%Y-%m-%d}T00:00&end_date={day:%Y-%m-%d}T23:59"
 )
-ATTRIBUTIONS: Dict[DataSource, str] = {
+ATTRIBUTIONS: dict[DataSource, str] = {
     "esios_public": "Data retrieved from api.esios.ree.es by REE",
-    "apidatos": "Data retrieved from apidatos.ree.es by REE",
+    "esios": "Data retrieved with API token from api.esios.ree.es by REE",
+}
+
+# api.esios.ree.es/indicators
+ESIOS_PVPC = "1001"
+ESIOS_INYECTION = "1739"
+ESIOS_MAG = "1900"  # regargo GAS
+ESIOS_OMIE = "10211"  # precio mayorista
+
+# unique ids for each series
+KEY_PVPC = "PVPC"
+KEY_INYECTION = "INYECTION"
+KEY_MAG = "MAG"  # regargo GAS
+KEY_OMIE = "OMIE"  # precio mayorista
+
+ALL_SENSORS = (KEY_PVPC, KEY_INYECTION, KEY_MAG, KEY_OMIE)
+SENSOR_KEY_TO_DATAID = {
+    KEY_PVPC: ESIOS_PVPC,
+    KEY_INYECTION: ESIOS_INYECTION,
+    KEY_MAG: ESIOS_MAG,
+    KEY_OMIE: ESIOS_OMIE,
+}
+SENSOR_KEY_TO_NAME = {
+    KEY_PVPC: "PVPC T. 2.0TD",
+    KEY_INYECTION: "Precio de la energía excedentaria",
+    KEY_MAG: "2.0TD Excedente o déficit ajuste liquidación",
+    KEY_OMIE: "Precio medio horario final suma",
 }
+
+
+@dataclass
+class EsiosResponse:
+    """Data schema for parsed data coming from ESIOS API."""
+
+    name: str
+    data_id: str
+    last_update: datetime
+    unit: str
+    series: dict[str, dict[datetime, float]]
+
+
+@dataclass
+class EsiosApiData:
+    """Data schema to store multiple series from ESIOS API."""
+
+    last_update: datetime
+    data_source: str
+    sensors: dict[str, dict[datetime, float]]
+    availability: dict[str, bool]
diff --git a/aiopvpc/ha_helpers.py b/aiopvpc/ha_helpers.py
new file mode 100644
index 0000000..4734787
--- /dev/null
+++ b/aiopvpc/ha_helpers.py
@@ -0,0 +1,42 @@
+"""Home Assistant helper methods."""
+from aiopvpc.const import (
+    ALL_SENSORS,
+    KEY_INYECTION,
+    KEY_MAG,
+    KEY_OMIE,
+    KEY_PVPC,
+    TARIFFS,
+)
+
+_ha_uniqueid_to_sensor_key = {
+    TARIFFS[0]: KEY_PVPC,
+    TARIFFS[1]: KEY_PVPC,
+    f"{TARIFFS[0]}_{KEY_INYECTION}": KEY_INYECTION,
+    f"{TARIFFS[1]}_{KEY_INYECTION}": KEY_INYECTION,
+    f"{TARIFFS[0]}_{KEY_MAG}": KEY_MAG,
+    f"{TARIFFS[1]}_{KEY_MAG}": KEY_MAG,
+    f"{TARIFFS[0]}_{KEY_OMIE}": KEY_OMIE,
+    f"{TARIFFS[1]}_{KEY_OMIE}": KEY_OMIE,
+}
+
+
+def get_enabled_sensor_keys(
+    using_private_api: bool, disabled_sensor_ids: list[str]
+) -> set[str]:
+    """(HA) Get enabled API indicators."""
+    sensor_keys = set(ALL_SENSORS) if using_private_api else {KEY_PVPC}
+    for unique_id in disabled_sensor_ids:
+        disabled_ind = _ha_uniqueid_to_sensor_key[unique_id]
+        if disabled_ind in sensor_keys:
+            sensor_keys.remove(disabled_ind)
+
+    return sensor_keys
+
+
+def make_sensor_unique_id(config_entry_id: str, sensor_key: str) -> str:
+    """(HA) Generate unique_id for each sensor kind and config entry."""
+    assert sensor_key in ALL_SENSORS
+    if sensor_key == KEY_PVPC:
+        # for old compatibility
+        return config_entry_id
+    return f"{config_entry_id}_{sensor_key}"
diff --git a/aiopvpc/parser.py b/aiopvpc/parser.py
index f0b6630..0a76f39 100644
--- a/aiopvpc/parser.py
+++ b/aiopvpc/parser.py
@@ -5,59 +5,37 @@
 * Parser for the contents of the JSON files
 """
 from datetime import datetime, timedelta
-from typing import Any, Dict, TypedDict
+from itertools import groupby
+from operator import itemgetter
+from typing import Any
 
 from aiopvpc.const import (
     DataSource,
+    EsiosResponse,
+    GEOZONE_ID2NAME,
+    GEOZONES,
+    KEY_PVPC,
     PRICE_PRECISION,
     REFERENCE_TZ,
-    URL_APIDATOS_PRICES_RESOURCE,
-    URL_PVPC_RESOURCE,
+    SENSOR_KEY_TO_DATAID,
+    TARIFF2ID,
+    TARIFFS,
+    URL_ESIOS_TOKEN_RESOURCE,
+    URL_PUBLIC_PVPC_RESOURCE,
     UTC_TZ,
     zoneinfo,
 )
 
 
-class PricesResponse(TypedDict):
-    """Data schema for parsed prices coming from `apidatos.ree.es`."""
-
-    name: str
-    data_id: str
-    last_update: datetime
-    unit: str
-    series: Dict[str, Dict[datetime, float]]
-
-
-def extract_prices_from_apidatos_ree(
-    data: Dict[str, Any], tz: zoneinfo.ZoneInfo = REFERENCE_TZ
-) -> PricesResponse:
-    """Parse the contents of a query to 'precios-mercados-tiempo-real'."""
+def _timezone_offset(tz: zoneinfo.ZoneInfo = REFERENCE_TZ) -> timedelta:
     ref_ts = datetime(2021, 1, 1, tzinfo=REFERENCE_TZ).astimezone(UTC_TZ)
     loc_ts = datetime(2021, 1, 1, tzinfo=tz).astimezone(UTC_TZ)
-    loc_ts - ref_ts.astimezone(UTC_TZ)
-    offset_timezone = loc_ts - ref_ts
-
-    def _parse_dt(ts: str) -> datetime:
-        return datetime.fromisoformat(ts).astimezone(UTC_TZ) + offset_timezone
-
-    return PricesResponse(
-        name=data["data"]["type"],
-        data_id=data["data"]["id"],
-        last_update=_parse_dt(data["data"]["attributes"]["last-update"]),
-        unit="€/kWh",
-        series={
-            data_series["type"].replace(" (€/MWh)", ""): {
-                _parse_dt(price["datetime"]): round(price["value"] / 1000.0, 5)
-                for price in data_series["attributes"]["values"]
-            }
-            for data_series in data["included"]
-        },
-    )
+    return loc_ts - ref_ts
 
 
 def extract_prices_from_esios_public(
-    data: Dict[str, Any], key: str, tz: zoneinfo.ZoneInfo = REFERENCE_TZ
-) -> PricesResponse:
+    data: dict[str, Any], key: str, tz: zoneinfo.ZoneInfo = REFERENCE_TZ
+) -> EsiosResponse:
     """Parse the contents of a daily PVPC json file."""
     ts_init = datetime(
         *datetime.strptime(data["PVPC"][0]["Dia"], "%d/%m/%Y").timetuple()[:3],
@@ -72,37 +50,112 @@ def _parse_tariff_val(value, prec=PRICE_PRECISION) -> float:
         for i, values_hour in enumerate(data["PVPC"])
     }
 
-    return PricesResponse(
+    return EsiosResponse(
         name="PVPC ESIOS",
         data_id="legacy",
         last_update=datetime.utcnow().replace(microsecond=0, tzinfo=UTC_TZ),
         unit="€/kWh",
-        series={"PVPC": pvpc_prices},
+        series={KEY_PVPC: pvpc_prices},
     )
 
 
-def extract_pvpc_data(
-    data: Dict[str, Any], url: str, key: str, tz: zoneinfo.ZoneInfo = REFERENCE_TZ
-) -> Dict[datetime, float]:
-    """Parse the contents of a daily PVPC json file."""
-    if url.startswith("https://api.esios.ree.es/archives"):
-        prices_data = extract_prices_from_esios_public(data, key, tz)
-    elif url.startswith("https://apidatos.ree.es"):
-        prices_data = extract_prices_from_apidatos_ree(data, tz)
-    else:
-        raise NotImplementedError(f"Data source not known: {url} >{data}")
-    return prices_data["series"]["PVPC"]
+def extract_prices_from_esios_token(
+    data: dict[str, Any],
+    sensor_key: str,
+    geo_zone: str,
+    tz: zoneinfo.ZoneInfo = REFERENCE_TZ,
+) -> EsiosResponse:
+    """Parse the contents of an 'indicator' json file from ESIOS API."""
+    offset_timezone = _timezone_offset(tz)
+    indicator_data = data.pop("indicator")
+    unit = "•".join(mag["name"] for mag in indicator_data["magnitud"])
+    unit_tiempo = "•".join(mag["name"] for mag in indicator_data["tiempo"])
+    unit += f"/{unit_tiempo}"
+    ts_update = datetime.utcnow().replace(microsecond=0, tzinfo=UTC_TZ)
 
+    def _parse_dt(ts: str) -> datetime:
+        return datetime.fromisoformat(ts).astimezone(UTC_TZ) + offset_timezone
 
-def get_url_prices(
-    source: DataSource, zone_ceuta_melilla: bool, now_local_ref: datetime
-) -> str:
-    """Make URL for PVPC prices."""
-    if source == "esios_public":
-        return URL_PVPC_RESOURCE.format(day=now_local_ref.date())
+    def _value_unit_conversion(value: float) -> float:
+        # from €/MWh to €/kWh
+        return round(float(value) / 1000.0, 5)
 
-    start = now_local_ref.replace(hour=0, minute=0)
-    end = now_local_ref.replace(hour=23, minute=59)
-    return URL_APIDATOS_PRICES_RESOURCE.format(
-        start=start, end=end, geo_id=8744 if zone_ceuta_melilla else 8741
+    value_gen = groupby(
+        sorted(indicator_data["values"], key=itemgetter("geo_id")),
+        itemgetter("geo_id"),
+    )
+    parsed_data = {
+        GEOZONE_ID2NAME[key]: {
+            _parse_dt(item["datetime"]): _value_unit_conversion(item["value"])
+            for item in list(group)
+        }
+        for key, group in value_gen
+    }
+    if geo_zone in parsed_data:
+        geo_data = parsed_data[geo_zone]
+    elif "Península" in parsed_data:
+        geo_data = parsed_data["Península"]
+    else:
+        geo_data = parsed_data["España"]
+
+    return EsiosResponse(
+        name=indicator_data["name"],
+        data_id=str(indicator_data["id"]),
+        last_update=ts_update,
+        unit=unit,
+        series={sensor_key: geo_data},
     )
+
+
+def extract_esios_data(
+    data: dict[str, Any],
+    url: str,
+    sensor_key: str,
+    tariff: str,
+    tz: zoneinfo.ZoneInfo = REFERENCE_TZ,
+) -> EsiosResponse:
+    """Parse the contents of a daily PVPC json file."""
+    if url.startswith("https://api.esios.ree.es/archives"):
+        return extract_prices_from_esios_public(data, TARIFF2ID[tariff], tz)
+
+    if url.startswith("https://api.esios.ree.es/indicators"):
+        # TODO adapt better to geozones
+        if tariff == TARIFFS[0] and tz != REFERENCE_TZ:
+            geo_zone = GEOZONES[1]
+        elif tariff == TARIFFS[0]:
+            geo_zone = GEOZONES[0]
+        else:
+            geo_zone = GEOZONES[3]
+
+        return extract_prices_from_esios_token(data, sensor_key, geo_zone, tz)
+    raise NotImplementedError(f"Data source not known: {url} >{data}")
+
+
+def get_daily_urls_to_download(
+    source: DataSource,
+    sensor_keys: set[str],
+    now_local_ref: datetime,
+    next_day_local_ref: datetime,
+) -> tuple[list[str], list[str]]:
+    """Make URLs for ESIOS price series."""
+    if source == "esios_public":
+        assert sensor_keys == {KEY_PVPC}
+        return (
+            [URL_PUBLIC_PVPC_RESOURCE.format(day=now_local_ref.date())],
+            [URL_PUBLIC_PVPC_RESOURCE.format(day=next_day_local_ref.date())],
+        )
+
+    assert source == "esios"
+    today = [
+        URL_ESIOS_TOKEN_RESOURCE.format(
+            ind=SENSOR_KEY_TO_DATAID[key], day=now_local_ref.date()
+        )
+        for key in sensor_keys
+    ]
+    tomorrow = [
+        URL_ESIOS_TOKEN_RESOURCE.format(
+            ind=SENSOR_KEY_TO_DATAID[key], day=next_day_local_ref.date()
+        )
+        for key in sensor_keys
+    ]
+    return today, tomorrow
diff --git a/aiopvpc/prices.py b/aiopvpc/prices.py
index 711f40f..6f2dba9 100644
--- a/aiopvpc/prices.py
+++ b/aiopvpc/prices.py
@@ -1,8 +1,9 @@
 """ESIOS API handler for HomeAssistant. Hourly price attributes."""
+import zoneinfo
 from datetime import datetime
-from typing import Any, Dict, Tuple
+from typing import Any
 
-from aiopvpc.const import zoneinfo
+from .const import KEY_INYECTION
 
 
 def _is_tomorrow_price(ts: datetime, ref: datetime) -> bool:
@@ -10,10 +11,10 @@ def _is_tomorrow_price(ts: datetime, ref: datetime) -> bool:
 
 
 def _split_today_tomorrow_prices(
-    current_prices: Dict[datetime, float],
+    current_prices: dict[datetime, float],
     utc_time: datetime,
     timezone: zoneinfo.ZoneInfo,
-) -> Tuple[Dict[datetime, float], Dict[datetime, float]]:
+) -> tuple[dict[datetime, float], dict[datetime, float]]:
     local_time = utc_time.astimezone(timezone)
     today, tomorrow = {}, {}
     for ts_utc, price_h in current_prices.items():
@@ -26,8 +27,8 @@ def _split_today_tomorrow_prices(
 
 
 def _make_price_tag_attributes(
-    prices: Dict[datetime, float], timezone: zoneinfo.ZoneInfo, tomorrow: bool
-) -> Dict[str, Any]:
+    prices: dict[datetime, float], timezone: zoneinfo.ZoneInfo, tomorrow: bool
+) -> dict[str, Any]:
     prefix = "price_next_day_" if tomorrow else "price_"
     attributes = {}
     for ts_utc, price_h in prices.items():
@@ -35,21 +36,26 @@ def _make_price_tag_attributes(
         attr_key = f"{prefix}{ts_local.hour:02d}h"
         if attr_key in attributes:  # DST change with duplicated hour :)
             attr_key += "_d"
-        attributes[attr_key] = price_h
+        attributes[attr_key] = 1000 * price_h
     return attributes
 
 
 def _make_price_stats_attributes(
+    sensor_key: str,
     current_price: float,
-    current_prices: Dict[datetime, float],
+    current_prices: dict[datetime, float],
     utc_time: datetime,
     timezone: zoneinfo.ZoneInfo,
-) -> Dict[str, Any]:
-    attributes: Dict[str, Any] = {}
+) -> dict[str, Any]:
+    attributes: dict[str, Any] = {}
+    sign_is_best = 1 if sensor_key != KEY_INYECTION else -1
+    prices_sorted = dict(
+        sorted(current_prices.items(), key=lambda x: sign_is_best * x[1])
+    )
     better_prices_ahead = [
         (ts, price)
         for ts, price in current_prices.items()
-        if ts > utc_time and price < current_price
+        if ts > utc_time and price * sign_is_best < current_price * sign_is_best
     ]
     if better_prices_ahead:
         next_better_ts, next_better_price = better_prices_ahead[0]
@@ -58,7 +64,6 @@ def _make_price_stats_attributes(
         attributes["hours_to_better_price"] = int(delta_better.total_seconds()) // 3600
         attributes["num_better_prices_ahead"] = len(better_prices_ahead)
 
-    prices_sorted = dict(sorted(current_prices.items(), key=lambda x: x[1]))
     try:
         attributes["price_position"] = (
             list(prices_sorted.values()).index(current_price) + 1
@@ -80,30 +85,30 @@ def _make_price_stats_attributes(
     )
     attributes["min_price"] = min_price
     attributes["min_price_at"] = next(iter(prices_sorted)).astimezone(timezone).hour
-    attributes["next_best_at"] = list(
-        map(
-            lambda x: x.astimezone(timezone).hour,
-            filter(lambda x: x >= utc_time, prices_sorted.keys()),
-        )
-    )
+    attributes["next_best_at"] = [
+        ts.astimezone(timezone).hour for ts in prices_sorted.keys() if ts >= utc_time
+    ]
     return attributes
 
 
 def make_price_sensor_attributes(
-    current_prices: Dict[datetime, float],
+    sensor_key: str,
+    current_prices: dict[datetime, float],
     utc_time: datetime,
     timezone: zoneinfo.ZoneInfo,
-) -> Dict[str, Any]:
+) -> dict[str, Any]:
     """Generate sensor attributes for hourly prices variables."""
     current_price = current_prices[utc_time]
     today, tomorrow = _split_today_tomorrow_prices(current_prices, utc_time, timezone)
-    price_attrs = _make_price_stats_attributes(current_price, today, utc_time, timezone)
+    price_attrs = _make_price_stats_attributes(
+        sensor_key, current_price, today, utc_time, timezone
+    )
     price_tags = _make_price_tag_attributes(today, timezone, False)
     if tomorrow:
         tomorrow_prices = {
             f"{key} (next day)": value
             for key, value in _make_price_stats_attributes(
-                current_price, tomorrow, utc_time, timezone
+                sensor_key, current_price, tomorrow, utc_time, timezone
             ).items()
         }
         tomorrow_price_tags = _make_price_tag_attributes(tomorrow, timezone, True)
diff --git a/aiopvpc/pvpc_data.py b/aiopvpc/pvpc_data.py
index 63e9e53..f46308a 100644
--- a/aiopvpc/pvpc_data.py
+++ b/aiopvpc/pvpc_data.py
@@ -5,35 +5,41 @@
 HomeAssistant integration,
 https://www.home-assistant.io/integrations/pvpc_hourly_pricing/
 """
+from __future__ import annotations
+
 import asyncio
 import logging
 from collections import deque
 from datetime import datetime, timedelta
 from random import random
-from typing import Any, Dict, Optional, Union
+from typing import Any
 
 import aiohttp
 import async_timeout
 
 from aiopvpc.const import (
+    ALL_SENSORS,
     ATTRIBUTIONS,
     DataSource,
-    DATE_CHANGE_TO_20TD,
     DEFAULT_POWER_KW,
     DEFAULT_TIMEOUT,
+    EsiosApiData,
+    EsiosResponse,
+    KEY_PVPC,
     REFERENCE_TZ,
-    TARIFF2ID,
+    SENSOR_KEY_TO_DATAID,
     TARIFFS,
     UTC_TZ,
     zoneinfo,
 )
-from aiopvpc.parser import extract_pvpc_data, get_url_prices
+from aiopvpc.parser import extract_esios_data, get_daily_urls_to_download
 from aiopvpc.prices import make_price_sensor_attributes
 from aiopvpc.pvpc_tariff import get_current_and_next_tariff_periods
 from aiopvpc.utils import ensure_utc_time
 
 _LOGGER = logging.getLogger(__name__)
 
+# TODO REMOVE THIS USER-AGENT LOGIC
 # 🙈😱 Use randomized standard User-Agent info to avoid server banning 😖🤷
 _STANDARD_USER_AGENTS = [
     (
@@ -56,6 +62,12 @@
 ]
 
 
+class BadApiTokenAuthError(Exception):
+    """Exception to signal HA that ESIOS API token is invalid (401 status)."""
+
+    pass  # noqa PIE790
+
+
 class PVPCData:
     """
     Data handler for PVPC hourly prices.
@@ -63,7 +75,7 @@ class PVPCData:
     * Async download of prices for each day
     * Generate state attributes for HA integration.
 
-    - Prices are returned in a `Dict[datetime, float]`,
+    - Prices are returned in a `dict[datetime, float]`,
     with timestamps in UTC and prices in €/kWh.
     """
 
@@ -72,92 +84,143 @@ def __init__(
         *,
         session: aiohttp.ClientSession,
         tariff: str = TARIFFS[0],
-        local_timezone: Union[str, zoneinfo.ZoneInfo] = REFERENCE_TZ,
+        local_timezone: str | zoneinfo.ZoneInfo = REFERENCE_TZ,
         power: float = DEFAULT_POWER_KW,
         power_valley: float = DEFAULT_POWER_KW,
         timeout: float = DEFAULT_TIMEOUT,
-        data_source: DataSource = "apidatos",  # "esios_public",
-    ):
-        self.source_available = True
-        self.state: Optional[float] = None
-        self.state_available = False
-        self.attributes: Dict[str, Any] = {}
-
-        self.timeout = timeout
+        data_source: DataSource = "esios_public",
+        api_token: str | None = None,
+        sensor_keys: tuple[str, ...] = (KEY_PVPC,),
+    ) -> None:
+        """Set up API access."""
+        self.states: dict[str, float | None] = {}
+        self.sensor_attributes: dict[str, dict[str, Any]] = {}
+        self._sensor_keys: set[str] = {key for key in sensor_keys if key in ALL_SENSORS}
+
+        self._timeout = timeout
         self._session = session
         self._data_source = data_source
+        self._api_token = api_token
+        if self._api_token is not None:
+            self._data_source = "esios"
+        assert (data_source != "esios") or self._api_token is not None, data_source
         self._user_agents = deque(sorted(_STANDARD_USER_AGENTS, key=lambda x: random()))
 
         self._local_timezone = zoneinfo.ZoneInfo(str(local_timezone))
+        assert tariff in TARIFFS
         self.tariff = tariff
-        if tariff not in TARIFFS:  # pragma: no cover
-            _LOGGER.error("Unknown tariff '%s'. Should be one of %s", tariff, TARIFFS)
-            self.tariff = TARIFFS[0]
 
-        self._current_prices: Dict[datetime, float] = {}
         self._power = power
         self._power_valley = power_valley
 
-    def _request_headers(self) -> Dict[str, str]:
+    @property
+    def using_private_api(self) -> bool:
+        """Check if an API token is available and data-source is ESIOS."""
+        return self._api_token is not None and self._data_source == "esios"
+
+    async def _api_get_data(self, sensor_key: str, url: str) -> EsiosResponse | None:
         headers = {
             "Accept": "application/json",
             "Content-Type": "application/json",
+            "Host": "api.esios.ree.es",
+            "User-Agent": self._user_agents[0],
         }
-        if self._data_source == "apidatos":
-            headers["Host"] = "apidatos.ree.es"
-            return headers
-        headers["Host"] = "api.esios.ree.es"
-        headers["User-Agent"] = self._user_agents[0]
-        # TODO add auth token
-        # if self._data_source == "esios":
-        return headers
-
-    async def _api_get_prices(self, url: str, tariff: str) -> Dict[datetime, Any]:
+        if self.using_private_api:
+            assert self._api_token is not None
+            headers["x-api-key"] = self._api_token
+            headers["Authorization"] = f"Token token={self._api_token}"
+
         assert self._session is not None
-        resp = await self._session.get(url, headers=self._request_headers())
+        resp = await self._session.get(url, headers=headers)
         if resp.status < 400:
             data = await resp.json()
-            return extract_pvpc_data(data, url, tariff, tz=self._local_timezone)
+            return extract_esios_data(
+                data, url, sensor_key, self.tariff, tz=self._local_timezone
+            )
+        elif resp.status == 401 and self._data_source == "esios":
+            _LOGGER.warning(
+                "[%s] Unauthorized error with '%s': %s",
+                sensor_key,
+                self._data_source,
+                url,
+            )
+            raise BadApiTokenAuthError(
+                f"[{sensor_key}] Unauthorized access with API token '{self._api_token}'"
+            )
         elif resp.status == 403:  # pragma: no cover
-            _LOGGER.warning("Forbidden error with '%s': %s", self._data_source, url)
+            _LOGGER.warning(
+                "[%s] Forbidden error with '%s': %s", sensor_key, self._data_source, url
+            )
             # loop user-agent and data-source
             self._user_agents.rotate()
-            self._data_source = (
-                "apidatos" if self._data_source == "esios_public" else "esios_public"
+        else:
+            _LOGGER.error(
+                "[%s] Unknown error [%d] with '%s': %s",
+                sensor_key,
+                resp.status,
+                self._data_source,
+                url,
             )
-        return {}
+        return None
 
-    async def _download_pvpc_prices(self, now: datetime) -> Dict[datetime, Any]:
+    async def _download_daily_data(
+        self, sensor_key: str, url: str
+    ) -> EsiosResponse | None:
         """
         PVPC data extractor.
 
-        Make GET request to 'api.esios.ree.es' and extract hourly prices for
-        the selected tariff from the JSON daily file download
-        of the official _Spain Electric Network_ (Red Eléctrica Española, REE)
-        for the _Voluntary Price for Small Consumers_
-        (Precio Voluntario para el Pequeño Consumidor, PVPC).
+        Make GET request to 'api.esios.ree.es' and extract hourly prices.
 
         Prices are referenced with datetimes in UTC.
         """
-        assert now.date() >= DATE_CHANGE_TO_20TD, "No support for old tariffs"
-        url = get_url_prices(self._data_source, self.tariff != TARIFFS[0], now)
-        tariff = TARIFF2ID[self.tariff]
         try:
-            async with async_timeout.timeout(2 * self.timeout):
-                return await self._api_get_prices(url, tariff)
-        except KeyError:
-            _LOGGER.debug("Bad try on getting prices for %s", now)
+            async with async_timeout.timeout(self._timeout):
+                return await self._api_get_data(sensor_key, url)
+        except (AttributeError, KeyError) as exc:
+            _LOGGER.debug("[%s] Bad try on getting prices (%s)", sensor_key, exc)
         except asyncio.TimeoutError:
-            if self.source_available:
-                _LOGGER.warning("Timeout error requesting data from '%s'", url)
-        except aiohttp.ClientError:
-            if self.source_available:
-                _LOGGER.warning("Client error in '%s'", url)
-        return {}
-
-    async def async_update_prices(self, now: datetime) -> Dict[datetime, float]:
+            _LOGGER.warning(
+                "[%s] Timeout error requesting data from '%s'", sensor_key, url
+            )
+        except aiohttp.ClientError as exc:
+            _LOGGER.warning("[%s] Client error in '%s' -> %s", sensor_key, url, exc)
+        except BadApiTokenAuthError:
+            raise
+        return None
+
+    async def check_api_token(
+        self, now: datetime, api_token: str | None = None
+    ) -> bool:
+        """Check if ESIOS API token is valid."""
+        local_ref_now = ensure_utc_time(now).astimezone(REFERENCE_TZ)
+        if api_token is not None:
+            self._api_token = api_token
+        self._data_source = "esios"
+        today, _ = get_daily_urls_to_download(
+            self._data_source,
+            {KEY_PVPC},
+            local_ref_now,
+            local_ref_now,
+        )
+        try:
+            prices = await self._download_daily_data(KEY_PVPC, today[0])
+        except BadApiTokenAuthError:
+            return False
+        return prices is not None
+
+    def update_active_sensors(self, data_id: str, enabled: bool):
+        """Update enabled API indicators to download."""
+        assert data_id in ALL_SENSORS
+        if enabled:
+            self._sensor_keys.add(data_id)
+        elif data_id in self._sensor_keys:
+            self._sensor_keys.remove(data_id)
+
+    async def async_update_all(
+        self, current_data: EsiosApiData | None, now: datetime
+    ) -> EsiosApiData:
         """
-        Update electricity prices from the ESIOS API.
+        Update all prices from the ESIOS API.
 
         Input `now: datetime` is assumed tz-aware in UTC.
         If not, it is converted to UTC from the original timezone,
@@ -165,84 +228,135 @@ async def async_update_prices(self, now: datetime) -> Dict[datetime, float]:
         """
         utc_now = ensure_utc_time(now)
         local_ref_now = utc_now.astimezone(REFERENCE_TZ)
-        current_num_prices = len(self._current_prices)
+        next_day = local_ref_now + timedelta(days=1)
+
+        if current_data is None:
+            current_data = EsiosApiData(
+                sensors={},
+                availability={},
+                data_source=self._data_source,
+                last_update=utc_now,
+            )
+
+        urls_now, urls_next = get_daily_urls_to_download(
+            self._data_source,
+            self._sensor_keys,
+            local_ref_now,
+            next_day,
+        )
+        updated = False
+        tasks = []
+        for url_now, url_next, sensor_key in zip(
+            urls_now, urls_next, self._sensor_keys
+        ):
+            if sensor_key not in current_data.sensors:
+                current_data.sensors[sensor_key] = {}
+
+            tasks.append(
+                self._update_prices_series(
+                    sensor_key,
+                    current_data.sensors[sensor_key],
+                    url_now,
+                    url_next,
+                    local_ref_now,
+                )
+            )
+
+        results = await asyncio.gather(*tasks)
+        for new_data, sensor_key in zip(results, self._sensor_keys):
+            if new_data:
+                updated = True
+                current_data.sensors[sensor_key] = new_data
+                current_data.availability[sensor_key] = True
+
+        if updated:
+            current_data.data_source = self._data_source
+            current_data.last_update = utc_now
+
+        for sensor_key in current_data.sensors:
+            self.process_state_and_attributes(current_data, sensor_key, now)
+        return current_data
+
+    async def _update_prices_series(
+        self,
+        sensor_key: str,
+        current_prices: dict[datetime, float],
+        url_now: str,
+        url_next: str,
+        local_ref_now: datetime,
+    ) -> dict[datetime, float] | None:
+        current_num_prices = len(current_prices)
         if local_ref_now.hour >= 20 and current_num_prices > 30:
             # already have today+tomorrow prices, avoid requests
             _LOGGER.debug(
-                "Evening download avoided, now with %d prices from %s UTC",
+                "[%s] Evening download avoided, now with %d prices from %s UTC",
+                sensor_key,
                 current_num_prices,
-                list(self._current_prices)[0].strftime("%Y-%m-%d %Hh"),
+                list(current_prices)[0].strftime("%Y-%m-%d %Hh"),
             )
-            return self._current_prices
+            return None
         elif (
             local_ref_now.hour < 20
             and current_num_prices > 20
             and (
-                list(self._current_prices)[-12].astimezone(REFERENCE_TZ).date()
+                list(current_prices)[-12].astimezone(REFERENCE_TZ).date()
                 == local_ref_now.date()
             )
         ):
             # already have today prices, avoid request
             _LOGGER.debug(
-                "Download avoided, now with %d prices up to %s UTC",
+                "[%s] Download avoided, now with %d prices up to %s UTC",
+                sensor_key,
                 current_num_prices,
-                list(self._current_prices)[-1].strftime("%Y-%m-%d %Hh"),
+                list(current_prices)[-1].strftime("%Y-%m-%d %Hh"),
             )
-            return self._current_prices
+            return None
 
         if current_num_prices and (
-            list(self._current_prices)[0].astimezone(REFERENCE_TZ).date()
+            list(current_prices)[0].astimezone(REFERENCE_TZ).date()
             == local_ref_now.date()
         ):
             # avoid download of today prices
-            prices = self._current_prices.copy()
             _LOGGER.debug(
-                "Avoided: %s, with %d prices -> last: %s, download-day: %s",
+                "[%s] Avoided: %s, with %d prices -> last: %s, download-day: %s",
+                sensor_key,
                 local_ref_now,
                 current_num_prices,
-                list(self._current_prices)[0].astimezone(REFERENCE_TZ).date(),
+                list(current_prices)[0].astimezone(REFERENCE_TZ).date(),
                 local_ref_now.date(),
             )
         else:
-            txt_last = "--"
-            if current_num_prices:
-                txt_last = str(
-                    list(self._current_prices)[-1].astimezone(self._local_timezone)
-                )
             # make API call to download today prices
-            _LOGGER.debug(
-                "UN-Avoided: %s, with %d prices ->; last:%s, download-day: %s",
-                local_ref_now,
-                current_num_prices,
-                txt_last,
-                local_ref_now.date(),
-            )
-            prices = await self._download_pvpc_prices(local_ref_now)
-            if not prices:
-                return prices
+            prices_response = await self._download_daily_data(sensor_key, url_now)
+            if prices_response is None or not prices_response.series.get(sensor_key):
+                return current_prices
+            prices = prices_response.series[sensor_key]
+            current_prices.update(prices)
 
         # At evening, it is possible to retrieve next day prices
         if local_ref_now.hour >= 20:
-            next_day = local_ref_now + timedelta(days=1)
-            prices_fut = await self._download_pvpc_prices(next_day)
-            if prices_fut:
-                prices.update(prices_fut)
+            prices_fut_response = await self._download_daily_data(sensor_key, url_next)
+            if prices_fut_response:
+                prices_fut = prices_fut_response.series[sensor_key]
+                current_prices.update(prices_fut)
 
-        self._current_prices.update(prices)
         _LOGGER.debug(
-            "Download done, now with %d prices from %s UTC",
-            len(self._current_prices),
-            list(self._current_prices)[0].strftime("%Y-%m-%d %Hh"),
+            "[%s] Download done, now with %d prices from %s UTC",
+            sensor_key,
+            len(current_prices),
+            list(current_prices)[0].strftime("%Y-%m-%d %Hh"),
         )
 
-        return prices
+        return current_prices
 
     @property
     def attribution(self) -> str:
         """Return data-source attribution string."""
         return ATTRIBUTIONS[self._data_source]
 
-    def process_state_and_attributes(self, utc_now: datetime) -> bool:
+    def process_state_and_attributes(
+        self, current_data: EsiosApiData, sensor_key: str, utc_now: datetime
+    ) -> bool:
         """
         Generate the current state and sensor attributes.
 
@@ -253,47 +367,51 @@ def process_state_and_attributes(self, utc_now: datetime) -> bool:
         If not, it is converted to UTC from the original timezone,
         or set as UTC-time if it is a naive datetime.
         """
-        attributes: Dict[str, Any] = {
-            "attribution": self.attribution,
-            "tariff": self.tariff,
+        attributes: dict[str, Any] = {
+            "sensor_id": sensor_key,
+            "data_id": SENSOR_KEY_TO_DATAID[sensor_key],
         }
         utc_time = ensure_utc_time(utc_now.replace(minute=0, second=0, microsecond=0))
         actual_time = utc_time.astimezone(self._local_timezone)
-        # todo power_period/power_price €/kW*año
-        if len(self._current_prices) > 25 and actual_time.hour < 20:
+        current_prices = current_data.sensors.get(sensor_key, {})
+        if len(current_prices) > 25 and actual_time.hour < 20:
             # there are 'today' and 'next day' prices, but 'today' has expired
             max_age = (
                 utc_time.astimezone(REFERENCE_TZ).replace(hour=0).astimezone(UTC_TZ)
             )
-            self._current_prices = {
+            current_data.sensors[sensor_key] = {
                 key_ts: price
-                for key_ts, price in self._current_prices.items()
+                for key_ts, price in current_prices.items()
                 if key_ts >= max_age
             }
 
         # set current price
         try:
-            self.state = self._current_prices[utc_time]
-            self.state_available = True
+            self.states[sensor_key] = current_data.sensors[sensor_key][utc_time]
+            current_data.availability[sensor_key] = True
         except KeyError:
-            self.state_available = False
-            self.attributes = attributes
+            self.states[sensor_key] = None
+            current_data.availability[sensor_key] = False
+            self.sensor_attributes[sensor_key] = attributes
             return False
 
-        # generate PVPC 2.0TD sensor attributes
-        local_time = utc_time.astimezone(self._local_timezone)
-        (current_period, next_period, delta,) = get_current_and_next_tariff_periods(
-            local_time, zone_ceuta_melilla=self.tariff != TARIFFS[0]
-        )
-        attributes["period"] = current_period
-        power = self._power_valley if current_period == "P3" else self._power
-        attributes["available_power"] = int(1000 * power)
-        attributes["next_period"] = next_period
-        attributes["hours_to_next_period"] = int(delta.total_seconds()) // 3600
-
         # generate price attributes
         price_attrs = make_price_sensor_attributes(
-            self._current_prices, utc_time, self._local_timezone
+            sensor_key, current_data.sensors[sensor_key], utc_time, self._local_timezone
         )
-        self.attributes = {**attributes, **price_attrs}
+
+        # generate PVPC 2.0TD sensor attributes
+        if sensor_key == KEY_PVPC:
+            local_time = utc_time.astimezone(self._local_timezone)
+            (current_period, next_period, delta,) = get_current_and_next_tariff_periods(
+                local_time, zone_ceuta_melilla=self.tariff != TARIFFS[0]
+            )
+            attributes["tariff"] = self.tariff
+            attributes["period"] = current_period
+            power = self._power_valley if current_period == "P3" else self._power
+            attributes["available_power"] = int(1000 * power)
+            attributes["next_period"] = next_period
+            attributes["hours_to_next_period"] = int(delta.total_seconds()) // 3600
+
+        self.sensor_attributes[sensor_key] = {**attributes, **price_attrs}
         return True
diff --git a/aiopvpc/pvpc_tariff.py b/aiopvpc/pvpc_tariff.py
index 740f6cf..206e00c 100644
--- a/aiopvpc/pvpc_tariff.py
+++ b/aiopvpc/pvpc_tariff.py
@@ -83,9 +83,9 @@ def _tariff_period_key(local_ts: datetime, zone_ceuta_melilla: bool) -> str:
     national_holiday = day in _NATIONAL_EXTRA_HOLIDAYS_FOR_P3_PERIOD[day.year]
     if national_holiday or day.isoweekday() >= 6 or local_ts.hour < 8:
         return "P3"
-    elif zone_ceuta_melilla and local_ts.hour in _HOURS_P2_CYM:
+    if zone_ceuta_melilla and local_ts.hour in _HOURS_P2_CYM:
         return "P2"
-    elif not zone_ceuta_melilla and local_ts.hour in _HOURS_P2:
+    if not zone_ceuta_melilla and local_ts.hour in _HOURS_P2:
         return "P2"
     return "P1"
 
diff --git a/aiopvpc/utils.py b/aiopvpc/utils.py
index b15d526..33ef66c 100644
--- a/aiopvpc/utils.py
+++ b/aiopvpc/utils.py
@@ -1,3 +1,4 @@
+"""ESIOS API handler for HomeAssistant. Utils."""
 from datetime import datetime
 
 from aiopvpc.const import UTC_TZ
diff --git a/poetry.lock b/poetry.lock
index ae8fbc6..d26b3ac 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -170,36 +170,6 @@ files = [
 docs = ["jaraco.packaging (>=8.2)", "rst.linker (>=1.9)", "sphinx"]
 testing = ["pytest", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.0.1)", "pytest-flake8", "pytest-mypy"]
 
-[[package]]
-name = "black"
-version = "21.12b0"
-description = "The uncompromising code formatter."
-category = "dev"
-optional = false
-python-versions = ">=3.6.2"
-files = [
-    {file = "black-21.12b0-py3-none-any.whl", hash = "sha256:a615e69ae185e08fdd73e4715e260e2479c861b5740057fde6e8b4e3b7dd589f"},
-    {file = "black-21.12b0.tar.gz", hash = "sha256:77b80f693a569e2e527958459634f18df9b0ba2625ba4e0c2d5da5be42e6f2b3"},
-]
-
-[package.dependencies]
-click = ">=7.1.2"
-mypy-extensions = ">=0.4.3"
-pathspec = ">=0.9.0,<1"
-platformdirs = ">=2"
-tomli = ">=0.2.6,<2.0.0"
-typing-extensions = [
-    {version = ">=3.10.0.0", markers = "python_version < \"3.10\""},
-    {version = ">=3.10.0.0,<3.10.0.1 || >3.10.0.1", markers = "python_version >= \"3.10\""},
-]
-
-[package.extras]
-colorama = ["colorama (>=0.4.3)"]
-d = ["aiohttp (>=3.7.4)"]
-jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
-python2 = ["typed-ast (>=1.4.3)"]
-uvloop = ["uvloop (>=0.15.2)"]
-
 [[package]]
 name = "cfgv"
 version = "3.3.1"
@@ -227,21 +197,6 @@ files = [
 [package.extras]
 unicode-backport = ["unicodedata2"]
 
-[[package]]
-name = "click"
-version = "8.0.3"
-description = "Composable command line interface toolkit"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"},
-    {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"},
-]
-
-[package.dependencies]
-colorama = {version = "*", markers = "platform_system == \"Windows\""}
-
 [[package]]
 name = "colorama"
 version = "0.4.4"
@@ -345,195 +300,6 @@ files = [
 docs = ["furo (>=2021.8.17b43)", "sphinx (>=4.1)", "sphinx-autodoc-typehints (>=1.12)"]
 testing = ["covdefaults (>=1.2.0)", "coverage (>=4)", "pytest (>=4)", "pytest-cov", "pytest-timeout (>=1.4.2)"]
 
-[[package]]
-name = "flake8"
-version = "4.0.1"
-description = "the modular source code checker: pep8 pyflakes and co"
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"},
-    {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"},
-]
-
-[package.dependencies]
-mccabe = ">=0.6.0,<0.7.0"
-pycodestyle = ">=2.8.0,<2.9.0"
-pyflakes = ">=2.4.0,<2.5.0"
-
-[[package]]
-name = "flake8-broken-line"
-version = "0.4.0"
-description = "Flake8 plugin to forbid backslashes for line breaks"
-category = "dev"
-optional = false
-python-versions = ">=3.6,<4.0"
-files = [
-    {file = "flake8-broken-line-0.4.0.tar.gz", hash = "sha256:771aab5aa0997666796fed249d0e48e6c01cdfeca8c95521eea28a38b7ced4c7"},
-    {file = "flake8_broken_line-0.4.0-py3-none-any.whl", hash = "sha256:e9c522856862239a2c7ef2c1de0276fa598572aa864bd4e9c7efc2a827538515"},
-]
-
-[package.dependencies]
-flake8 = ">=3.5,<5"
-
-[[package]]
-name = "flake8-bugbear"
-version = "21.11.29"
-description = "A plugin for flake8 finding likely bugs and design problems in your program. Contains warnings that don't belong in pyflakes and pycodestyle."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "flake8-bugbear-21.11.29.tar.gz", hash = "sha256:8b04cb2fafc6a78e1a9d873bd3988e4282f7959bb6b0d7c1ae648ec09b937a7b"},
-    {file = "flake8_bugbear-21.11.29-py36.py37.py38-none-any.whl", hash = "sha256:179e41ddae5de5e3c20d1f61736feeb234e70958fbb56ab3c28a67739c8e9a82"},
-]
-
-[package.dependencies]
-attrs = ">=19.2.0"
-flake8 = ">=3.0.0"
-
-[package.extras]
-dev = ["coverage", "hypothesis", "hypothesmith (>=0.2)", "pre-commit"]
-
-[[package]]
-name = "flake8-builtins"
-version = "1.5.3"
-description = "Check for python builtins being used as variables or parameters."
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "flake8-builtins-1.5.3.tar.gz", hash = "sha256:09998853b2405e98e61d2ff3027c47033adbdc17f9fe44ca58443d876eb00f3b"},
-    {file = "flake8_builtins-1.5.3-py2.py3-none-any.whl", hash = "sha256:7706babee43879320376861897e5d1468e396a40b8918ed7bccf70e5f90b8687"},
-]
-
-[package.dependencies]
-flake8 = "*"
-
-[package.extras]
-test = ["coverage", "coveralls", "mock", "pytest", "pytest-cov"]
-
-[[package]]
-name = "flake8-comprehensions"
-version = "3.7.0"
-description = "A flake8 plugin to help you write better list/set/dict comprehensions."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "flake8-comprehensions-3.7.0.tar.gz", hash = "sha256:6b3218b2dde8ac5959c6476cde8f41a79e823c22feb656be2710cd2a3232cef9"},
-    {file = "flake8_comprehensions-3.7.0-py3-none-any.whl", hash = "sha256:a5d7aea6315bbbd6fbcb2b4e80bff6a54d1600155e26236e555d0c6fe1d62522"},
-]
-
-[package.dependencies]
-flake8 = ">=3.0,<3.2.0 || >3.2.0,<5"
-
-[[package]]
-name = "flake8-import-order"
-version = "0.18.1"
-description = "Flake8 and pylama plugin that checks the ordering of import statements."
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "flake8-import-order-0.18.1.tar.gz", hash = "sha256:a28dc39545ea4606c1ac3c24e9d05c849c6e5444a50fb7e9cdd430fc94de6e92"},
-    {file = "flake8_import_order-0.18.1-py2.py3-none-any.whl", hash = "sha256:90a80e46886259b9c396b578d75c749801a41ee969a235e163cfe1be7afd2543"},
-]
-
-[package.dependencies]
-pycodestyle = "*"
-setuptools = "*"
-
-[[package]]
-name = "flake8-mutable"
-version = "1.2.0"
-description = "mutable defaults flake8 extension"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "flake8-mutable-1.2.0.tar.gz", hash = "sha256:ee9b77111b867d845177bbc289d87d541445ffcc6029a0c5c65865b42b18c6a6"},
-    {file = "flake8_mutable-1.2.0-py2-none-any.whl", hash = "sha256:38fd9dadcbcda6550a916197bc40ed76908119dabb37fbcca30873666c31d2d5"},
-]
-
-[package.dependencies]
-flake8 = "*"
-
-[[package]]
-name = "flake8-pie"
-version = "0.15.0"
-description = "A flake8 extension that implements misc. lints"
-category = "dev"
-optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "flake8-pie-0.15.0.tar.gz", hash = "sha256:a2d1e67a374d925f688300e9d0e202d1827a0d91e0a11114f712beee639bdc7c"},
-    {file = "flake8_pie-0.15.0-py3-none-any.whl", hash = "sha256:47fd9d232b419f8db7a6465dee95cc24b385b1b8bdfd62b65250d70eaa06fc89"},
-]
-
-[package.dependencies]
-typing_extensions = "*"
-
-[[package]]
-name = "flake8-polyfill"
-version = "1.0.2"
-description = "Polyfill package for Flake8 plugins"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "flake8-polyfill-1.0.2.tar.gz", hash = "sha256:e44b087597f6da52ec6393a709e7108b2905317d0c0b744cdca6208e670d8eda"},
-    {file = "flake8_polyfill-1.0.2-py2.py3-none-any.whl", hash = "sha256:12be6a34ee3ab795b19ca73505e7b55826d5f6ad7230d31b18e106400169b9e9"},
-]
-
-[package.dependencies]
-flake8 = "*"
-
-[[package]]
-name = "flake8-quotes"
-version = "3.3.1"
-description = "Flake8 lint for quotes."
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "flake8-quotes-3.3.1.tar.gz", hash = "sha256:633adca6fb8a08131536af0d750b44d6985b9aba46f498871e21588c3e6f525a"},
-]
-
-[package.dependencies]
-flake8 = "*"
-
-[[package]]
-name = "flake8-string-format"
-version = "0.3.0"
-description = "string format checker, plugin for flake8"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "flake8-string-format-0.3.0.tar.gz", hash = "sha256:65f3da786a1461ef77fca3780b314edb2853c377f2e35069723348c8917deaa2"},
-    {file = "flake8_string_format-0.3.0-py2.py3-none-any.whl", hash = "sha256:812ff431f10576a74c89be4e85b8e075a705be39bc40c4b4278b5b13e2afa9af"},
-]
-
-[package.dependencies]
-flake8 = "*"
-
-[[package]]
-name = "flake8-tidy-imports"
-version = "4.5.0"
-description = "A flake8 plugin that helps you write tidier imports."
-category = "dev"
-optional = false
-python-versions = ">=3.6"
-files = [
-    {file = "flake8-tidy-imports-4.5.0.tar.gz", hash = "sha256:ac637961d0f319012d099e49619f8c928e3221f74e00fe6eb89513bc64c40adb"},
-    {file = "flake8_tidy_imports-4.5.0-py3-none-any.whl", hash = "sha256:87eed94ae6a2fda6a5918d109746feadf1311e0eb8274ab7a7920f6db00a41c9"},
-]
-
-[package.dependencies]
-flake8 = ">=3.8.0,<5"
-
 [[package]]
 name = "frozenlist"
 version = "1.2.0"
@@ -655,18 +421,6 @@ files = [
     {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"},
 ]
 
-[[package]]
-name = "mccabe"
-version = "0.6.1"
-description = "McCabe checker, plugin for flake8"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"},
-    {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"},
-]
-
 [[package]]
 name = "multidict"
 version = "5.2.0"
@@ -749,60 +503,6 @@ files = [
     {file = "multidict-5.2.0.tar.gz", hash = "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce"},
 ]
 
-[[package]]
-name = "mypy"
-version = "0.910"
-description = "Optional static typing for Python"
-category = "dev"
-optional = false
-python-versions = ">=3.5"
-files = [
-    {file = "mypy-0.910-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:a155d80ea6cee511a3694b108c4494a39f42de11ee4e61e72bc424c490e46457"},
-    {file = "mypy-0.910-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:b94e4b785e304a04ea0828759172a15add27088520dc7e49ceade7834275bedb"},
-    {file = "mypy-0.910-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:088cd9c7904b4ad80bec811053272986611b84221835e079be5bcad029e79dd9"},
-    {file = "mypy-0.910-cp35-cp35m-win_amd64.whl", hash = "sha256:adaeee09bfde366d2c13fe6093a7df5df83c9a2ba98638c7d76b010694db760e"},
-    {file = "mypy-0.910-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ecd2c3fe726758037234c93df7e98deb257fd15c24c9180dacf1ef829da5f921"},
-    {file = "mypy-0.910-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:d9dd839eb0dc1bbe866a288ba3c1afc33a202015d2ad83b31e875b5905a079b6"},
-    {file = "mypy-0.910-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:3e382b29f8e0ccf19a2df2b29a167591245df90c0b5a2542249873b5c1d78212"},
-    {file = "mypy-0.910-cp36-cp36m-win_amd64.whl", hash = "sha256:53fd2eb27a8ee2892614370896956af2ff61254c275aaee4c230ae771cadd885"},
-    {file = "mypy-0.910-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b6fb13123aeef4a3abbcfd7e71773ff3ff1526a7d3dc538f3929a49b42be03f0"},
-    {file = "mypy-0.910-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e4dab234478e3bd3ce83bac4193b2ecd9cf94e720ddd95ce69840273bf44f6de"},
-    {file = "mypy-0.910-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:7df1ead20c81371ccd6091fa3e2878559b5c4d4caadaf1a484cf88d93ca06703"},
-    {file = "mypy-0.910-cp37-cp37m-win_amd64.whl", hash = "sha256:0aadfb2d3935988ec3815952e44058a3100499f5be5b28c34ac9d79f002a4a9a"},
-    {file = "mypy-0.910-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ec4e0cd079db280b6bdabdc807047ff3e199f334050db5cbb91ba3e959a67504"},
-    {file = "mypy-0.910-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:119bed3832d961f3a880787bf621634ba042cb8dc850a7429f643508eeac97b9"},
-    {file = "mypy-0.910-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:866c41f28cee548475f146aa4d39a51cf3b6a84246969f3759cb3e9c742fc072"},
-    {file = "mypy-0.910-cp38-cp38-win_amd64.whl", hash = "sha256:ceb6e0a6e27fb364fb3853389607cf7eb3a126ad335790fa1e14ed02fba50811"},
-    {file = "mypy-0.910-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:1a85e280d4d217150ce8cb1a6dddffd14e753a4e0c3cf90baabb32cefa41b59e"},
-    {file = "mypy-0.910-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:42c266ced41b65ed40a282c575705325fa7991af370036d3f134518336636f5b"},
-    {file = "mypy-0.910-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:3c4b8ca36877fc75339253721f69603a9c7fdb5d4d5a95a1a1b899d8b86a4de2"},
-    {file = "mypy-0.910-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:c0df2d30ed496a08de5daed2a9ea807d07c21ae0ab23acf541ab88c24b26ab97"},
-    {file = "mypy-0.910-cp39-cp39-win_amd64.whl", hash = "sha256:c6c2602dffb74867498f86e6129fd52a2770c48b7cd3ece77ada4fa38f94eba8"},
-    {file = "mypy-0.910-py3-none-any.whl", hash = "sha256:ef565033fa5a958e62796867b1df10c40263ea9ded87164d67572834e57a174d"},
-    {file = "mypy-0.910.tar.gz", hash = "sha256:704098302473cb31a218f1775a873b376b30b4c18229421e9e9dc8916fd16150"},
-]
-
-[package.dependencies]
-mypy-extensions = ">=0.4.3,<0.5.0"
-toml = "*"
-typing-extensions = ">=3.7.4"
-
-[package.extras]
-dmypy = ["psutil (>=4.0)"]
-python2 = ["typed-ast (>=1.4.0,<1.5.0)"]
-
-[[package]]
-name = "mypy-extensions"
-version = "0.4.3"
-description = "Experimental type system extensions for programs checked with the mypy typechecker."
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"},
-    {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"},
-]
-
 [[package]]
 name = "nodeenv"
 version = "1.6.0"
@@ -830,34 +530,6 @@ files = [
 [package.dependencies]
 pyparsing = ">=2.0.2,<3.0.5 || >3.0.5"
 
-[[package]]
-name = "pathspec"
-version = "0.9.0"
-description = "Utility library for gitignore style pattern matching of file paths."
-category = "dev"
-optional = false
-python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7"
-files = [
-    {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"},
-    {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"},
-]
-
-[[package]]
-name = "pep8-naming"
-version = "0.12.1"
-description = "Check PEP-8 naming conventions, plugin for flake8"
-category = "dev"
-optional = false
-python-versions = "*"
-files = [
-    {file = "pep8-naming-0.12.1.tar.gz", hash = "sha256:bb2455947757d162aa4cad55dba4ce029005cd1692f2899a21d51d8630ca7841"},
-    {file = "pep8_naming-0.12.1-py2.py3-none-any.whl", hash = "sha256:4a8daeaeb33cfcde779309fc0c9c0a68a3bbe2ad8a8308b763c5068f86eb9f37"},
-]
-
-[package.dependencies]
-flake8 = ">=3.9.1"
-flake8-polyfill = ">=1.0.2,<2"
-
 [[package]]
 name = "platformdirs"
 version = "2.4.0"
@@ -922,30 +594,6 @@ files = [
     {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"},
 ]
 
-[[package]]
-name = "pycodestyle"
-version = "2.8.0"
-description = "Python style guide checker"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
-files = [
-    {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"},
-    {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"},
-]
-
-[[package]]
-name = "pyflakes"
-version = "2.4.0"
-description = "passive checker of Python programs"
-category = "dev"
-optional = false
-python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*"
-files = [
-    {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"},
-    {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"},
-]
-
 [[package]]
 name = "pyparsing"
 version = "3.0.6"
@@ -1054,6 +702,21 @@ files = [
 [package.dependencies]
 pytest = ">=5.0.0"
 
+[[package]]
+name = "python-dotenv"
+version = "0.21.0"
+description = "Read key-value pairs from a .env file and set them as environment variables"
+category = "dev"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "python-dotenv-0.21.0.tar.gz", hash = "sha256:b77d08274639e3d34145dfa6c7008e66df0f04b7be7a75fd0d5292c191d79045"},
+    {file = "python_dotenv-0.21.0-py3-none-any.whl", hash = "sha256:1684eb44636dd462b66c3ee016599815514527ad99965de77f43e0944634a7e5"},
+]
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
 [[package]]
 name = "pyyaml"
 version = "6.0"
@@ -1104,23 +767,6 @@ files = [
     {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
 ]
 
-[[package]]
-name = "setuptools"
-version = "65.6.3"
-description = "Easily download, build, install, upgrade, and uninstall Python packages"
-category = "dev"
-optional = false
-python-versions = ">=3.7"
-files = [
-    {file = "setuptools-65.6.3-py3-none-any.whl", hash = "sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54"},
-    {file = "setuptools-65.6.3.tar.gz", hash = "sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75"},
-]
-
-[package.extras]
-docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"]
-testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"]
-testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"]
-
 [[package]]
 name = "six"
 version = "1.16.0"
@@ -1292,4 +938,4 @@ multidict = ">=4.0"
 [metadata]
 lock-version = "2.0"
 python-versions = ">=3.9,<3.12"
-content-hash = "25d40db3a9ae8dbb8b2725cccd9ae2bbadabc678fcc1e66b860579c1d87c903d"
+content-hash = "ad2350dffb5950fcea99c853c89dc6a164d6aa6f35a3973460aaee40aa695eb2"
diff --git a/pyproject.toml b/pyproject.toml
index 31d329c..7179d0a 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -40,7 +40,7 @@ markers = [
 
 [tool.poetry]
 name = "aiopvpc"
-version = "3.1.0"
+version = "4.0.0"
 description = "Retrieval of Spanish Electricity hourly prices (PVPC)"
 authors = ["Eugenio Panadero <eugenio.panadero@gmail.com>"]
 license = "MIT"
@@ -59,20 +59,7 @@ pytest-cov = ">=2.8.1"
 pytest-timeout = ">=1.3.3"
 pytest-asyncio = ">=0.15.1"
 pre-commit = ">=2.2.0"
-black = ">=19.10b0"
-flake8 = ">=3.7.9"
-flake8-broken-line = ">=0.1.1"
-flake8-bugbear = ">=20.1.0"
-flake8-builtins = ">=1.4.2"
-flake8-comprehensions = ">=3.1.4"
-flake8-import-order = ">=0.18.1"
-flake8-mutable = ">=1.2.0"
-flake8-pie = ">=0.4.2"
-flake8-quotes = ">=2.1.1"
-flake8-string-format = ">=0.2.3"
-flake8-tidy-imports = ">=3.1.0"
-pep8-naming = ">=0.9.1"
-mypy = ">=0.800"
+python-dotenv = ">=0.21.0"
 
 [build-system]
 requires = ["poetry_core>=1.0.0"]


Test patch:
diff --git a/tests/api_examples/PRICES_APIDATOS_2021_06_01.json b/tests/api_examples/PRICES_APIDATOS_2021_06_01.json
deleted file mode 100644
index efe173b..0000000
--- a/tests/api_examples/PRICES_APIDATOS_2021_06_01.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
-  "data": {
-    "type": "Precios mercado peninsular en tiempo real",
-    "id": "mer13",
-    "attributes": {
-      "title": "Precios mercado peninsular en tiempo real",
-      "last-update": "2021-05-31T20:19:18.000+02:00",
-      "description": null
-    },
-    "meta": {
-      "cache-control": {
-        "cache": "MISS"
-      }
-    }
-  },
-  "included": [
-    {
-      "type": "PVPC (\u20ac\/MWh)",
-      "id": "1001",
-      "groupId": null,
-      "attributes": {
-        "title": "PVPC (\u20ac\/MWh)",
-        "description": null,
-        "color": "#ffcf09",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-05-31T20:19:18.000+02:00",
-        "values": [
-          {
-            "value": 116.33,
-            "percentage": 0.5651751445367537,
-            "datetime": "2021-06-01T00:00:00.000+02:00"
-          },
-          {
-            "value": 115.95,
-            "percentage": 0.5682152308144663,
-            "datetime": "2021-06-01T01:00:00.000+02:00"
-          },
-          {
-            "value": 114.89,
-            "percentage": 0.5699191428146237,
-            "datetime": "2021-06-01T02:00:00.000+02:00"
-          },
-          {
-            "value": 114.96,
-            "percentage": 0.5699271230975163,
-            "datetime": "2021-06-01T03:00:00.000+02:00"
-          },
-          {
-            "value": 114.84,
-            "percentage": 0.5698124441798154,
-            "datetime": "2021-06-01T04:00:00.000+02:00"
-          },
-          {
-            "value": 116.03,
-            "percentage": 0.5686908787923345,
-            "datetime": "2021-06-01T05:00:00.000+02:00"
-          },
-          {
-            "value": 116.29,
-            "percentage": 0.5650906263666845,
-            "datetime": "2021-06-01T06:00:00.000+02:00"
-          },
-          {
-            "value": 115.7,
-            "percentage": 0.559477756286267,
-            "datetime": "2021-06-01T07:00:00.000+02:00"
-          },
-          {
-            "value": 152.89,
-            "percentage": 0.6234555315418179,
-            "datetime": "2021-06-01T08:00:00.000+02:00"
-          },
-          {
-            "value": 150.83,
-            "percentage": 0.6213900218349606,
-            "datetime": "2021-06-01T09:00:00.000+02:00"
-          },
-          {
-            "value": 242.62,
-            "percentage": 0.7283261287223823,
-            "datetime": "2021-06-01T10:00:00.000+02:00"
-          },
-          {
-            "value": 240.5,
-            "percentage": 0.7316924761933737,
-            "datetime": "2021-06-01T11:00:00.000+02:00"
-          },
-          {
-            "value": 238.09,
-            "percentage": 0.734868360134572,
-            "datetime": "2021-06-01T12:00:00.000+02:00"
-          },
-          {
-            "value": 235.3,
-            "percentage": 0.7386363636363636,
-            "datetime": "2021-06-01T13:00:00.000+02:00"
-          },
-          {
-            "value": 137.96,
-            "percentage": 0.6353504651376992,
-            "datetime": "2021-06-01T14:00:00.000+02:00"
-          },
-          {
-            "value": 132.88,
-            "percentage": 0.6406943105110897,
-            "datetime": "2021-06-01T15:00:00.000+02:00"
-          },
-          {
-            "value": 131.93,
-            "percentage": 0.6403436392758336,
-            "datetime": "2021-06-01T16:00:00.000+02:00"
-          },
-          {
-            "value": 135.99,
-            "percentage": 0.6354672897196262,
-            "datetime": "2021-06-01T17:00:00.000+02:00"
-          },
-          {
-            "value": 231.44,
-            "percentage": 0.7437256981265464,
-            "datetime": "2021-06-01T18:00:00.000+02:00"
-          },
-          {
-            "value": 240.4,
-            "percentage": 0.7349434423723632,
-            "datetime": "2021-06-01T19:00:00.000+02:00"
-          },
-          {
-            "value": 246.2,
-            "percentage": 0.7314319667260842,
-            "datetime": "2021-06-01T20:00:00.000+02:00"
-          },
-          {
-            "value": 248.08,
-            "percentage": 0.7283189478010687,
-            "datetime": "2021-06-01T21:00:00.000+02:00"
-          },
-          {
-            "value": 155.91,
-            "percentage": 0.627935075919288,
-            "datetime": "2021-06-01T22:00:00.000+02:00"
-          },
-          {
-            "value": 156.5,
-            "percentage": 0.6309975002015967,
-            "datetime": "2021-06-01T23:00:00.000+02:00"
-          }
-        ]
-      }
-    },
-    {
-      "type": "Spot market price (\u20ac\/MWh)",
-      "id": "600",
-      "groupId": null,
-      "attributes": {
-        "title": "Spot market price (\u20ac\/MWh)",
-        "description": null,
-        "color": "#df4a32",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-05-31T13:39:43.000+02:00",
-        "values": [
-          {
-            "value": 89.5,
-            "percentage": 0.4348248554632464,
-            "datetime": "2021-06-01T00:00:00.000+02:00"
-          },
-          {
-            "value": 88.11,
-            "percentage": 0.43178476918553366,
-            "datetime": "2021-06-01T01:00:00.000+02:00"
-          },
-          {
-            "value": 86.7,
-            "percentage": 0.43008085718537625,
-            "datetime": "2021-06-01T02:00:00.000+02:00"
-          },
-          {
-            "value": 86.75,
-            "percentage": 0.4300728769024838,
-            "datetime": "2021-06-01T03:00:00.000+02:00"
-          },
-          {
-            "value": 86.7,
-            "percentage": 0.43018755582018453,
-            "datetime": "2021-06-01T04:00:00.000+02:00"
-          },
-          {
-            "value": 88,
-            "percentage": 0.4313091212076655,
-            "datetime": "2021-06-01T05:00:00.000+02:00"
-          },
-          {
-            "value": 89.5,
-            "percentage": 0.4349093736333155,
-            "datetime": "2021-06-01T06:00:00.000+02:00"
-          },
-          {
-            "value": 91.1,
-            "percentage": 0.440522243713733,
-            "datetime": "2021-06-01T07:00:00.000+02:00"
-          },
-          {
-            "value": 92.34,
-            "percentage": 0.3765444684581821,
-            "datetime": "2021-06-01T08:00:00.000+02:00"
-          },
-          {
-            "value": 91.9,
-            "percentage": 0.37860997816503933,
-            "datetime": "2021-06-01T09:00:00.000+02:00"
-          },
-          {
-            "value": 90.5,
-            "percentage": 0.27167387127761766,
-            "datetime": "2021-06-01T10:00:00.000+02:00"
-          },
-          {
-            "value": 88.19,
-            "percentage": 0.2683075238066263,
-            "datetime": "2021-06-01T11:00:00.000+02:00"
-          },
-          {
-            "value": 85.9,
-            "percentage": 0.265131639865428,
-            "datetime": "2021-06-01T12:00:00.000+02:00"
-          },
-          {
-            "value": 83.26,
-            "percentage": 0.26136363636363635,
-            "datetime": "2021-06-01T13:00:00.000+02:00"
-          },
-          {
-            "value": 79.18,
-            "percentage": 0.36464953486230084,
-            "datetime": "2021-06-01T14:00:00.000+02:00"
-          },
-          {
-            "value": 74.52,
-            "percentage": 0.35930568948891034,
-            "datetime": "2021-06-01T15:00:00.000+02:00"
-          },
-          {
-            "value": 74.1,
-            "percentage": 0.35965636072416635,
-            "datetime": "2021-06-01T16:00:00.000+02:00"
-          },
-          {
-            "value": 78.01,
-            "percentage": 0.3645327102803739,
-            "datetime": "2021-06-01T17:00:00.000+02:00"
-          },
-          {
-            "value": 79.75,
-            "percentage": 0.2562743018734535,
-            "datetime": "2021-06-01T18:00:00.000+02:00"
-          },
-          {
-            "value": 86.7,
-            "percentage": 0.2650565576276368,
-            "datetime": "2021-06-01T19:00:00.000+02:00"
-          },
-          {
-            "value": 90.4,
-            "percentage": 0.26856803327391565,
-            "datetime": "2021-06-01T20:00:00.000+02:00"
-          },
-          {
-            "value": 92.54,
-            "percentage": 0.27168105219893135,
-            "datetime": "2021-06-01T21:00:00.000+02:00"
-          },
-          {
-            "value": 92.38,
-            "percentage": 0.37206492408071207,
-            "datetime": "2021-06-01T22:00:00.000+02:00"
-          },
-          {
-            "value": 91.52,
-            "percentage": 0.3690024997984034,
-            "datetime": "2021-06-01T23:00:00.000+02:00"
-          }
-        ]
-      }
-    }
-  ]
-}
diff --git a/tests/api_examples/PRICES_APIDATOS_2021_06_01_CYM.json b/tests/api_examples/PRICES_APIDATOS_2021_06_01_CYM.json
deleted file mode 100644
index 3dff746..0000000
--- a/tests/api_examples/PRICES_APIDATOS_2021_06_01_CYM.json
+++ /dev/null
@@ -1,154 +0,0 @@
-{
-  "data": {
-    "type": "Precios mercado peninsular en tiempo real",
-    "id": "mer13",
-    "attributes": {
-      "title": "Precios mercado peninsular en tiempo real",
-      "last-update": "2021-05-31T20:19:18.000+02:00",
-      "description": null
-    },
-    "meta": {
-      "cache-control": {
-        "cache": "MISS"
-      }
-    }
-  },
-  "included": [
-    {
-      "type": "PVPC (\u20ac\/MWh)",
-      "id": "1001",
-      "groupId": null,
-      "attributes": {
-        "title": "PVPC (\u20ac\/MWh)",
-        "description": null,
-        "color": "#ffcf09",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-05-31T20:19:18.000+02:00",
-        "values": [
-          {
-            "value": 116.33,
-            "percentage": 1,
-            "datetime": "2021-06-01T00:00:00.000+02:00"
-          },
-          {
-            "value": 115.95,
-            "percentage": 1,
-            "datetime": "2021-06-01T01:00:00.000+02:00"
-          },
-          {
-            "value": 114.89,
-            "percentage": 1,
-            "datetime": "2021-06-01T02:00:00.000+02:00"
-          },
-          {
-            "value": 114.96,
-            "percentage": 1,
-            "datetime": "2021-06-01T03:00:00.000+02:00"
-          },
-          {
-            "value": 114.84,
-            "percentage": 1,
-            "datetime": "2021-06-01T04:00:00.000+02:00"
-          },
-          {
-            "value": 116.03,
-            "percentage": 1,
-            "datetime": "2021-06-01T05:00:00.000+02:00"
-          },
-          {
-            "value": 116.29,
-            "percentage": 1,
-            "datetime": "2021-06-01T06:00:00.000+02:00"
-          },
-          {
-            "value": 115.7,
-            "percentage": 1,
-            "datetime": "2021-06-01T07:00:00.000+02:00"
-          },
-          {
-            "value": 152.89,
-            "percentage": 1,
-            "datetime": "2021-06-01T08:00:00.000+02:00"
-          },
-          {
-            "value": 150.83,
-            "percentage": 1,
-            "datetime": "2021-06-01T09:00:00.000+02:00"
-          },
-          {
-            "value": 149.28,
-            "percentage": 1,
-            "datetime": "2021-06-01T10:00:00.000+02:00"
-          },
-          {
-            "value": 240.5,
-            "percentage": 1,
-            "datetime": "2021-06-01T11:00:00.000+02:00"
-          },
-          {
-            "value": 238.09,
-            "percentage": 1,
-            "datetime": "2021-06-01T12:00:00.000+02:00"
-          },
-          {
-            "value": 235.3,
-            "percentage": 1,
-            "datetime": "2021-06-01T13:00:00.000+02:00"
-          },
-          {
-            "value": 231.28,
-            "percentage": 1,
-            "datetime": "2021-06-01T14:00:00.000+02:00"
-          },
-          {
-            "value": 132.88,
-            "percentage": 1,
-            "datetime": "2021-06-01T15:00:00.000+02:00"
-          },
-          {
-            "value": 131.93,
-            "percentage": 1,
-            "datetime": "2021-06-01T16:00:00.000+02:00"
-          },
-          {
-            "value": 135.99,
-            "percentage": 1,
-            "datetime": "2021-06-01T17:00:00.000+02:00"
-          },
-          {
-            "value": 138.13,
-            "percentage": 1,
-            "datetime": "2021-06-01T18:00:00.000+02:00"
-          },
-          {
-            "value": 240.4,
-            "percentage": 1,
-            "datetime": "2021-06-01T19:00:00.000+02:00"
-          },
-          {
-            "value": 246.2,
-            "percentage": 1,
-            "datetime": "2021-06-01T20:00:00.000+02:00"
-          },
-          {
-            "value": 248.08,
-            "percentage": 1,
-            "datetime": "2021-06-01T21:00:00.000+02:00"
-          },
-          {
-            "value": 249.41,
-            "percentage": 1,
-            "datetime": "2021-06-01T22:00:00.000+02:00"
-          },
-          {
-            "value": 156.5,
-            "percentage": 1,
-            "datetime": "2021-06-01T23:00:00.000+02:00"
-          }
-        ]
-      }
-    }
-  ]
-}
diff --git a/tests/api_examples/PRICES_APIDATOS_2021_10_30.json b/tests/api_examples/PRICES_APIDATOS_2021_10_30.json
deleted file mode 100644
index beb20a1..0000000
--- a/tests/api_examples/PRICES_APIDATOS_2021_10_30.json
+++ /dev/null
@@ -1,290 +0,0 @@
-{
-  "data": {
-    "type": "Precios mercado peninsular en tiempo real",
-    "id": "mer13",
-    "attributes": {
-      "title": "Precios mercado peninsular en tiempo real",
-      "last-update": "2021-10-29T20:17:00.000+02:00",
-      "description": null
-    },
-    "meta": {
-      "cache-control": {
-        "cache": "MISS"
-      }
-    }
-  },
-  "included": [
-    {
-      "type": "PVPC (\u20ac\/MWh)",
-      "id": "1001",
-      "groupId": null,
-      "attributes": {
-        "title": "PVPC (\u20ac\/MWh)",
-        "description": null,
-        "color": "#ffcf09",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-10-29T20:17:00.000+02:00",
-        "values": [
-          {
-            "value": 131.04,
-            "percentage": 0.567174515235457,
-            "datetime": "2021-10-30T00:00:00.000+02:00"
-          },
-          {
-            "value": 120.55,
-            "percentage": 0.5722491218076521,
-            "datetime": "2021-10-30T01:00:00.000+02:00"
-          },
-          {
-            "value": 103.97,
-            "percentage": 0.5794137316094516,
-            "datetime": "2021-10-30T02:00:00.000+02:00"
-          },
-          {
-            "value": 92.51,
-            "percentage": 0.5911937627811861,
-            "datetime": "2021-10-30T03:00:00.000+02:00"
-          },
-          {
-            "value": 87.43,
-            "percentage": 0.5979346190671592,
-            "datetime": "2021-10-30T04:00:00.000+02:00"
-          },
-          {
-            "value": 90.89,
-            "percentage": 0.5981966565749638,
-            "datetime": "2021-10-30T05:00:00.000+02:00"
-          },
-          {
-            "value": 108.38,
-            "percentage": 0.5835038225476472,
-            "datetime": "2021-10-30T06:00:00.000+02:00"
-          },
-          {
-            "value": 125.68,
-            "percentage": 0.5772021677229724,
-            "datetime": "2021-10-30T07:00:00.000+02:00"
-          },
-          {
-            "value": 153.16,
-            "percentage": 0.5655625715446254,
-            "datetime": "2021-10-30T08:00:00.000+02:00"
-          },
-          {
-            "value": 184.85,
-            "percentage": 0.552219633148115,
-            "datetime": "2021-10-30T09:00:00.000+02:00"
-          },
-          {
-            "value": 188.57,
-            "percentage": 0.5485194019431032,
-            "datetime": "2021-10-30T10:00:00.000+02:00"
-          },
-          {
-            "value": 180.09,
-            "percentage": 0.5484195139777087,
-            "datetime": "2021-10-30T11:00:00.000+02:00"
-          },
-          {
-            "value": 176.28,
-            "percentage": 0.5486973573629658,
-            "datetime": "2021-10-30T12:00:00.000+02:00"
-          },
-          {
-            "value": 160.96,
-            "percentage": 0.5534124118961664,
-            "datetime": "2021-10-30T13:00:00.000+02:00"
-          },
-          {
-            "value": 149.34,
-            "percentage": 0.5544664736021385,
-            "datetime": "2021-10-30T14:00:00.000+02:00"
-          },
-          {
-            "value": 134.81,
-            "percentage": 0.5603774369206468,
-            "datetime": "2021-10-30T15:00:00.000+02:00"
-          },
-          {
-            "value": 164.28,
-            "percentage": 0.5517565661315241,
-            "datetime": "2021-10-30T16:00:00.000+02:00"
-          },
-          {
-            "value": 189.68,
-            "percentage": 0.5489378943103548,
-            "datetime": "2021-10-30T17:00:00.000+02:00"
-          },
-          {
-            "value": 206.4,
-            "percentage": 0.5513998717674717,
-            "datetime": "2021-10-30T18:00:00.000+02:00"
-          },
-          {
-            "value": 227.5,
-            "percentage": 0.5499021053394889,
-            "datetime": "2021-10-30T19:00:00.000+02:00"
-          },
-          {
-            "value": 233.31,
-            "percentage": 0.5484743053270017,
-            "datetime": "2021-10-30T20:00:00.000+02:00"
-          },
-          {
-            "value": 218.7,
-            "percentage": 0.5505903678155132,
-            "datetime": "2021-10-30T21:00:00.000+02:00"
-          },
-          {
-            "value": 189.1,
-            "percentage": 0.5552782263984731,
-            "datetime": "2021-10-30T22:00:00.000+02:00"
-          },
-          {
-            "value": 168.7,
-            "percentage": 0.5597955933103265,
-            "datetime": "2021-10-30T23:00:00.000+02:00"
-          }
-        ]
-      }
-    },
-    {
-      "type": "Precio mercado spot (\u20ac\/MWh)",
-      "id": "600",
-      "groupId": null,
-      "attributes": {
-        "title": "Precio mercado spot (\u20ac\/MWh)",
-        "description": null,
-        "color": "#df4a32",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-10-29T13:42:01.000+02:00",
-        "values": [
-          {
-            "value": 100,
-            "percentage": 0.43282548476454297,
-            "datetime": "2021-10-30T00:00:00.000+02:00"
-          },
-          {
-            "value": 90.11,
-            "percentage": 0.42775087819234786,
-            "datetime": "2021-10-30T01:00:00.000+02:00"
-          },
-          {
-            "value": 75.47,
-            "percentage": 0.42058626839054836,
-            "datetime": "2021-10-30T02:00:00.000+02:00"
-          },
-          {
-            "value": 63.97,
-            "percentage": 0.4088062372188139,
-            "datetime": "2021-10-30T03:00:00.000+02:00"
-          },
-          {
-            "value": 58.79,
-            "percentage": 0.40206538093284094,
-            "datetime": "2021-10-30T04:00:00.000+02:00"
-          },
-          {
-            "value": 61.05,
-            "percentage": 0.4018033434250362,
-            "datetime": "2021-10-30T05:00:00.000+02:00"
-          },
-          {
-            "value": 77.36,
-            "percentage": 0.41649617745235273,
-            "datetime": "2021-10-30T06:00:00.000+02:00"
-          },
-          {
-            "value": 92.06,
-            "percentage": 0.42279783227702766,
-            "datetime": "2021-10-30T07:00:00.000+02:00"
-          },
-          {
-            "value": 117.65,
-            "percentage": 0.43443742845537464,
-            "datetime": "2021-10-30T08:00:00.000+02:00"
-          },
-          {
-            "value": 149.89,
-            "percentage": 0.447780366851885,
-            "datetime": "2021-10-30T09:00:00.000+02:00"
-          },
-          {
-            "value": 155.21,
-            "percentage": 0.4514805980568969,
-            "datetime": "2021-10-30T10:00:00.000+02:00"
-          },
-          {
-            "value": 148.29,
-            "percentage": 0.4515804860222912,
-            "datetime": "2021-10-30T11:00:00.000+02:00"
-          },
-          {
-            "value": 144.99,
-            "percentage": 0.45130264263703435,
-            "datetime": "2021-10-30T12:00:00.000+02:00"
-          },
-          {
-            "value": 129.89,
-            "percentage": 0.44658758810383353,
-            "datetime": "2021-10-30T13:00:00.000+02:00"
-          },
-          {
-            "value": 120,
-            "percentage": 0.44553352639786137,
-            "datetime": "2021-10-30T14:00:00.000+02:00"
-          },
-          {
-            "value": 105.76,
-            "percentage": 0.4396225630793532,
-            "datetime": "2021-10-30T15:00:00.000+02:00"
-          },
-          {
-            "value": 133.46,
-            "percentage": 0.44824343386847587,
-            "datetime": "2021-10-30T16:00:00.000+02:00"
-          },
-          {
-            "value": 155.86,
-            "percentage": 0.4510621056896452,
-            "datetime": "2021-10-30T17:00:00.000+02:00"
-          },
-          {
-            "value": 167.92,
-            "percentage": 0.4486001282325283,
-            "datetime": "2021-10-30T18:00:00.000+02:00"
-          },
-          {
-            "value": 186.21,
-            "percentage": 0.450097894660511,
-            "datetime": "2021-10-30T19:00:00.000+02:00"
-          },
-          {
-            "value": 192.07,
-            "percentage": 0.45152569467299825,
-            "datetime": "2021-10-30T20:00:00.000+02:00"
-          },
-          {
-            "value": 178.51,
-            "percentage": 0.4494096321844868,
-            "datetime": "2021-10-30T21:00:00.000+02:00"
-          },
-          {
-            "value": 151.45,
-            "percentage": 0.444721773601527,
-            "datetime": "2021-10-30T22:00:00.000+02:00"
-          },
-          {
-            "value": 132.66,
-            "percentage": 0.4402044066896734,
-            "datetime": "2021-10-30T23:00:00.000+02:00"
-          }
-        ]
-      }
-    }
-  ]
-}
diff --git a/tests/api_examples/PRICES_APIDATOS_2021_10_31.json b/tests/api_examples/PRICES_APIDATOS_2021_10_31.json
deleted file mode 100644
index 3e8300a..0000000
--- a/tests/api_examples/PRICES_APIDATOS_2021_10_31.json
+++ /dev/null
@@ -1,300 +0,0 @@
-{
-  "data": {
-    "type": "Precios mercado peninsular en tiempo real",
-    "id": "mer13",
-    "attributes": {
-      "title": "Precios mercado peninsular en tiempo real",
-      "last-update": "2021-10-30T20:16:46.000+02:00",
-      "description": null
-    },
-    "meta": {
-      "cache-control": {
-        "cache": "MISS"
-      }
-    }
-  },
-  "included": [
-    {
-      "type": "PVPC (\u20ac\/MWh)",
-      "id": "1001",
-      "groupId": null,
-      "attributes": {
-        "title": "PVPC (\u20ac\/MWh)",
-        "description": null,
-        "color": "#ffcf09",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-10-30T20:16:46.000+02:00",
-        "values": [
-          {
-            "value": 171.48,
-            "percentage": 0.5604654203163812,
-            "datetime": "2021-10-31T00:00:00.000+02:00"
-          },
-          {
-            "value": 123.9,
-            "percentage": 0.5842135043379857,
-            "datetime": "2021-10-31T01:00:00.000+02:00"
-          },
-          {
-            "value": 109.55,
-            "percentage": 0.5943145445668095,
-            "datetime": "2021-10-31T02:00:00.000+02:00"
-          },
-          {
-            "value": 104.85,
-            "percentage": 0.6018252783836529,
-            "datetime": "2021-10-31T02:00:00.000+01:00"
-          },
-          {
-            "value": 92.03,
-            "percentage": 0.6170712082606947,
-            "datetime": "2021-10-31T03:00:00.000+01:00"
-          },
-          {
-            "value": 92.99,
-            "percentage": 0.6166445623342174,
-            "datetime": "2021-10-31T04:00:00.000+01:00"
-          },
-          {
-            "value": 86.87,
-            "percentage": 0.6213432515556827,
-            "datetime": "2021-10-31T05:00:00.000+01:00"
-          },
-          {
-            "value": 86.2,
-            "percentage": 0.6163746871648195,
-            "datetime": "2021-10-31T06:00:00.000+01:00"
-          },
-          {
-            "value": 88.03,
-            "percentage": 0.6111921127542873,
-            "datetime": "2021-10-31T07:00:00.000+01:00"
-          },
-          {
-            "value": 81.82,
-            "percentage": 0.6078300274868138,
-            "datetime": "2021-10-31T08:00:00.000+01:00"
-          },
-          {
-            "value": 102.63,
-            "percentage": 0.5886772972352874,
-            "datetime": "2021-10-31T09:00:00.000+01:00"
-          },
-          {
-            "value": 91.09,
-            "percentage": 0.5836109687339827,
-            "datetime": "2021-10-31T10:00:00.000+01:00"
-          },
-          {
-            "value": 91.1,
-            "percentage": 0.5839369271200564,
-            "datetime": "2021-10-31T11:00:00.000+01:00"
-          },
-          {
-            "value": 86.49,
-            "percentage": 0.5838002024974689,
-            "datetime": "2021-10-31T12:00:00.000+01:00"
-          },
-          {
-            "value": 79.78,
-            "percentage": 0.5870493009565857,
-            "datetime": "2021-10-31T13:00:00.000+01:00"
-          },
-          {
-            "value": 80.8,
-            "percentage": 0.5899963490324936,
-            "datetime": "2021-10-31T14:00:00.000+01:00"
-          },
-          {
-            "value": 81.34,
-            "percentage": 0.5965967434355288,
-            "datetime": "2021-10-31T15:00:00.000+01:00"
-          },
-          {
-            "value": 92.09,
-            "percentage": 0.5888107416879795,
-            "datetime": "2021-10-31T16:00:00.000+01:00"
-          },
-          {
-            "value": 111.3,
-            "percentage": 0.5766839378238342,
-            "datetime": "2021-10-31T17:00:00.000+01:00"
-          },
-          {
-            "value": 122.85,
-            "percentage": 0.571927374301676,
-            "datetime": "2021-10-31T18:00:00.000+01:00"
-          },
-          {
-            "value": 131.87,
-            "percentage": 0.5686257599931007,
-            "datetime": "2021-10-31T19:00:00.000+01:00"
-          },
-          {
-            "value": 185.38,
-            "percentage": 0.5560621512988182,
-            "datetime": "2021-10-31T20:00:00.000+01:00"
-          },
-          {
-            "value": 165.54,
-            "percentage": 0.5591811917308472,
-            "datetime": "2021-10-31T21:00:00.000+01:00"
-          },
-          {
-            "value": 152.39,
-            "percentage": 0.5639270251267438,
-            "datetime": "2021-10-31T22:00:00.000+01:00"
-          },
-          {
-            "value": 146.12,
-            "percentage": 0.564126322291715,
-            "datetime": "2021-10-31T23:00:00.000+01:00"
-          }
-        ]
-      }
-    },
-    {
-      "type": "Precio mercado spot (\u20ac\/MWh)",
-      "id": "600",
-      "groupId": null,
-      "attributes": {
-        "title": "Precio mercado spot (\u20ac\/MWh)",
-        "description": null,
-        "color": "#df4a32",
-        "type": null,
-        "magnitude": "price",
-        "composite": false,
-        "last-update": "2021-10-30T13:39:58.000+02:00",
-        "values": [
-          {
-            "value": 134.48,
-            "percentage": 0.43953457968361875,
-            "datetime": "2021-10-31T00:00:00.000+02:00"
-          },
-          {
-            "value": 88.18,
-            "percentage": 0.41578649566201437,
-            "datetime": "2021-10-31T01:00:00.000+02:00"
-          },
-          {
-            "value": 74.78,
-            "percentage": 0.4056854554331905,
-            "datetime": "2021-10-31T02:00:00.000+02:00"
-          },
-          {
-            "value": 69.37,
-            "percentage": 0.39817472161634715,
-            "datetime": "2021-10-31T02:00:00.000+01:00"
-          },
-          {
-            "value": 57.11,
-            "percentage": 0.3829287917393054,
-            "datetime": "2021-10-31T03:00:00.000+01:00"
-          },
-          {
-            "value": 57.81,
-            "percentage": 0.3833554376657825,
-            "datetime": "2021-10-31T04:00:00.000+01:00"
-          },
-          {
-            "value": 52.94,
-            "percentage": 0.3786567484443173,
-            "datetime": "2021-10-31T05:00:00.000+01:00"
-          },
-          {
-            "value": 53.65,
-            "percentage": 0.38362531283518053,
-            "datetime": "2021-10-31T06:00:00.000+01:00"
-          },
-          {
-            "value": 56,
-            "percentage": 0.3888078872457127,
-            "datetime": "2021-10-31T07:00:00.000+01:00"
-          },
-          {
-            "value": 52.79,
-            "percentage": 0.3921699725131863,
-            "datetime": "2021-10-31T08:00:00.000+01:00"
-          },
-          {
-            "value": 71.71,
-            "percentage": 0.41132270276471267,
-            "datetime": "2021-10-31T09:00:00.000+01:00"
-          },
-          {
-            "value": 64.99,
-            "percentage": 0.41638903126601745,
-            "datetime": "2021-10-31T10:00:00.000+01:00"
-          },
-          {
-            "value": 64.91,
-            "percentage": 0.4160630728799436,
-            "datetime": "2021-10-31T11:00:00.000+01:00"
-          },
-          {
-            "value": 61.66,
-            "percentage": 0.4161997975025313,
-            "datetime": "2021-10-31T12:00:00.000+01:00"
-          },
-          {
-            "value": 56.12,
-            "percentage": 0.41295069904341425,
-            "datetime": "2021-10-31T13:00:00.000+01:00"
-          },
-          {
-            "value": 56.15,
-            "percentage": 0.4100036509675064,
-            "datetime": "2021-10-31T14:00:00.000+01:00"
-          },
-          {
-            "value": 55,
-            "percentage": 0.4034032565644712,
-            "datetime": "2021-10-31T15:00:00.000+01:00"
-          },
-          {
-            "value": 64.31,
-            "percentage": 0.41118925831202047,
-            "datetime": "2021-10-31T16:00:00.000+01:00"
-          },
-          {
-            "value": 81.7,
-            "percentage": 0.4233160621761658,
-            "datetime": "2021-10-31T17:00:00.000+01:00"
-          },
-          {
-            "value": 91.95,
-            "percentage": 0.428072625698324,
-            "datetime": "2021-10-31T18:00:00.000+01:00"
-          },
-          {
-            "value": 100.04,
-            "percentage": 0.4313742400068992,
-            "datetime": "2021-10-31T19:00:00.000+01:00"
-          },
-          {
-            "value": 148,
-            "percentage": 0.44393784870118186,
-            "datetime": "2021-10-31T20:00:00.000+01:00"
-          },
-          {
-            "value": 130.5,
-            "percentage": 0.4408188082691529,
-            "datetime": "2021-10-31T21:00:00.000+01:00"
-          },
-          {
-            "value": 117.84,
-            "percentage": 0.4360729748732561,
-            "datetime": "2021-10-31T22:00:00.000+01:00"
-          },
-          {
-            "value": 112.9,
-            "percentage": 0.4358736777082851,
-            "datetime": "2021-10-31T23:00:00.000+01:00"
-          }
-        ]
-      }
-    }
-  ]
-}
diff --git a/tests/api_examples/PRICES_ESIOS_1001_2021_06_01.json b/tests/api_examples/PRICES_ESIOS_1001_2021_06_01.json
new file mode 100644
index 0000000..30be824
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1001_2021_06_01.json
@@ -0,0 +1,1007 @@
+{
+  "indicator": {
+    "name": "Término de facturación de energía activa del PVPC 2.0TD",
+    "short_name": "PVPC T. 2.0TD",
+    "id": 1001,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": true,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ],
+    "values_updated_at": "2021-05-31T20:19:18.000+02:00",
+    "values": [
+      {
+        "value": 116.33,
+        "datetime": "2021-06-01T00:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T22:00:00Z",
+        "tz_time": "2021-05-31T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 116.33,
+        "datetime": "2021-06-01T00:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T22:00:00Z",
+        "tz_time": "2021-05-31T22:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 116.33,
+        "datetime": "2021-06-01T00:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T22:00:00Z",
+        "tz_time": "2021-05-31T22:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 116.33,
+        "datetime": "2021-06-01T00:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T22:00:00Z",
+        "tz_time": "2021-05-31T22:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 116.33,
+        "datetime": "2021-06-01T00:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T22:00:00Z",
+        "tz_time": "2021-05-31T22:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 115.95,
+        "datetime": "2021-06-01T01:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T23:00:00Z",
+        "tz_time": "2021-05-31T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 115.95,
+        "datetime": "2021-06-01T01:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T23:00:00Z",
+        "tz_time": "2021-05-31T23:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 115.95,
+        "datetime": "2021-06-01T01:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T23:00:00Z",
+        "tz_time": "2021-05-31T23:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 115.95,
+        "datetime": "2021-06-01T01:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T23:00:00Z",
+        "tz_time": "2021-05-31T23:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 115.95,
+        "datetime": "2021-06-01T01:00:00.000+02:00",
+        "datetime_utc": "2021-05-31T23:00:00Z",
+        "tz_time": "2021-05-31T23:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 114.89,
+        "datetime": "2021-06-01T02:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T00:00:00Z",
+        "tz_time": "2021-06-01T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 114.89,
+        "datetime": "2021-06-01T02:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T00:00:00Z",
+        "tz_time": "2021-06-01T00:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 114.89,
+        "datetime": "2021-06-01T02:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T00:00:00Z",
+        "tz_time": "2021-06-01T00:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 114.89,
+        "datetime": "2021-06-01T02:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T00:00:00Z",
+        "tz_time": "2021-06-01T00:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 114.89,
+        "datetime": "2021-06-01T02:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T00:00:00Z",
+        "tz_time": "2021-06-01T00:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 114.96,
+        "datetime": "2021-06-01T03:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T01:00:00Z",
+        "tz_time": "2021-06-01T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 114.96,
+        "datetime": "2021-06-01T03:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T01:00:00Z",
+        "tz_time": "2021-06-01T01:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 114.96,
+        "datetime": "2021-06-01T03:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T01:00:00Z",
+        "tz_time": "2021-06-01T01:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 114.96,
+        "datetime": "2021-06-01T03:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T01:00:00Z",
+        "tz_time": "2021-06-01T01:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 114.96,
+        "datetime": "2021-06-01T03:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T01:00:00Z",
+        "tz_time": "2021-06-01T01:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 114.84,
+        "datetime": "2021-06-01T04:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T02:00:00Z",
+        "tz_time": "2021-06-01T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 114.84,
+        "datetime": "2021-06-01T04:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T02:00:00Z",
+        "tz_time": "2021-06-01T02:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 114.84,
+        "datetime": "2021-06-01T04:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T02:00:00Z",
+        "tz_time": "2021-06-01T02:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 114.84,
+        "datetime": "2021-06-01T04:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T02:00:00Z",
+        "tz_time": "2021-06-01T02:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 114.84,
+        "datetime": "2021-06-01T04:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T02:00:00Z",
+        "tz_time": "2021-06-01T02:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 116.03,
+        "datetime": "2021-06-01T05:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T03:00:00Z",
+        "tz_time": "2021-06-01T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 116.03,
+        "datetime": "2021-06-01T05:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T03:00:00Z",
+        "tz_time": "2021-06-01T03:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 116.03,
+        "datetime": "2021-06-01T05:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T03:00:00Z",
+        "tz_time": "2021-06-01T03:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 116.03,
+        "datetime": "2021-06-01T05:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T03:00:00Z",
+        "tz_time": "2021-06-01T03:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 116.03,
+        "datetime": "2021-06-01T05:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T03:00:00Z",
+        "tz_time": "2021-06-01T03:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 116.29,
+        "datetime": "2021-06-01T06:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T04:00:00Z",
+        "tz_time": "2021-06-01T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 116.29,
+        "datetime": "2021-06-01T06:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T04:00:00Z",
+        "tz_time": "2021-06-01T04:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 116.29,
+        "datetime": "2021-06-01T06:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T04:00:00Z",
+        "tz_time": "2021-06-01T04:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 116.29,
+        "datetime": "2021-06-01T06:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T04:00:00Z",
+        "tz_time": "2021-06-01T04:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 116.29,
+        "datetime": "2021-06-01T06:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T04:00:00Z",
+        "tz_time": "2021-06-01T04:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 115.7,
+        "datetime": "2021-06-01T07:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T05:00:00Z",
+        "tz_time": "2021-06-01T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 115.7,
+        "datetime": "2021-06-01T07:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T05:00:00Z",
+        "tz_time": "2021-06-01T05:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 115.7,
+        "datetime": "2021-06-01T07:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T05:00:00Z",
+        "tz_time": "2021-06-01T05:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 115.7,
+        "datetime": "2021-06-01T07:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T05:00:00Z",
+        "tz_time": "2021-06-01T05:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 115.7,
+        "datetime": "2021-06-01T07:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T05:00:00Z",
+        "tz_time": "2021-06-01T05:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 152.89,
+        "datetime": "2021-06-01T08:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T06:00:00Z",
+        "tz_time": "2021-06-01T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 152.89,
+        "datetime": "2021-06-01T08:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T06:00:00Z",
+        "tz_time": "2021-06-01T06:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 152.89,
+        "datetime": "2021-06-01T08:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T06:00:00Z",
+        "tz_time": "2021-06-01T06:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 152.89,
+        "datetime": "2021-06-01T08:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T06:00:00Z",
+        "tz_time": "2021-06-01T06:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 152.89,
+        "datetime": "2021-06-01T08:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T06:00:00Z",
+        "tz_time": "2021-06-01T06:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 150.83,
+        "datetime": "2021-06-01T09:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T07:00:00Z",
+        "tz_time": "2021-06-01T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 150.83,
+        "datetime": "2021-06-01T09:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T07:00:00Z",
+        "tz_time": "2021-06-01T07:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 150.83,
+        "datetime": "2021-06-01T09:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T07:00:00Z",
+        "tz_time": "2021-06-01T07:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 150.83,
+        "datetime": "2021-06-01T09:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T07:00:00Z",
+        "tz_time": "2021-06-01T07:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 150.83,
+        "datetime": "2021-06-01T09:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T07:00:00Z",
+        "tz_time": "2021-06-01T07:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 242.62,
+        "datetime": "2021-06-01T10:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T08:00:00Z",
+        "tz_time": "2021-06-01T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 242.62,
+        "datetime": "2021-06-01T10:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T08:00:00Z",
+        "tz_time": "2021-06-01T08:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 242.62,
+        "datetime": "2021-06-01T10:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T08:00:00Z",
+        "tz_time": "2021-06-01T08:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 149.28,
+        "datetime": "2021-06-01T10:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T08:00:00Z",
+        "tz_time": "2021-06-01T08:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 149.28,
+        "datetime": "2021-06-01T10:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T08:00:00Z",
+        "tz_time": "2021-06-01T08:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 240.5,
+        "datetime": "2021-06-01T11:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T09:00:00Z",
+        "tz_time": "2021-06-01T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 240.5,
+        "datetime": "2021-06-01T11:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T09:00:00Z",
+        "tz_time": "2021-06-01T09:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 240.5,
+        "datetime": "2021-06-01T11:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T09:00:00Z",
+        "tz_time": "2021-06-01T09:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 240.5,
+        "datetime": "2021-06-01T11:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T09:00:00Z",
+        "tz_time": "2021-06-01T09:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 240.5,
+        "datetime": "2021-06-01T11:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T09:00:00Z",
+        "tz_time": "2021-06-01T09:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 238.09,
+        "datetime": "2021-06-01T12:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T10:00:00Z",
+        "tz_time": "2021-06-01T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 238.09,
+        "datetime": "2021-06-01T12:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T10:00:00Z",
+        "tz_time": "2021-06-01T10:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 238.09,
+        "datetime": "2021-06-01T12:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T10:00:00Z",
+        "tz_time": "2021-06-01T10:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 238.09,
+        "datetime": "2021-06-01T12:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T10:00:00Z",
+        "tz_time": "2021-06-01T10:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 238.09,
+        "datetime": "2021-06-01T12:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T10:00:00Z",
+        "tz_time": "2021-06-01T10:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 235.3,
+        "datetime": "2021-06-01T13:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T11:00:00Z",
+        "tz_time": "2021-06-01T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 235.3,
+        "datetime": "2021-06-01T13:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T11:00:00Z",
+        "tz_time": "2021-06-01T11:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 235.3,
+        "datetime": "2021-06-01T13:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T11:00:00Z",
+        "tz_time": "2021-06-01T11:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 235.3,
+        "datetime": "2021-06-01T13:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T11:00:00Z",
+        "tz_time": "2021-06-01T11:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 235.3,
+        "datetime": "2021-06-01T13:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T11:00:00Z",
+        "tz_time": "2021-06-01T11:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 137.96,
+        "datetime": "2021-06-01T14:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T12:00:00Z",
+        "tz_time": "2021-06-01T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 137.96,
+        "datetime": "2021-06-01T14:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T12:00:00Z",
+        "tz_time": "2021-06-01T12:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 137.96,
+        "datetime": "2021-06-01T14:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T12:00:00Z",
+        "tz_time": "2021-06-01T12:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 231.28,
+        "datetime": "2021-06-01T14:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T12:00:00Z",
+        "tz_time": "2021-06-01T12:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 231.28,
+        "datetime": "2021-06-01T14:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T12:00:00Z",
+        "tz_time": "2021-06-01T12:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 132.88,
+        "datetime": "2021-06-01T15:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T13:00:00Z",
+        "tz_time": "2021-06-01T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 132.88,
+        "datetime": "2021-06-01T15:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T13:00:00Z",
+        "tz_time": "2021-06-01T13:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 132.88,
+        "datetime": "2021-06-01T15:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T13:00:00Z",
+        "tz_time": "2021-06-01T13:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 132.88,
+        "datetime": "2021-06-01T15:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T13:00:00Z",
+        "tz_time": "2021-06-01T13:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 132.88,
+        "datetime": "2021-06-01T15:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T13:00:00Z",
+        "tz_time": "2021-06-01T13:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 131.93,
+        "datetime": "2021-06-01T16:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T14:00:00Z",
+        "tz_time": "2021-06-01T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 131.93,
+        "datetime": "2021-06-01T16:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T14:00:00Z",
+        "tz_time": "2021-06-01T14:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 131.93,
+        "datetime": "2021-06-01T16:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T14:00:00Z",
+        "tz_time": "2021-06-01T14:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 131.93,
+        "datetime": "2021-06-01T16:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T14:00:00Z",
+        "tz_time": "2021-06-01T14:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 131.93,
+        "datetime": "2021-06-01T16:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T14:00:00Z",
+        "tz_time": "2021-06-01T14:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 135.99,
+        "datetime": "2021-06-01T17:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T15:00:00Z",
+        "tz_time": "2021-06-01T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 135.99,
+        "datetime": "2021-06-01T17:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T15:00:00Z",
+        "tz_time": "2021-06-01T15:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 135.99,
+        "datetime": "2021-06-01T17:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T15:00:00Z",
+        "tz_time": "2021-06-01T15:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 135.99,
+        "datetime": "2021-06-01T17:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T15:00:00Z",
+        "tz_time": "2021-06-01T15:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 135.99,
+        "datetime": "2021-06-01T17:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T15:00:00Z",
+        "tz_time": "2021-06-01T15:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 231.44,
+        "datetime": "2021-06-01T18:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T16:00:00Z",
+        "tz_time": "2021-06-01T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 231.44,
+        "datetime": "2021-06-01T18:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T16:00:00Z",
+        "tz_time": "2021-06-01T16:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 231.44,
+        "datetime": "2021-06-01T18:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T16:00:00Z",
+        "tz_time": "2021-06-01T16:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 138.13,
+        "datetime": "2021-06-01T18:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T16:00:00Z",
+        "tz_time": "2021-06-01T16:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 138.13,
+        "datetime": "2021-06-01T18:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T16:00:00Z",
+        "tz_time": "2021-06-01T16:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 240.4,
+        "datetime": "2021-06-01T19:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T17:00:00Z",
+        "tz_time": "2021-06-01T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 240.4,
+        "datetime": "2021-06-01T19:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T17:00:00Z",
+        "tz_time": "2021-06-01T17:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 240.4,
+        "datetime": "2021-06-01T19:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T17:00:00Z",
+        "tz_time": "2021-06-01T17:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 240.4,
+        "datetime": "2021-06-01T19:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T17:00:00Z",
+        "tz_time": "2021-06-01T17:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 240.4,
+        "datetime": "2021-06-01T19:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T17:00:00Z",
+        "tz_time": "2021-06-01T17:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 246.2,
+        "datetime": "2021-06-01T20:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T18:00:00Z",
+        "tz_time": "2021-06-01T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 246.2,
+        "datetime": "2021-06-01T20:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T18:00:00Z",
+        "tz_time": "2021-06-01T18:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 246.2,
+        "datetime": "2021-06-01T20:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T18:00:00Z",
+        "tz_time": "2021-06-01T18:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 246.2,
+        "datetime": "2021-06-01T20:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T18:00:00Z",
+        "tz_time": "2021-06-01T18:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 246.2,
+        "datetime": "2021-06-01T20:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T18:00:00Z",
+        "tz_time": "2021-06-01T18:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 248.08,
+        "datetime": "2021-06-01T21:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T19:00:00Z",
+        "tz_time": "2021-06-01T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 248.08,
+        "datetime": "2021-06-01T21:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T19:00:00Z",
+        "tz_time": "2021-06-01T19:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 248.08,
+        "datetime": "2021-06-01T21:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T19:00:00Z",
+        "tz_time": "2021-06-01T19:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 248.08,
+        "datetime": "2021-06-01T21:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T19:00:00Z",
+        "tz_time": "2021-06-01T19:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 248.08,
+        "datetime": "2021-06-01T21:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T19:00:00Z",
+        "tz_time": "2021-06-01T19:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 155.91,
+        "datetime": "2021-06-01T22:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T20:00:00Z",
+        "tz_time": "2021-06-01T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 155.91,
+        "datetime": "2021-06-01T22:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T20:00:00Z",
+        "tz_time": "2021-06-01T20:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 155.91,
+        "datetime": "2021-06-01T22:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T20:00:00Z",
+        "tz_time": "2021-06-01T20:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 249.41,
+        "datetime": "2021-06-01T22:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T20:00:00Z",
+        "tz_time": "2021-06-01T20:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 249.41,
+        "datetime": "2021-06-01T22:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T20:00:00Z",
+        "tz_time": "2021-06-01T20:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 156.5,
+        "datetime": "2021-06-01T23:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T21:00:00Z",
+        "tz_time": "2021-06-01T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 156.5,
+        "datetime": "2021-06-01T23:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T21:00:00Z",
+        "tz_time": "2021-06-01T21:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 156.5,
+        "datetime": "2021-06-01T23:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T21:00:00Z",
+        "tz_time": "2021-06-01T21:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 156.5,
+        "datetime": "2021-06-01T23:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T21:00:00Z",
+        "tz_time": "2021-06-01T21:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 156.5,
+        "datetime": "2021-06-01T23:00:00.000+02:00",
+        "datetime_utc": "2021-06-01T21:00:00Z",
+        "tz_time": "2021-06-01T21:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1001_2021_10_30.json b/tests/api_examples/PRICES_ESIOS_1001_2021_10_30.json
new file mode 100644
index 0000000..4f77a03
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1001_2021_10_30.json
@@ -0,0 +1,1007 @@
+{
+  "indicator": {
+    "name": "Término de facturación de energía activa del PVPC 2.0TD",
+    "short_name": "PVPC T. 2.0TD",
+    "id": 1001,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": true,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ],
+    "values_updated_at": "2021-10-29T20:17:00.000+02:00",
+    "values": [
+      {
+        "value": 131.04,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 131.04,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 131.04,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 131.04,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 131.04,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 120.55,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 120.55,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 120.55,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 120.55,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 120.55,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 103.97,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 103.97,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 103.97,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 103.97,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 103.97,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 92.51,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 92.51,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 92.51,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 92.51,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 92.51,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 87.43,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 87.43,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 87.43,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 87.43,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 87.43,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 90.89,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 90.89,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 90.89,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 90.89,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 90.89,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 108.38,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 108.38,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 108.38,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 108.38,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 108.38,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 125.68,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 125.68,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 125.68,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 125.68,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 125.68,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 153.16,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 153.16,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 153.16,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 153.16,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 153.16,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 184.85,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 184.85,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 184.85,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 184.85,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 184.85,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 188.57,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 188.57,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 188.57,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 188.57,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 188.57,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 180.09,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 180.09,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 180.09,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 180.09,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 180.09,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 176.28,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 176.28,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 176.28,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 176.28,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 176.28,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 160.96,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 160.96,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 160.96,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 160.96,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 160.96,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 149.34,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 149.34,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 149.34,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 149.34,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 149.34,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 134.81,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 134.81,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 134.81,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 134.81,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 134.81,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 164.28,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 164.28,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 164.28,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 164.28,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 164.28,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 189.68,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 189.68,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 189.68,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 189.68,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 189.68,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 206.4,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 206.4,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 206.4,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 206.4,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 206.4,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 227.5,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 227.5,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 227.5,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 227.5,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 227.5,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 233.31,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 233.31,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 233.31,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 233.31,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 233.31,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 218.7,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 218.7,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 218.7,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 218.7,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 218.7,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 189.1,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 189.1,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 189.1,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 189.1,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 189.1,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 168.7,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 168.7,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 168.7,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 168.7,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 168.7,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1001_2021_10_31.json b/tests/api_examples/PRICES_ESIOS_1001_2021_10_31.json
new file mode 100644
index 0000000..b5f6f09
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1001_2021_10_31.json
@@ -0,0 +1,1047 @@
+{
+  "indicator": {
+    "name": "Término de facturación de energía activa del PVPC 2.0TD",
+    "short_name": "PVPC T. 2.0TD",
+    "id": 1001,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": true,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ],
+    "values_updated_at": "2021-10-30T20:16:46.000+02:00",
+    "values": [
+      {
+        "value": 171.48,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 171.48,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 171.48,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 171.48,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 171.48,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 123.9,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 123.9,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 123.9,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 123.9,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 123.9,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 109.55,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 109.55,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 109.55,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 109.55,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 109.55,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 104.85,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 104.85,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 104.85,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 104.85,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 104.85,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 92.03,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 92.03,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 92.03,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 92.03,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 92.03,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 92.99,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 92.99,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 92.99,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 92.99,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 92.99,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 86.87,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 86.87,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 86.87,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 86.87,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 86.87,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 86.2,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 86.2,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 86.2,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 86.2,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 86.2,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 88.03,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 88.03,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 88.03,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 88.03,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 88.03,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 81.82,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 81.82,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 81.82,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 81.82,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 81.82,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 102.63,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 102.63,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 102.63,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 102.63,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 102.63,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 91.09,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 91.09,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 91.09,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 91.09,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 91.09,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 91.1,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 91.1,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 91.1,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 91.1,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 91.1,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 86.49,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 86.49,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 86.49,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 86.49,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 86.49,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 79.78,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 79.78,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 79.78,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 79.78,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 79.78,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 80.8,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 80.8,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 80.8,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 80.8,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 80.8,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 81.34,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 81.34,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 81.34,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 81.34,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 81.34,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 92.09,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 92.09,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 92.09,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 92.09,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 92.09,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 111.3,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 111.3,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 111.3,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 111.3,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 111.3,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 122.85,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 122.85,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 122.85,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 122.85,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 122.85,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 131.87,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 131.87,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 131.87,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 131.87,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 131.87,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 185.38,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 185.38,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 185.38,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 185.38,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 185.38,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 165.54,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 165.54,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 165.54,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 165.54,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 165.54,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 152.39,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 152.39,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 152.39,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 152.39,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 152.39,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 146.12,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 146.12,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 146.12,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 146.12,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 146.12,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1001_2023_01_06.json b/tests/api_examples/PRICES_ESIOS_1001_2023_01_06.json
new file mode 100644
index 0000000..20ad8af
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1001_2023_01_06.json
@@ -0,0 +1,1007 @@
+{
+  "indicator": {
+    "name": "Término de facturación de energía activa del PVPC 2.0TD",
+    "short_name": "PVPC T. 2.0TD",
+    "id": 1001,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": true,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ],
+    "values_updated_at": "2023-01-05T20:17:31.000+01:00",
+    "values": [
+      {
+        "value": 159.69,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 159.69,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 159.69,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 159.69,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 159.69,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 155.71,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 155.71,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 155.71,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 155.71,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 155.71,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 154.41,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 154.41,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 154.41,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 154.41,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 154.41,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 134.02,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 134.02,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 134.02,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 134.02,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 134.02,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 140.02,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 140.02,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 140.02,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 140.02,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 140.02,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 154.05,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 154.05,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 154.05,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 154.05,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 154.05,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 163.15,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 163.15,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 163.15,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 163.15,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 163.15,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 180.5,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 180.5,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 180.5,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 180.5,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 180.5,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 174.9,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 174.9,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 174.9,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 174.9,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 174.9,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 166.47,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 166.47,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 166.47,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 166.47,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 166.47,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 152.3,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 152.3,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 152.3,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 152.3,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 152.3,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 144.54,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 144.54,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 144.54,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 144.54,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 144.54,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 132.08,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 132.08,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 132.08,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 132.08,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 132.08,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 119.6,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 119.6,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 119.6,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 119.6,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 119.6,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 108.74,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 108.74,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 108.74,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 108.74,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 108.74,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 123.79,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 123.79,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 123.79,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 123.79,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 123.79,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 166.41,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 166.41,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 166.41,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 166.41,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 166.41,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 173.49,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 173.49,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 173.49,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 173.49,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 173.49,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 186.17,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 186.17,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 186.17,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 186.17,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 186.17,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 186.11,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 186.11,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 186.11,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 186.11,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 186.11,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 178.45,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 178.45,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 178.45,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 178.45,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 178.45,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 139.37,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 129.35,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 129.35,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 129.35,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 129.35,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 129.35,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_10211_2021_10_30.json b/tests/api_examples/PRICES_ESIOS_10211_2021_10_30.json
new file mode 100644
index 0000000..70d4d9a
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_10211_2021_10_30.json
@@ -0,0 +1,223 @@
+{
+  "indicator": {
+    "name": "Precio medio horario final suma de componentes",
+    "short_name": "Precio medio horario final suma",
+    "id": 10211,
+    "composited": true,
+    "step_type": "linear",
+    "disaggregated": false,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      }
+    ],
+    "values_updated_at": "2022-06-24T17:27:07.000+02:00",
+    "values": [
+      {
+        "value": 107.11,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 97.29,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 81.31,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 70.41,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 67.7,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 69.11,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 85.67,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 101.13,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 124.78,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 155.23,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 160.71,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 154.64,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 156.05,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 137.31,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 127.55,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 114.78,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 138.54,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 163.54,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 182.24,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 194.05,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 198.94,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 184.19,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 154.55,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 138.28,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_10211_2021_10_31.json b/tests/api_examples/PRICES_ESIOS_10211_2021_10_31.json
new file mode 100644
index 0000000..d05383e
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_10211_2021_10_31.json
@@ -0,0 +1,231 @@
+{
+  "indicator": {
+    "name": "Precio medio horario final suma de componentes",
+    "short_name": "Precio medio horario final suma",
+    "id": 10211,
+    "composited": true,
+    "step_type": "linear",
+    "disaggregated": false,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      }
+    ],
+    "values_updated_at": "2022-06-24T17:27:10.000+02:00",
+    "values": [
+      {
+        "value": 140.84,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 99.38,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 86.87,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 80.98,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 70.51,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 71.98,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 68.86,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 68.2,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 69.24,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 64.35,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 82.33,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 71.78,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 73.42,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 72.45,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 64.67,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 63.64,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 64.57,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 74.57,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 90.55,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 101.94,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 108.19,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 155.96,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 139.24,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 126.54,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 121.85,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_10211_2023_01_06.json b/tests/api_examples/PRICES_ESIOS_10211_2023_01_06.json
new file mode 100644
index 0000000..c8da476
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_10211_2023_01_06.json
@@ -0,0 +1,223 @@
+{
+  "indicator": {
+    "name": "Precio medio horario final suma de componentes",
+    "short_name": "Precio medio horario final suma",
+    "id": 10211,
+    "composited": true,
+    "step_type": "linear",
+    "disaggregated": false,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      }
+    ],
+    "values_updated_at": "2023-01-06T07:51:43.000+01:00",
+    "values": [
+      {
+        "value": 119.08,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 116.05,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 111.12,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 99.62,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 95.07,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 99.87,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 111.38,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 124.47,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 135.46,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 132.25,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 127.49,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 116.59,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 110.15,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 99.38,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 89.95,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 80.68,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 91.75,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 125.12,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 129.99,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 138.82,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 138.75,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 133.12,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 102.08,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 94.03,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1739_2021_10_30.json b/tests/api_examples/PRICES_ESIOS_1739_2021_10_30.json
new file mode 100644
index 0000000..354065d
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1739_2021_10_30.json
@@ -0,0 +1,223 @@
+{
+  "indicator": {
+    "name": "Precio de la energía excedentaria del autoconsumo para el mecanismo de compensación simplificada (PVPC)",
+    "short_name": "Precio de la energía excedentaria",
+    "id": 1739,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": false,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 3,
+        "geo_name": "España"
+      }
+    ],
+    "values_updated_at": "2021-10-29T20:17:00.000+02:00",
+    "values": [
+      {
+        "value": 99.68,
+        "datetime": "2021-10-30T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T22:00:00Z",
+        "tz_time": "2021-10-29T22:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 89.88,
+        "datetime": "2021-10-30T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-29T23:00:00Z",
+        "tz_time": "2021-10-29T23:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 75.36,
+        "datetime": "2021-10-30T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T00:00:00Z",
+        "tz_time": "2021-10-30T00:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 63.85,
+        "datetime": "2021-10-30T03:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T01:00:00Z",
+        "tz_time": "2021-10-30T01:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 58.66,
+        "datetime": "2021-10-30T04:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T02:00:00Z",
+        "tz_time": "2021-10-30T02:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 61.13,
+        "datetime": "2021-10-30T05:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T03:00:00Z",
+        "tz_time": "2021-10-30T03:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 77.23,
+        "datetime": "2021-10-30T06:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T04:00:00Z",
+        "tz_time": "2021-10-30T04:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 92.07,
+        "datetime": "2021-10-30T07:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T05:00:00Z",
+        "tz_time": "2021-10-30T05:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 117.69,
+        "datetime": "2021-10-30T08:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T06:00:00Z",
+        "tz_time": "2021-10-30T06:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 149.72,
+        "datetime": "2021-10-30T09:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T07:00:00Z",
+        "tz_time": "2021-10-30T07:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 154.98,
+        "datetime": "2021-10-30T10:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T08:00:00Z",
+        "tz_time": "2021-10-30T08:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 148.09,
+        "datetime": "2021-10-30T11:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T09:00:00Z",
+        "tz_time": "2021-10-30T09:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 144.77,
+        "datetime": "2021-10-30T12:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T10:00:00Z",
+        "tz_time": "2021-10-30T10:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 129.66,
+        "datetime": "2021-10-30T13:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T11:00:00Z",
+        "tz_time": "2021-10-30T11:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 119.77,
+        "datetime": "2021-10-30T14:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T12:00:00Z",
+        "tz_time": "2021-10-30T12:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 105.53,
+        "datetime": "2021-10-30T15:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T13:00:00Z",
+        "tz_time": "2021-10-30T13:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 133.17,
+        "datetime": "2021-10-30T16:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T14:00:00Z",
+        "tz_time": "2021-10-30T14:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 155.52,
+        "datetime": "2021-10-30T17:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T15:00:00Z",
+        "tz_time": "2021-10-30T15:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 167.52,
+        "datetime": "2021-10-30T18:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T16:00:00Z",
+        "tz_time": "2021-10-30T16:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 185.85,
+        "datetime": "2021-10-30T19:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T17:00:00Z",
+        "tz_time": "2021-10-30T17:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 191.71,
+        "datetime": "2021-10-30T20:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T18:00:00Z",
+        "tz_time": "2021-10-30T18:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 178.23,
+        "datetime": "2021-10-30T21:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T19:00:00Z",
+        "tz_time": "2021-10-30T19:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 151.17,
+        "datetime": "2021-10-30T22:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T20:00:00Z",
+        "tz_time": "2021-10-30T20:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 132.36,
+        "datetime": "2021-10-30T23:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T21:00:00Z",
+        "tz_time": "2021-10-30T21:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1739_2021_10_31.json b/tests/api_examples/PRICES_ESIOS_1739_2021_10_31.json
new file mode 100644
index 0000000..7328295
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1739_2021_10_31.json
@@ -0,0 +1,231 @@
+{
+  "indicator": {
+    "name": "Precio de la energía excedentaria del autoconsumo para el mecanismo de compensación simplificada (PVPC)",
+    "short_name": "Precio de la energía excedentaria",
+    "id": 1739,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": false,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 3,
+        "geo_name": "España"
+      }
+    ],
+    "values_updated_at": "2021-10-30T20:16:46.000+02:00",
+    "values": [
+      {
+        "value": 132.9,
+        "datetime": "2021-10-31T00:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T22:00:00Z",
+        "tz_time": "2021-10-30T22:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 87.65,
+        "datetime": "2021-10-31T01:00:00.000+02:00",
+        "datetime_utc": "2021-10-30T23:00:00Z",
+        "tz_time": "2021-10-30T23:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 73.55,
+        "datetime": "2021-10-31T02:00:00.000+02:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T00:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 68.01,
+        "datetime": "2021-10-31T02:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T00:00:00Z",
+        "tz_time": "2021-10-31T01:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 56.69,
+        "datetime": "2021-10-31T03:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T02:00:00Z",
+        "tz_time": "2021-10-31T02:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 57.34,
+        "datetime": "2021-10-31T04:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T03:00:00Z",
+        "tz_time": "2021-10-31T03:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 51.27,
+        "datetime": "2021-10-31T05:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T04:00:00Z",
+        "tz_time": "2021-10-31T04:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 51.45,
+        "datetime": "2021-10-31T06:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T05:00:00Z",
+        "tz_time": "2021-10-31T05:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 54.46,
+        "datetime": "2021-10-31T07:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T06:00:00Z",
+        "tz_time": "2021-10-31T06:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 51.43,
+        "datetime": "2021-10-31T08:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T07:00:00Z",
+        "tz_time": "2021-10-31T07:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 71.03,
+        "datetime": "2021-10-31T09:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T08:00:00Z",
+        "tz_time": "2021-10-31T08:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 64.42,
+        "datetime": "2021-10-31T10:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T09:00:00Z",
+        "tz_time": "2021-10-31T09:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 64.34,
+        "datetime": "2021-10-31T11:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T10:00:00Z",
+        "tz_time": "2021-10-31T10:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 61.11,
+        "datetime": "2021-10-31T12:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T11:00:00Z",
+        "tz_time": "2021-10-31T11:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 56.01,
+        "datetime": "2021-10-31T13:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T12:00:00Z",
+        "tz_time": "2021-10-31T12:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 55.99,
+        "datetime": "2021-10-31T14:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T13:00:00Z",
+        "tz_time": "2021-10-31T13:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 54.75,
+        "datetime": "2021-10-31T15:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T14:00:00Z",
+        "tz_time": "2021-10-31T14:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 63.99,
+        "datetime": "2021-10-31T16:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T15:00:00Z",
+        "tz_time": "2021-10-31T15:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 81.45,
+        "datetime": "2021-10-31T17:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T16:00:00Z",
+        "tz_time": "2021-10-31T16:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 91.7,
+        "datetime": "2021-10-31T18:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T17:00:00Z",
+        "tz_time": "2021-10-31T17:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 99.79,
+        "datetime": "2021-10-31T19:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T18:00:00Z",
+        "tz_time": "2021-10-31T18:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 147.76,
+        "datetime": "2021-10-31T20:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T19:00:00Z",
+        "tz_time": "2021-10-31T19:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 130.27,
+        "datetime": "2021-10-31T21:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T20:00:00Z",
+        "tz_time": "2021-10-31T20:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 117.61,
+        "datetime": "2021-10-31T22:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T21:00:00Z",
+        "tz_time": "2021-10-31T21:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 112.67,
+        "datetime": "2021-10-31T23:00:00.000+01:00",
+        "datetime_utc": "2021-10-31T22:00:00Z",
+        "tz_time": "2021-10-31T22:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1739_2023_01_06.json b/tests/api_examples/PRICES_ESIOS_1739_2023_01_06.json
new file mode 100644
index 0000000..abd3266
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1739_2023_01_06.json
@@ -0,0 +1,223 @@
+{
+  "indicator": {
+    "name": "Precio de la energía excedentaria del autoconsumo para el mecanismo de compensación simplificada (PVPC)",
+    "short_name": "Precio de la energía excedentaria",
+    "id": 1739,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": false,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 3,
+        "geo_name": "España"
+      }
+    ],
+    "values_updated_at": "2023-01-05T20:17:31.000+01:00",
+    "values": [
+      {
+        "value": 105.6,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 99.45,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 95.99,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 80.63,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 75.05,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 80.3,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 96.71,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 106.21,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 120.56,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 123.04,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 118.78,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 109.0,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 102.44,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 89.49,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 79.65,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 69.53,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 80.31,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 120.47,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 127.74,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 136.99,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 136.99,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 131.26,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 99.43,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      },
+      {
+        "value": 91.02,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 3,
+        "geo_name": "España"
+      }
+    ]
+  }
+}
diff --git a/tests/api_examples/PRICES_ESIOS_1900_2023_01_06.json b/tests/api_examples/PRICES_ESIOS_1900_2023_01_06.json
new file mode 100644
index 0000000..e754eb0
--- /dev/null
+++ b/tests/api_examples/PRICES_ESIOS_1900_2023_01_06.json
@@ -0,0 +1,1007 @@
+{
+  "indicator": {
+    "name": "Desglose peaje por defecto 2.0TD excedente o déficit de la liquidación del mecanismo de ajuste de costes de producción",
+    "short_name": "2.0TD Excedente o déficit ajuste liquidación",
+    "id": 1900,
+    "composited": false,
+    "step_type": "linear",
+    "disaggregated": true,
+    "magnitud": [
+      {
+        "name": "Precio",
+        "id": 23
+      }
+    ],
+    "tiempo": [
+      {
+        "name": "Hora",
+        "id": 4
+      }
+    ],
+    "geos": [
+      {
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ],
+    "values_updated_at": "2023-01-05T20:17:31.000+01:00",
+    "values": [
+      {
+        "value": 7.21,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 7.21,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 7.21,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 7.21,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 7.21,
+        "datetime": "2023-01-06T00:00:00.000+01:00",
+        "datetime_utc": "2023-01-05T23:00:00Z",
+        "tz_time": "2023-01-05T23:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 6.11,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 6.11,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 6.11,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 6.11,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 6.11,
+        "datetime": "2023-01-06T01:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T00:00:00Z",
+        "tz_time": "2023-01-06T00:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 6.57,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 6.57,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 6.57,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 6.57,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 6.57,
+        "datetime": "2023-01-06T02:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T01:00:00Z",
+        "tz_time": "2023-01-06T01:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 5.52,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 5.52,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 5.52,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 5.52,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 5.52,
+        "datetime": "2023-01-06T03:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T02:00:00Z",
+        "tz_time": "2023-01-06T02:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 5.66,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 5.66,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 5.66,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 5.66,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 5.66,
+        "datetime": "2023-01-06T04:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T03:00:00Z",
+        "tz_time": "2023-01-06T03:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 5.73,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 5.73,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 5.73,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 5.73,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 5.73,
+        "datetime": "2023-01-06T05:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T04:00:00Z",
+        "tz_time": "2023-01-06T04:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 5.56,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 5.56,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 5.56,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 5.56,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 5.56,
+        "datetime": "2023-01-06T06:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T05:00:00Z",
+        "tz_time": "2023-01-06T05:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 5.3,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 5.3,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 5.3,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 5.3,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 5.3,
+        "datetime": "2023-01-06T07:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T06:00:00Z",
+        "tz_time": "2023-01-06T06:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 5.12,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 5.12,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 5.12,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 5.12,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 5.12,
+        "datetime": "2023-01-06T08:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T07:00:00Z",
+        "tz_time": "2023-01-06T07:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 3.44,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 3.44,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 3.44,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 3.44,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 3.44,
+        "datetime": "2023-01-06T09:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T08:00:00Z",
+        "tz_time": "2023-01-06T08:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.65,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.65,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.65,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.65,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.65,
+        "datetime": "2023-01-06T10:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T09:00:00Z",
+        "tz_time": "2023-01-06T09:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.29,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.29,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.29,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.29,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.29,
+        "datetime": "2023-01-06T11:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T10:00:00Z",
+        "tz_time": "2023-01-06T10:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.3,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.3,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.3,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.3,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.3,
+        "datetime": "2023-01-06T12:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T11:00:00Z",
+        "tz_time": "2023-01-06T11:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.1,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.1,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.1,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.1,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.1,
+        "datetime": "2023-01-06T13:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T12:00:00Z",
+        "tz_time": "2023-01-06T12:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 1.35,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 1.35,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 1.35,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 1.35,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 1.35,
+        "datetime": "2023-01-06T14:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T13:00:00Z",
+        "tz_time": "2023-01-06T13:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 0.66,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 0.66,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 0.66,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 0.66,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 0.66,
+        "datetime": "2023-01-06T15:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T14:00:00Z",
+        "tz_time": "2023-01-06T14:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 1.07,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 1.07,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 1.07,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 1.07,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 1.07,
+        "datetime": "2023-01-06T16:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T15:00:00Z",
+        "tz_time": "2023-01-06T15:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.15,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.15,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.15,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.15,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.15,
+        "datetime": "2023-01-06T17:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T16:00:00Z",
+        "tz_time": "2023-01-06T16:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.08,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.08,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.08,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.08,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.08,
+        "datetime": "2023-01-06T18:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T17:00:00Z",
+        "tz_time": "2023-01-06T17:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 4.02,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 4.02,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 4.02,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 4.02,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 4.02,
+        "datetime": "2023-01-06T19:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T18:00:00Z",
+        "tz_time": "2023-01-06T18:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 3.99,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 3.99,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 3.99,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 3.99,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 3.99,
+        "datetime": "2023-01-06T20:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T19:00:00Z",
+        "tz_time": "2023-01-06T19:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 3.05,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 3.05,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 3.05,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 3.05,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 3.05,
+        "datetime": "2023-01-06T21:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T20:00:00Z",
+        "tz_time": "2023-01-06T20:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 2.33,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 2.33,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 2.33,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 2.33,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 2.33,
+        "datetime": "2023-01-06T22:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T21:00:00Z",
+        "tz_time": "2023-01-06T21:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      },
+      {
+        "value": 1.63,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8741,
+        "geo_name": "Península"
+      },
+      {
+        "value": 1.63,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8742,
+        "geo_name": "Canarias"
+      },
+      {
+        "value": 1.63,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8743,
+        "geo_name": "Baleares"
+      },
+      {
+        "value": 1.63,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8744,
+        "geo_name": "Ceuta"
+      },
+      {
+        "value": 1.63,
+        "datetime": "2023-01-06T23:00:00.000+01:00",
+        "datetime_utc": "2023-01-06T22:00:00Z",
+        "tz_time": "2023-01-06T22:00:00.000Z",
+        "geo_id": 8745,
+        "geo_name": "Melilla"
+      }
+    ]
+  }
+}
diff --git a/tests/conftest.py b/tests/conftest.py
index c985435..f0b10d1 100644
--- a/tests/conftest.py
+++ b/tests/conftest.py
@@ -1,22 +1,36 @@
 """Tests for aiopvpc."""
+from __future__ import annotations
+
 import json
+import logging
 import pathlib
 import zoneinfo
-from datetime import date, datetime
+from datetime import date, datetime, timedelta
+
+from aiopvpc.const import ESIOS_INYECTION, ESIOS_MAG, ESIOS_OMIE, ESIOS_PVPC, KEY_PVPC
+from aiopvpc.pvpc_data import EsiosApiData, PVPCData
 
 TEST_EXAMPLES_PATH = pathlib.Path(__file__).parent / "api_examples"
 TZ_TEST = zoneinfo.ZoneInfo("Atlantic/Canary")
 
-FIXTURE_JSON_DATA_2021_10_30 = "PVPC_CURV_DD_2021_10_30.json"
-FIXTURE_JSON_DATA_2021_10_31 = "PVPC_CURV_DD_2021_10_31.json"
-FIXTURE_JSON_DATA_2022_03_27 = "PVPC_CURV_DD_2022_03_27.json"
-FIXTURE_JSON_DATA_2021_06_01 = "PVPC_CURV_DD_2021_06_01.json"
-FIXTURE_JSON_DATA_S2_2021_06_01 = "PRICES_APIDATOS_2021_06_01.json"
-FIXTURE_JSON_DATA_S2_2021_06_01_CYM = "PRICES_APIDATOS_2021_06_01_CYM.json"
-FIXTURE_JSON_DATA_S2_2021_10_30 = "PRICES_APIDATOS_2021_10_30.json"
-FIXTURE_JSON_DATA_S2_2021_10_31 = "PRICES_APIDATOS_2021_10_31.json"
+_FIXTURE_DATA_2021_10_30 = "PVPC_CURV_DD_2021_10_30.json"
+_FIXTURE_DATA_2021_10_31 = "PVPC_CURV_DD_2021_10_31.json"
+_FIXTURE_DATA_2022_03_27 = "PVPC_CURV_DD_2022_03_27.json"
+_FIXTURE_DATA_2021_06_01 = "PVPC_CURV_DD_2021_06_01.json"
+_FIXTURE_ESIOS_PVPC_2021_10_30 = "PRICES_ESIOS_1001_2021_10_30.json"
+_FIXTURE_ESIOS_PVPC_2021_10_31 = "PRICES_ESIOS_1001_2021_10_31.json"
+_FIXTURE_ESIOS_PVPC_2021_06_01 = "PRICES_ESIOS_1001_2021_06_01.json"
+_FIXTURE_ESIOS_PVPC_2023_01_06 = "PRICES_ESIOS_1001_2023_01_06.json"
+_FIXTURE_ESIOS_INYECTION_2021_10_30 = "PRICES_ESIOS_1739_2021_10_30.json"
+_FIXTURE_ESIOS_INYECTION_2021_10_31 = "PRICES_ESIOS_1739_2021_10_31.json"
+_FIXTURE_ESIOS_INYECTION_2023_01_06 = "PRICES_ESIOS_1739_2023_01_06.json"
+_FIXTURE_ESIOS_OMIE_2021_10_30 = "PRICES_ESIOS_10211_2021_10_30.json"
+_FIXTURE_ESIOS_OMIE_2021_10_31 = "PRICES_ESIOS_10211_2021_10_31.json"
+_FIXTURE_ESIOS_OMIE_2023_01_06 = "PRICES_ESIOS_10211_2023_01_06.json"
+_FIXTURE_ESIOS_MAG_2023_01_06 = "PRICES_ESIOS_1900_2023_01_06.json"
 
 _DEFAULT_EMPTY_VALUE = {"message": "No values for specified archive"}
+_DEFAULT_UNAUTH_MSG = "HTTP Token: Access denied (TEST)."
 
 
 class MockAsyncSession:
@@ -45,41 +59,54 @@ def __init__(self, status=200, exc=None):
         self.status = status
         self.exc = exc
 
-        self.responses_apidatos = {
-            "CYM_PRICES": load_fixture(FIXTURE_JSON_DATA_S2_2021_06_01_CYM),
-            date(2021, 10, 30): load_fixture(FIXTURE_JSON_DATA_S2_2021_10_30),
-            date(2021, 10, 31): load_fixture(FIXTURE_JSON_DATA_S2_2021_10_31),
-            date(2021, 6, 1): load_fixture(FIXTURE_JSON_DATA_S2_2021_06_01),
+        self.responses_public = {
+            date(2022, 3, 27): load_fixture(_FIXTURE_DATA_2022_03_27),
+            date(2021, 10, 30): load_fixture(_FIXTURE_DATA_2021_10_30),
+            date(2021, 10, 31): load_fixture(_FIXTURE_DATA_2021_10_31),
+            date(2021, 6, 1): load_fixture(_FIXTURE_DATA_2021_06_01),
         }
-        self.responses_esios = {
-            date(2022, 3, 27): load_fixture(FIXTURE_JSON_DATA_2022_03_27),
-            date(2021, 10, 30): load_fixture(FIXTURE_JSON_DATA_2021_10_30),
-            date(2021, 10, 31): load_fixture(FIXTURE_JSON_DATA_2021_10_31),
-            date(2021, 6, 1): load_fixture(FIXTURE_JSON_DATA_2021_06_01),
+        self.responses_token = {
+            ESIOS_PVPC: {
+                date(2021, 10, 30): load_fixture(_FIXTURE_ESIOS_PVPC_2021_10_30),
+                date(2021, 10, 31): load_fixture(_FIXTURE_ESIOS_PVPC_2021_10_31),
+                date(2021, 6, 1): load_fixture(_FIXTURE_ESIOS_PVPC_2021_06_01),
+                date(2023, 1, 6): load_fixture(_FIXTURE_ESIOS_PVPC_2023_01_06),
+            },
+            ESIOS_INYECTION: {
+                date(2021, 10, 30): load_fixture(_FIXTURE_ESIOS_INYECTION_2021_10_30),
+                date(2021, 10, 31): load_fixture(_FIXTURE_ESIOS_INYECTION_2021_10_31),
+                date(2023, 1, 6): load_fixture(_FIXTURE_ESIOS_INYECTION_2023_01_06),
+            },
+            ESIOS_MAG: {
+                date(2023, 1, 6): load_fixture(_FIXTURE_ESIOS_MAG_2023_01_06),
+            },
+            ESIOS_OMIE: {
+                date(2021, 10, 30): load_fixture(_FIXTURE_ESIOS_OMIE_2021_10_30),
+                date(2021, 10, 31): load_fixture(_FIXTURE_ESIOS_OMIE_2021_10_31),
+                date(2023, 1, 6): load_fixture(_FIXTURE_ESIOS_OMIE_2023_01_06),
+            },
         }
 
     async def json(self, *_args, **_kwargs):
         """Dumb await."""
         return self._raw_response
 
-    async def get(self, url, *_args, **_kwargs):
+    async def get(self, url: str, *_args, **_kwargs):
         """Dumb await."""
         self._counter += 1
         if self.exc:
             raise self.exc
+
+        prefix_public = "https://api.esios.ree.es/archives/"
+        prefix_token = "https://api.esios.ree.es/indicators/"
         key = datetime.fromisoformat(url.split("=")[-1]).date()
-        if key == date(2021, 6, 1) and "geo_ids=8744" in url:
-            assert url.startswith("https://apidatos.ree.es")
-            self._raw_response = self.responses_apidatos["CYM_PRICES"]
-        elif (
-            url.startswith("https://api.esios.ree.es/archives")
-            and key in self.responses_esios
-        ):
-            self._raw_response = self.responses_esios[key]
-        elif (
-            url.startswith("https://apidatos.ree.es") and key in self.responses_apidatos
-        ):
-            self._raw_response = self.responses_apidatos[key]
+        if url.startswith(prefix_token):
+            indicator = url.removeprefix(prefix_token).split("?")[0]
+            self._raw_response = self.responses_token.get(indicator, {}).get(
+                key, _DEFAULT_UNAUTH_MSG
+            )
+        elif url.startswith(prefix_public) and key in self.responses_public:
+            self._raw_response = self.responses_public[key]
         else:
             self._raw_response = _DEFAULT_EMPTY_VALUE
         return self
@@ -93,3 +120,35 @@ def call_count(self) -> int:
 def load_fixture(filename: str):
     """Load stored example for esios API response."""
     return json.loads((TEST_EXAMPLES_PATH / filename).read_text())
+
+
+async def run_h_step(
+    mock_session: MockAsyncSession,
+    pvpc_data: PVPCData,
+    api_data: EsiosApiData | None,
+    start: datetime,
+    should_fail: bool = False,
+) -> tuple[datetime, EsiosApiData]:
+    current_prices = api_data.sensors[KEY_PVPC] if api_data else {}
+    if current_prices:
+        logging.debug(
+            "[Calls=%d]-> start=%s --> %s -> %s (%d prices)",
+            mock_session.call_count,
+            start,
+            list(current_prices)[0].strftime("%Y-%m-%d %Hh"),
+            list(current_prices)[-1].strftime("%Y-%m-%d %Hh"),
+            len(current_prices),
+        )
+    api_data = await pvpc_data.async_update_all(api_data, start)
+    state_ok = pvpc_data.process_state_and_attributes(api_data, KEY_PVPC, start)
+    assert should_fail is not state_ok
+    start += timedelta(hours=1)
+    return start, api_data
+
+
+def check_num_datapoints(
+    api_data: EsiosApiData, sensor_keys: tuple[str, ...], expected: int
+):
+    for key in sensor_keys:
+        num_points = len(api_data.sensors[key])
+        assert num_points == expected, (key, expected, num_points)
diff --git a/tests/test_ha_helpers.py b/tests/test_ha_helpers.py
new file mode 100644
index 0000000..970e404
--- /dev/null
+++ b/tests/test_ha_helpers.py
@@ -0,0 +1,128 @@
+"""Tests for aiopvpc."""
+from __future__ import annotations
+
+import logging
+from datetime import datetime
+
+import pytest
+
+from aiopvpc.const import (
+    ALL_SENSORS,
+    KEY_INYECTION,
+    KEY_MAG,
+    KEY_OMIE,
+    KEY_PVPC,
+    TARIFFS,
+    UTC_TZ,
+)
+from aiopvpc.ha_helpers import get_enabled_sensor_keys, make_sensor_unique_id
+from aiopvpc.pvpc_data import BadApiTokenAuthError, PVPCData
+from tests.conftest import check_num_datapoints, MockAsyncSession, run_h_step
+
+
+def test_sensor_unique_ids():
+    all_sensor_keys = get_enabled_sensor_keys(
+        using_private_api=False, disabled_sensor_ids=[]
+    )
+    assert all_sensor_keys == {KEY_PVPC}
+
+    all_sensor_keys = get_enabled_sensor_keys(
+        using_private_api=True, disabled_sensor_ids=[]
+    )
+    assert sorted(all_sensor_keys) == sorted(ALL_SENSORS)
+    counter_combs = 0
+    unique_ids = set()
+    for tariff in TARIFFS:
+        for key in all_sensor_keys:
+            unique_ids.add(
+                make_sensor_unique_id(config_entry_id=tariff, sensor_key=key)
+            )
+            counter_combs += 1
+    assert counter_combs == len(unique_ids)
+
+    assert not get_enabled_sensor_keys(
+        using_private_api=True, disabled_sensor_ids=list(unique_ids)
+    )
+
+
+@pytest.mark.asyncio
+async def test_disable_sensors():
+    start = datetime(2023, 1, 6, 19, tzinfo=UTC_TZ)
+    mock_session = MockAsyncSession()
+    sensor_keys = ALL_SENSORS
+    assert len(sensor_keys) == 4
+    pvpc_data = PVPCData(
+        session=mock_session,
+        tariff="2.0TD",
+        data_source="esios",
+        api_token="test-token",
+        sensor_keys=sensor_keys,
+    )
+
+    api_data = None
+    start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert mock_session.call_count == 8
+    check_num_datapoints(api_data, sensor_keys, 24)
+
+    pvpc_data.update_active_sensors(KEY_PVPC, enabled=False)
+    pvpc_data.update_active_sensors(KEY_OMIE, enabled=False)
+    pvpc_data.update_active_sensors(KEY_MAG, enabled=False)
+    pvpc_data.update_active_sensors(KEY_MAG, enabled=False)
+
+    start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert mock_session.call_count == 9
+    check_num_datapoints(api_data, sensor_keys, 24)
+    logging.error(api_data.sensors.keys())
+
+    pvpc_data.update_active_sensors(KEY_INYECTION, enabled=False)
+    start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert mock_session.call_count == 9
+    check_num_datapoints(api_data, sensor_keys, 24)
+
+    start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert mock_session.call_count == 9
+    check_num_datapoints(api_data, sensor_keys, 24)
+
+    start, api_data = await run_h_step(
+        mock_session, pvpc_data, api_data, start, should_fail=True
+    )
+    assert mock_session.call_count == 9
+    # check_num_datapoints(api_data, sensor_keys, 0)
+
+    pvpc_data.update_active_sensors(KEY_INYECTION, enabled=True)
+    pvpc_data.update_active_sensors(KEY_PVPC, enabled=True)
+    start, api_data = await run_h_step(
+        mock_session, pvpc_data, api_data, start, should_fail=True
+    )
+    assert mock_session.call_count == 11
+
+    pvpc_data.update_active_sensors(KEY_INYECTION, enabled=True)
+    pvpc_data.update_active_sensors(KEY_PVPC, enabled=True)
+    pvpc_data.update_active_sensors(KEY_MAG, enabled=True)
+    pvpc_data.update_active_sensors(KEY_OMIE, enabled=True)
+    await run_h_step(mock_session, pvpc_data, api_data, start, should_fail=True)
+    assert mock_session.call_count == 15
+
+
+@pytest.mark.asyncio
+async def test_check_api_token():
+    start = datetime(2023, 1, 6, 19, tzinfo=UTC_TZ)
+    mock_session = MockAsyncSession(status=401)
+    pvpc_data = PVPCData(session=mock_session)
+    token_ok = await pvpc_data.check_api_token(start, "bad_token")
+    assert not token_ok
+    assert mock_session.call_count == 1
+
+    with pytest.raises(BadApiTokenAuthError):
+        await pvpc_data.async_update_all(None, start)
+    assert mock_session.call_count == 2
+
+    mock_session_ok = MockAsyncSession()
+    pvpc_data_ok = PVPCData(
+        session=mock_session_ok,
+        data_source="esios",
+        api_token="good_token",
+    )
+    token_ok = await pvpc_data_ok.check_api_token(start)
+    assert token_ok
+    assert mock_session_ok.call_count == 1
diff --git a/tests/test_pvpc.py b/tests/test_pvpc.py
index 65cddce..9a044fd 100644
--- a/tests/test_pvpc.py
+++ b/tests/test_pvpc.py
@@ -2,29 +2,39 @@
 import logging
 from asyncio import TimeoutError
 from datetime import datetime, timedelta
+from typing import cast
 
 import pytest
 from aiohttp import ClientError
 
-from aiopvpc.const import REFERENCE_TZ, UTC_TZ
-from aiopvpc.pvpc_data import PVPCData
-from tests.conftest import MockAsyncSession, TZ_TEST
+from aiopvpc.const import (
+    ALL_SENSORS,
+    ATTRIBUTIONS,
+    DataSource,
+    KEY_INYECTION,
+    KEY_OMIE,
+    KEY_PVPC,
+    REFERENCE_TZ,
+    UTC_TZ,
+)
+from aiopvpc.pvpc_data import BadApiTokenAuthError, PVPCData
+from tests.conftest import check_num_datapoints, MockAsyncSession, run_h_step, TZ_TEST
 
 
 @pytest.mark.parametrize(
-    "available, day_str, num_log_msgs, status, exception",
+    "data_source, api_token, day_str, num_log_msgs, status, exception",
     (
-        (False, "2032-10-26 00:00:00+00:00", 0, 200, None),
-        (False, "2032-10-26 00:00:00+00:00", 0, 500, None),
-        (True, "2032-10-26 00:00:00+00:00", 1, 200, TimeoutError),
-        (False, "2032-10-26 00:00:00+00:00", 0, 200, TimeoutError),
-        (True, "2032-10-26 00:00:00+00:00", 1, 200, ClientError),
-        (False, "2032-10-26 00:00:00+00:00", 0, 200, ClientError),
+        ("esios_public", None, "2032-10-26", 0, 200, None),
+        ("esios_public", None, "2032-10-26", 1, 500, None),
+        ("esios", "bad-token", "2032-10-26", 1, 401, None),
+        ("esios_public", None, "2032-10-26", 1, 200, TimeoutError),
+        ("esios_public", None, "2032-10-26", 1, 200, ClientError),
     ),
 )
 @pytest.mark.asyncio
 async def test_bad_downloads(
-    available,
+    data_source,
+    api_token,
     day_str,
     num_log_msgs,
     status,
@@ -35,47 +45,37 @@ async def test_bad_downloads(
     day = datetime.fromisoformat(day_str).astimezone(REFERENCE_TZ)
     mock_session = MockAsyncSession(status=status, exc=exception)
     with caplog.at_level(logging.INFO):
-        pvpc_data = PVPCData(session=mock_session, tariff="2.0TD")
-        pvpc_data.source_available = available
-        assert not pvpc_data.process_state_and_attributes(day)
-        prices = await pvpc_data.async_update_prices(day)
-        assert not prices
-        assert not pvpc_data.process_state_and_attributes(day)
+        pvpc_data = PVPCData(
+            session=mock_session,
+            data_source=cast(DataSource, data_source),
+            api_token=api_token,
+        )
+        if status == 401:
+            with pytest.raises(BadApiTokenAuthError):
+                await pvpc_data.async_update_all(None, day)
+            assert mock_session.call_count == 1
+            return
+
+        api_data = await pvpc_data.async_update_all(None, day)
+        assert not api_data.sensors[KEY_PVPC]
+        assert not pvpc_data.process_state_and_attributes(api_data, KEY_PVPC, day)
         assert len(caplog.messages) == num_log_msgs
     assert mock_session.call_count == 1
-    assert len(prices) == 0
-
-
-async def _run_h_step(
-    mock_session: MockAsyncSession, pvpc_data: PVPCData, start: datetime
-):
-    if pvpc_data._current_prices:
-        logging.debug(
-            "[Calls=%d]-> start=%s --> %s -> %s (%d prices)",
-            mock_session.call_count,
-            start,
-            list(pvpc_data._current_prices)[0].strftime("%Y-%m-%d %Hh"),
-            list(pvpc_data._current_prices)[-1].strftime("%Y-%m-%d %Hh"),
-            len(pvpc_data._current_prices),
-        )
-    await pvpc_data.async_update_prices(start)
-    assert pvpc_data.process_state_and_attributes(start)
-    start += timedelta(hours=1)
-    return start, pvpc_data._current_prices
+    check_num_datapoints(api_data, (KEY_PVPC,), 0)
 
 
 # TODO review download schedule for Canary Islands TZ
 @pytest.mark.parametrize(
-    "local_tz, source",
+    "local_tz, data_source, sensor_keys",
     (
-        (TZ_TEST, "apidatos"),
-        (REFERENCE_TZ, "apidatos"),
-        (TZ_TEST, "esios_public"),
-        (REFERENCE_TZ, "esios_public"),
+        (TZ_TEST, "esios_public", (KEY_PVPC,)),
+        (REFERENCE_TZ, "esios_public", (KEY_PVPC,)),
+        (TZ_TEST, "esios", (KEY_PVPC, KEY_INYECTION, KEY_OMIE)),
+        (REFERENCE_TZ, "esios", (KEY_PVPC, KEY_INYECTION, KEY_OMIE)),
     ),
 )
 @pytest.mark.asyncio
-async def test_reduced_api_download_rate(local_tz, source):
+async def test_reduced_api_download_rate_dst_change(local_tz, data_source, sensor_keys):
     """Test time evolution and number of API calls."""
     start = datetime(2021, 10, 30, 15, tzinfo=UTC_TZ)
     mock_session = MockAsyncSession()
@@ -83,52 +83,100 @@ async def test_reduced_api_download_rate(local_tz, source):
         session=mock_session,
         tariff="2.0TD",
         local_timezone=local_tz,
-        data_source=source,
+        data_source=cast(DataSource, data_source),
+        api_token="test-token" if data_source == "esios" else None,
+        sensor_keys=sensor_keys,
     )
+    assert pvpc_data.attribution == ATTRIBUTIONS[data_source]
 
     # avoid extra calls at day if already got all today prices
+    api_data = None
     for _ in range(3):
-        start, prices = await _run_h_step(mock_session, pvpc_data, start)
-        assert mock_session.call_count == 1
-        assert len(prices) == 24
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+        assert mock_session.call_count == len(sensor_keys)
+        check_num_datapoints(api_data, sensor_keys, 24)
+    assert all(api_data.availability.values())
 
     # first call for next-day prices
     assert start == datetime(2021, 10, 30, 18, tzinfo=UTC_TZ)
-    start, prices = await _run_h_step(mock_session, pvpc_data, start)
-    assert mock_session.call_count == 2
-    assert len(prices) == 49
+    start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert mock_session.call_count == 2 * len(sensor_keys)
+    check_num_datapoints(api_data, sensor_keys, 49)
 
     # avoid calls at evening if already got all today+tomorrow prices
     for _ in range(3):
-        start, prices = await _run_h_step(mock_session, pvpc_data, start)
-        assert mock_session.call_count == 2
-        assert len(prices) == 49
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+        assert mock_session.call_count == 2 * len(sensor_keys)
+        check_num_datapoints(api_data, sensor_keys, 49)
 
     # avoid calls at day if already got all today prices
     for _ in range(21):
-        start, prices = await _run_h_step(mock_session, pvpc_data, start)
-        assert mock_session.call_count == 2
-        assert pvpc_data.state_available
-        # assert len(prices) == 25
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+        assert mock_session.call_count == 2 * len(sensor_keys)
+        assert all(api_data.availability.values())
+        # check_num_datapoints(api_data, sensor_keys, 25)
 
     # call for next-day prices (no more available)
     assert start == datetime(2021, 10, 31, 19, tzinfo=UTC_TZ)
     call_count = mock_session.call_count
     while start.astimezone(local_tz) <= datetime(2021, 10, 31, 23, tzinfo=local_tz):
-        start, prices = await _run_h_step(mock_session, pvpc_data, start)
-        call_count += 1
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+        call_count += len(sensor_keys)
         assert mock_session.call_count == call_count
-        # assert len(prices) == 25
+        # check_num_datapoints(api_data, sensor_keys, 25)
 
     # assert mock_session.call_count == 6
-    assert pvpc_data.state
-    assert pvpc_data.state_available
+    assert pvpc_data.states.get(KEY_PVPC)
+    assert all(api_data.availability.values())
     assert start.astimezone(local_tz) == datetime(2021, 11, 1, tzinfo=local_tz)
-    assert not pvpc_data.process_state_and_attributes(start)
+    assert not pvpc_data.process_state_and_attributes(api_data, KEY_PVPC, start)
 
     # After known prices are exausted, the state is flagged as unavailable
     with pytest.raises(AssertionError):
-        await _run_h_step(mock_session, pvpc_data, start)
-    assert not pvpc_data.state_available
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert not any(api_data.availability.values())
     start += timedelta(hours=1)
-    assert not pvpc_data.process_state_and_attributes(start)
+    assert not pvpc_data.process_state_and_attributes(api_data, KEY_PVPC, start)
+
+
+@pytest.mark.parametrize(
+    "local_tz, data_source, sensor_keys",
+    (
+        (TZ_TEST, "esios", ALL_SENSORS),
+        (REFERENCE_TZ, "esios", ALL_SENSORS),
+    ),
+)
+@pytest.mark.asyncio
+async def test_reduced_api_download_rate(local_tz, data_source, sensor_keys):
+    """Test time evolution and number of API calls."""
+    start = datetime(2023, 1, 6, 2, tzinfo=UTC_TZ)
+    mock_session = MockAsyncSession()
+    pvpc_data = PVPCData(
+        session=mock_session,
+        tariff="2.0TD",
+        local_timezone=local_tz,
+        data_source=cast(DataSource, data_source),
+        api_token="test-token" if data_source == "esios" else None,
+        sensor_keys=sensor_keys,
+    )
+    assert pvpc_data.attribution == ATTRIBUTIONS[data_source]
+
+    # avoid extra calls at day if already got all today prices
+    api_data = None
+    for _ in range(17):
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+        assert mock_session.call_count == len(sensor_keys)
+        check_num_datapoints(api_data, sensor_keys, 24)
+
+    # first call for next-day prices
+    assert start == datetime(2023, 1, 6, 19, tzinfo=UTC_TZ)
+    start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+    assert mock_session.call_count == 2 * len(sensor_keys)
+    check_num_datapoints(api_data, sensor_keys, 24)
+
+    call_count = mock_session.call_count
+    while start.astimezone(local_tz) <= datetime(2023, 1, 6, 23, tzinfo=local_tz):
+        start, api_data = await run_h_step(mock_session, pvpc_data, api_data, start)
+        call_count += len(sensor_keys)
+        assert mock_session.call_count == call_count
+        check_num_datapoints(api_data, sensor_keys, 24)
diff --git a/tests/test_pvpc_parsing.py b/tests/test_pvpc_parsing.py
index 89a71aa..bda6e47 100644
--- a/tests/test_pvpc_parsing.py
+++ b/tests/test_pvpc_parsing.py
@@ -1,9 +1,10 @@
 """Tests for aiopvpc."""
 from datetime import datetime, timedelta
+from typing import cast
 
 import pytest
 
-from aiopvpc.const import REFERENCE_TZ
+from aiopvpc.const import DataSource, KEY_PVPC, REFERENCE_TZ
 from aiopvpc.pvpc_data import PVPCData
 from tests.conftest import MockAsyncSession, TZ_TEST
 
@@ -11,19 +12,8 @@
 @pytest.mark.parametrize(
     "ts, source, timezone, zone_cm, n_prices, n_calls, n_prices_8h, available_8h",
     (
-        ("2021-10-30 00:00:00+08:00", "apidatos", TZ_TEST, False, 0, 1, 0, False),
-        ("2021-10-30 00:00:00", "apidatos", TZ_TEST, False, 24, 1, 24, True),
-        ("2021-10-31 00:00:00", "apidatos", TZ_TEST, False, 25, 1, 25, True),
-        # ("2022-03-27 20:00:00", "apidatos", TZ_TEST, False, 23, 2, 23, False),
-        # ("2022-03-27 20:00:00+04:00", "apidatos", TZ_TEST, False, 23, 1, 23, False),
-        ("2021-10-30 21:00:00", "apidatos", TZ_TEST, False, 49, 2, 26, True),
-        ("2021-10-30 21:00:00+01:00", "apidatos", TZ_TEST, False, 49, 2, 26, True),
-        ("2021-10-30 00:00:00", "apidatos", REFERENCE_TZ, True, 24, 1, 24, True),
-        ("2021-10-31 00:00:00", "apidatos", REFERENCE_TZ, True, 25, 1, 25, True),
-        # ("2022-03-27 20:00:00", "apidatos", REFERENCE_TZ, True, 23, 2, 23, False),
-        ("2021-10-30 21:00:00", "apidatos", REFERENCE_TZ, True, 49, 2, 25, True),
-        ("2021-06-01 09:00:00", "apidatos", REFERENCE_TZ, True, 24, 1, 24, True),
-        ("2021-06-01 09:00:00", "apidatos", TZ_TEST, True, 24, 1, 24, True),
+        ("2021-06-01 09:00:00", "esios", REFERENCE_TZ, True, 24, 1, 24, True),
+        ("2021-06-01 09:00:00", "esios", TZ_TEST, True, 24, 1, 24, True),
         ("2021-10-30 00:00:00+08:00", "esios_public", TZ_TEST, False, 0, 1, 0, False),
         ("2021-10-30 00:00:00", "esios_public", TZ_TEST, False, 24, 1, 24, True),
         ("2021-10-31 00:00:00", "esios_public", TZ_TEST, False, 25, 1, 25, True),
@@ -58,21 +48,20 @@ async def test_price_extract(
         session=mock_session,
         tariff="2.0TD",
         local_timezone=timezone,
-        data_source=source,
+        data_source=cast(DataSource, source),
+        api_token="test-token" if source == "esios" else None,
     )
 
-    pvpc_data.source_available = True
-    assert not pvpc_data.process_state_and_attributes(day)
-    assert mock_session.call_count == 0
-
-    await pvpc_data.async_update_prices(day)
-    pvpc_data.process_state_and_attributes(day)
-    assert len(pvpc_data._current_prices) == n_prices
+    api_data = await pvpc_data.async_update_all(None, day)
+    pvpc_data.process_state_and_attributes(api_data, KEY_PVPC, day)
+    assert len(api_data.sensors[KEY_PVPC]) == n_prices
     assert mock_session.call_count == n_calls
 
-    has_prices = pvpc_data.process_state_and_attributes(day + timedelta(hours=10))
-    assert len(pvpc_data._current_prices) == n_prices_8h
+    has_prices = pvpc_data.process_state_and_attributes(
+        api_data, KEY_PVPC, day + timedelta(hours=10)
+    )
+    assert len(api_data.sensors[KEY_PVPC]) == n_prices_8h
     assert has_prices == available_8h
     if has_prices:
-        last_dt, last_p = list(pvpc_data._current_prices.items())[-1]
+        last_dt, last_p = list(api_data.sensors[KEY_PVPC].items())[-1]
         assert last_dt.astimezone(timezone).hour == 23
diff --git a/tests/test_pvpc_zones.py b/tests/test_pvpc_zones.py
index 07c61a6..ca86832 100644
--- a/tests/test_pvpc_zones.py
+++ b/tests/test_pvpc_zones.py
@@ -1,9 +1,10 @@
 """Tests for aiopvpc."""
 from datetime import datetime
+from typing import cast
 
 import pytest
 
-from aiopvpc.const import REFERENCE_TZ, TARIFFS, UTC_TZ
+from aiopvpc.const import DataSource, KEY_PVPC, REFERENCE_TZ, TARIFFS, UTC_TZ
 from aiopvpc.pvpc_data import PVPCData
 from tests.conftest import MockAsyncSession, TZ_TEST
 
@@ -11,12 +12,12 @@
 @pytest.mark.parametrize(
     "local_tz, source, tariff, expected_18h",
     (
-        (TZ_TEST, "apidatos", TARIFFS[0], 0.23144),
-        (REFERENCE_TZ, "apidatos", TARIFFS[0], 0.23144),
-        (REFERENCE_TZ, "apidatos", TARIFFS[1], 0.13813),
         (TZ_TEST, "esios_public", TARIFFS[0], 0.23144),
         (REFERENCE_TZ, "esios_public", TARIFFS[0], 0.23144),
         (REFERENCE_TZ, "esios_public", TARIFFS[1], 0.13813),
+        (REFERENCE_TZ, "esios", TARIFFS[0], 0.23144),
+        (REFERENCE_TZ, "esios", TARIFFS[1], 0.13813),
+        (TZ_TEST, "esios", TARIFFS[0], 0.23144),
     ),
 )
 @pytest.mark.asyncio
@@ -28,12 +29,14 @@ async def test_geo_ids(local_tz, source, tariff, expected_18h):
         session=mock_session,
         tariff=tariff,
         local_timezone=local_tz,
-        data_source=source,
+        data_source=cast(DataSource, source),
+        api_token="test-token" if source == "esios" else None,
     )
-    await pvpc_data.async_update_prices(start)
-    assert pvpc_data.process_state_and_attributes(start)
+    api_data = await pvpc_data.async_update_all(None, start)
+    assert all(api_data.availability.values())
+    assert pvpc_data.process_state_and_attributes(api_data, KEY_PVPC, start)
     # for ts, price in pvpc_data._current_prices.items():
     #     print(f"{ts.astimezone(local_tz):%H}h --> {price:.5f} ")
     ts_loc_18h_utc = datetime(2021, 6, 1, 18, tzinfo=local_tz).astimezone(UTC_TZ)
-    price_loc_18h = pvpc_data._current_prices[ts_loc_18h_utc]
+    price_loc_18h = api_data.sensors[KEY_PVPC][ts_loc_18h_utc]
     assert price_loc_18h == expected_18h
diff --git a/tests/test_real_api_calls.py b/tests/test_real_api_calls.py
index a66709f..ddd67c3 100644
--- a/tests/test_real_api_calls.py
+++ b/tests/test_real_api_calls.py
@@ -1,34 +1,61 @@
 """Tests for aiopvpc."""
+import os
 from datetime import datetime
+from typing import cast
+from zoneinfo import ZoneInfo
 
 import pytest
 from aiohttp import ClientSession
+from dotenv import load_dotenv
 
 from aiopvpc import PVPCData
-from aiopvpc.const import REFERENCE_TZ
+from aiopvpc.const import ALL_SENSORS, DataSource, KEY_PVPC, REFERENCE_TZ
 from tests.conftest import TZ_TEST
 
+load_dotenv()
+
+
+async def _get_real_data(
+    timezone: ZoneInfo, data_source: str, indicators: tuple[str, ...], ts: datetime
+):
+    async with ClientSession() as session:
+        pvpc_data = PVPCData(
+            session=session,
+            tariff="2.0TD",
+            local_timezone=timezone,
+            api_token=os.getenv("ESIOS_TOKEN") if data_source == "esios" else None,
+            data_source=cast(DataSource, data_source),
+            sensor_keys=indicators,
+        )
+        return await pvpc_data.async_update_all(None, ts)
+
 
 @pytest.mark.real_api_call
 @pytest.mark.asyncio
 @pytest.mark.parametrize(
-    "data_source, tz",
+    "data_source, timezone",
     (
-        ("apidatos", REFERENCE_TZ),
+        ("esios", REFERENCE_TZ),
+        ("esios", TZ_TEST),
         ("esios_public", REFERENCE_TZ),
-        ("apidatos", TZ_TEST),
         ("esios_public", TZ_TEST),
     ),
 )
-async def test_real_download_today_async(data_source, tz):
-    async with ClientSession() as session:
-        pvpc_handler = PVPCData(
-            session=session,
-            tariff="2.0TD",
-            local_timezone=tz,
-            data_source=data_source,
-        )
-        prices = await pvpc_handler.async_update_prices(datetime.utcnow())
-    assert 22 < len(prices) < 49
-    # from pprint import pprint
-    # pprint(prices)
+async def test_real_download_today_async(data_source, timezone):
+    sensor_keys = ALL_SENSORS if data_source == "esios" else (KEY_PVPC,)
+    api_data = await _get_real_data(
+        timezone, data_source, sensor_keys, datetime.utcnow()
+    )
+    assert 22 < len(api_data.sensors[KEY_PVPC]) < 49
+
+
+if __name__ == "__main__":
+    import asyncio
+    from pprint import pprint
+
+    # timestamp = datetime(2021, 10, 30, 21)
+    timestamp = datetime.utcnow()
+    api_data = asyncio.run(
+        _get_real_data(REFERENCE_TZ, "esios", ALL_SENSORS, timestamp)
+    )
+    pprint(api_data)