Additional information about your setup (OctoPrint version, OctoPi version, printer, firmware, browser, operating system, ... as much data as possible)
The print is still going, and don't know if this is a one-off just yet. Will try on the same printer after the print is done - same .gcode file but in safe mode!
The print is currently running in OctoPrint safe mode. So far the API says 3% and the OctoPrint client says the same, so so far so good. I also noticed that the percentages "flattened out" at the end of the print. Around ~93% the API caught up, so it's possible that this is happening in the beginning of the print as well.
We first noticed the difference about 60% into the print (60% according to OctoPrint client, ~20% according to the api)
My money is on PrintTimeGenius. I noticed that it provided the print time estimate in your API output and I think it also overrides the percentage on the API based on its analysis. That that doesn't also reflect on the push socket (which feeds the percentage, or should feed it) might be a bug though.
Checking the code I didn't see any signs that it modifies the "completion" percentage. But if the percentage is calculated from the "time left" estimate, it'll still have an affect I guess. Still a bit weird that the percentage on the client is different from the API, as everything else is in sync.
Print time genius overrides the value displayed in the UI with it's own time based progress estimate. The one you see on the UI is OctoPrint's default progress which, iirc, is file based.