Skip to main content
Gary
Rank 1
Rank 1
March 9, 2017
Solved

Can we get access to the OVO energy online account API to download our smart meter usage data?

  • March 9, 2017
  • 227 replies
  • 36559 views

Hi Ovo,

I wondered whether the API that powers your live and historical usage page in the account menu is something you could look into opening up a bit so we can freely access our raw data and also perhaps it may stimulate some interesting community projects?

For instance (more sport related), Strava and Fitbit.

Best answer by g-de

Updated on 14/08/25 by Abby_OVO

 

Tim_OVO: “We love seeing the innovative ways our customers are using tech to help monitor and manage their energy usage. It’s inspiring us to think about ways to do energy differently. We know some customers have been using some of the application programming interface (APIs) behind our public facing services. While we’re OK with that, we do need to make you aware of a couple of things.

 

These APIs are designed to be used by OVO teams only, and aren't public facing. There are some downsides to using APIs that aren't for the public, and we wanted to let you know what these are. Behind the scenes, OVO uses APIs to share and update information between systems that power your bills and your online account. This is done in partnership with Kaluza, the tech company that’s part of the OVO family. They’ve built the billing platform designed to put our customers in the driving seat of their energy usage. 

 

These internal APIs are intended for use by Kaluza and its clients, who are energy retailers like OVO, rather than customers. Because of this, there’s no support for them being used anywhere else, which means they may be discontinued with no notice when we update our products and services. 

 

OVO Energy and Kaluza need to be able to monitor these APIs, and may block access if there's any problems in the future.

 

We know some customers may have put time and effort into developing solutions that use these API. So, now that you know the risks, we want to hear from you on how you’re using the APIs and the problems you’re solving with your DIY approach. 

 

Is there anything you’d like to see from OVO to help you monitor and manage your energy better? Leave a comment below to tell us.”

 

can you help me understand if the links above allow users to access raw data as if from an API?

I can certainly give it a go.

 

Firstly, big thanks to Timmo and other contributors for developing the library. All thanks go to them and links to buy them a coffee for their effort can be found on PyPi or GitHub:

https://pypi.org/project/ovoenergy/
https://github.com/timmo001/ovoenergy

 

I assume the way the library was developed this was to reverse engineer the My OVO website. That is, browse the website as normal and and monitor the traffic to see what OVO URLs and APIs it uses. Assuming this is the case, one of these URLs (get account IDs) already seems to be different but the library is still working for the moment. The APIs being used are not officially supported outside of the website, so first, a warning that any changes to the My OVO website may break the library.

 

For anyone using Python, you should be able to include the ovoenergy library and look at https://github.com/timmo001/ovoenergy/blob/master/ovoenergy/cli.py for how to use it.

 

For replicating this in other languages, the process seems to be as follows:

  1. Login by sending a POST request to https://my.ovoenergy.com/api/v2/auth/login with the following JSON in the body:
    {
    "username": "...",
    "password": "...",
    "rememberMe": true
    }

    From the response, save the cookies to use in all future requests.

  2. Next, send a GET request to https://smartpaym.ovoenergy.com/api/customer-and-account-ids . Be sure to save the items in the “accountIds” property (usually only one item).
  3. Finally, make a GET request to https://smartpaym.ovoenergy.com/api/energy-usage/daily/{accountId}?date={yyyy-MM} where {accountId} is the value from the previous request and {yyyy-MM} is the month in the format 2020-08.

You can also get monthly or half-hourly usage using the following URLs similar to step 3:

As mentioned above, if this is wanted for Home Assistant, the integration was added in version 0.114 (https://www.home-assistant.io/integrations/ovo_energy/).


Unfortunately the data only goes up to the end of the previous day as OVO no longer provide real-time data:

 

227 replies

MikeWilliams
Newcomer
Newcomer
October 10, 2025

@Firedog - I have just checked and the checkbox to include the .net runtime was not checked.

I have recreated the deployment zip file and uploaded it to GitHub

/Mike

Firedog
Super User
Super User
October 10, 2025

​I have just checked and the checkbox to include the .net runtime was not checked.
  

That’s great. That might save a few scratched heads.

I now realize I’d forgotten what the utility was supposed to do, so please excuse my stupidity. I rather thought that once the database was up to date I could select a period - a single month, say, and get a CSV with just that month’s data.

I see that you’ve converted the timestamps to local time. I’m not sure that’s the best idea, even though many users would prefer it. OVO have at last got it more or less right with their own display of half-hourly data after I grumbled for years about how wrong it was. My own preference is for year-round consistency, working always in UTC. That way, I don’t see inconsistencies like only 46 entries for 30 March 2025. I’ll be watching come 26 October ...

Noel | I have no official status; I'm just a volunteer who comes here to help other customers. My gear: Aclara SGM 1416-B Electricity-only E7 meter; Chameleon IHD3-PPMID-AAA | It may look as if I know what I’m talking about, but don’t let that fool you. |
MikeWilliams
Newcomer
Newcomer
October 10, 2025

Thanks for the feedback ​@Firedog I don't remember consciously setting the timestamps to local, I will have a look and see what the API is giving us.

Firedog
Super User
Super User
October 10, 2025

The first few lines of yesterday’s for me:

 

{

"electricity": {

"data": [

{

"consumption": 0.067,

"interval": {

"start": "2025-10-08T23:00:00.000",

"end": "2025-10-08T23:29:59.999"

},

"unit": "kwh"

},

{

"consumption": 0.033,

"interval": {

"start": "2025-10-08T23:30:00.000",

"end": "2025-10-08T23:59:59.999"

},

"unit": "kwh"

},

{

"consumption": 0.011,

"interval": {

"start": "2025-10-09T00:00:00.000",

"end": "2025-10-09T00:29:59.999"

},

"unit": "kwh"

},

{

"consumption": 0.031,

"interval": {

"start": "2025-10-09T00:30:00.000",

"end": "2025-10-09T00:59:59.999"

},

"unit": "kwh"

},

{

"consumption": 0.01,

"interval": {

"start": "2025-10-09T01:00:00.000",

"end": "2025-10-09T01:29:59.999"

},

"unit": "kwh"

},

 

[From https://smartpaymapi.ovoenergy.com/usage/api/half-hourly-local/nnnnnnn?date=2025-10-09]


The times are UTC, so the first node is midnight GMT. 

Noel | I have no official status; I'm just a volunteer who comes here to help other customers. My gear: Aclara SGM 1416-B Electricity-only E7 meter; Chameleon IHD3-PPMID-AAA | It may look as if I know what I’m talking about, but don’t let that fool you. |
MikeWilliams
Newcomer
Newcomer
October 10, 2025

Thanks, looking at that json data I can see that the OVO API is not sending us the timestamps properly formatted as UTC because they should then be "2025-10-09T01:29:59.999Z", note the Z is missing from their data.

I will have a think about how to best cope with that.

/Mike

MikeWilliams
Newcomer
Newcomer
October 11, 2025

@Firedog I have just run my program and the json I get back from the half hourly endpoint for the same day (2025-10-09) as your example start at 2025-10-09T00:00:00.000 as expected.

{
"electricity": {
"data": [
{
"consumption": 0.3,
"interval": {
"start": "2025-10-09T00:00:00.000",
"end": "2025-10-09T00:29:59.999"
},
"unit": "kwh"
},
{
"consumption": 0.308,
"interval": {
"start": "2025-10-09T00:30:00.000",
"end": "2025-10-09T00:59:59.999"
},
"unit": "kwh"
}
]
},
"gas": {
"data": [
{
"consumption": 0,
"interval": {
"start": "2025-10-09T00:00:00.000",
"end": "2025-10-09T00:29:59.999"
},
"unit": "kwh"
},
{
"consumption": 0,
"interval": {
"start": "2025-10-09T00:30:00.000",
"end": "2025-10-09T00:59:59.999"
},
"unit": "kwh"
}
]
}
}

Not sure where to go from here...

Firedog
Super User
Super User
October 11, 2025

Interesting. Early last year, I made a post about British Summertime’s effect on OVO’s data. It included this:

OVO’s system retrieves the current time zone from the device operating system. If this isn’t set properly (e.g. to UTC + 00:00 with daylight savings time applied automatically), then the usage pages won’t necessarily show the correct local timings.

My Windows is set like this: 
  

 

Is yours the same?

My equivalent page (i.e. the ‘placeholder’ before the day’s data have been retrieved) starts at 23:00, so there’s probably something in your machine set differently. It might be within the coding environment even though Windows is set up rationally (!)
  


PS Which incantation did you utter to get your JSON so nicely formatted and posted? 

Noel | I have no official status; I'm just a volunteer who comes here to help other customers. My gear: Aclara SGM 1416-B Electricity-only E7 meter; Chameleon IHD3-PPMID-AAA | It may look as if I know what I’m talking about, but don’t let that fool you. |
MikeWilliams
Newcomer
Newcomer
October 11, 2025

It might well be that the program needs to add some information to the http client when calling the API

MikeWilliams
Newcomer
Newcomer
October 11, 2025

@Firedog I used the three dots menu shown at the end of the format menu, there is an option in the drop-down for a code block.

On my phone just now I had to switch to desktop mode to see the three dots

Just found that the three dots menu also shows up if I rotate my phone...

MikeWilliams
Newcomer
Newcomer
October 11, 2025

@Firedog I will check how my windows timezone is set up.

I am pretty sure that it's the same as yours.

I get the same on both my work laptop (Windows 10) and my my home laptop (Windows 11)

Regarding the JSON that you posted a snippet of, was that from your browser or from the dump folder of my program?

 

/Mike