I note the addition of the manual method to use when the callback fails. This worked and a token which matched my VIN was created:
No automatic callback received.
Paste the full callback URL from your browser and press Enter:
2026-03-23 13:45:20 [INFO] Auth code received via manual URL: eyJraWQiOi...
2026-03-23 13:45:22 [INFO] Tokens saved to tokens_WFxxxxxxxxxxxxxx991.json
However when I try the first poll I get:
alpine-docker:/fordlogger/tokens.json# docker compose run fordlogger python -m fordlogger --once
[+] 1/1t 1/11
✔ Container fordlogger-db-1 Running 0.0s
Container fordlogger-db-1 Waiting
Container fordlogger-db-1 Healthy
Container fordlogger-fordlogger-run-04186118fdeb Creating
Container fordlogger-fordlogger-run-04186118fdeb Created
2026-03-23 14:10:12 [INFO] Database schema created/verified
2026-03-23 14:10:12 [INFO] Using legacy token file: tokens.json
2026-03-23 14:10:12 [ERROR] Garage error: [Errno 21] Is a directory: 'tokens.json'
2026-03-23 14:10:12 [ERROR] Telemetry error: [Errno 21] Is a directory: 'tokens.json'
Traceback (most recent call last):
File "/app/fordlogger/poller.py", line 84, in poll_once
positions = api.get_telemetry()
^^^^^^^^^^^^^^^^^^^
File "/app/fordlogger/api.py", line 61, in get_telemetry
data = self._get("telemetry")
^^^^^^^^^^^^^^^^^^^^^^
File "/app/fordlogger/api.py", line 24, in _get
token = get_valid_token(self.cfg)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/fordlogger/auth.py", line 150, in get_valid_token
tokens = load_tokens(cfg)
^^^^^^^^^^^^^^^^
File "/app/fordlogger/auth.py", line 40, in load_tokens
return json.loads(p.read_text())
^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/pathlib.py", line 1027, in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/pathlib.py", line 1013, in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
IsADirectoryError: [Errno 21] Is a directory: 'tokens.json'
2025 Explorer EV
I note the addition of the manual method to use when the callback fails. This worked and a token which matched my VIN was created:
No automatic callback received.
Paste the full callback URL from your browser and press Enter:
However when I try the first poll I get:
alpine-docker:/fordlogger/tokens.json# docker compose run fordlogger python -m fordlogger --once
[+] 1/1t 1/11
✔ Container fordlogger-db-1 Running 0.0s
Container fordlogger-db-1 Waiting
Container fordlogger-db-1 Healthy
Container fordlogger-fordlogger-run-04186118fdeb Creating
Container fordlogger-fordlogger-run-04186118fdeb Created
2026-03-23 14:10:12 [INFO] Database schema created/verified
2026-03-23 14:10:12 [INFO] Using legacy token file: tokens.json
2026-03-23 14:10:12 [ERROR] Garage error: [Errno 21] Is a directory: 'tokens.json'
2026-03-23 14:10:12 [ERROR] Telemetry error: [Errno 21] Is a directory: 'tokens.json'
Traceback (most recent call last):
File "/app/fordlogger/poller.py", line 84, in poll_once
positions = api.get_telemetry()
^^^^^^^^^^^^^^^^^^^
File "/app/fordlogger/api.py", line 61, in get_telemetry
data = self._get("telemetry")
^^^^^^^^^^^^^^^^^^^^^^
File "/app/fordlogger/api.py", line 24, in _get
token = get_valid_token(self.cfg)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/app/fordlogger/auth.py", line 150, in get_valid_token
tokens = load_tokens(cfg)
^^^^^^^^^^^^^^^^
File "/app/fordlogger/auth.py", line 40, in load_tokens
return json.loads(p.read_text())
^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/pathlib.py", line 1027, in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.12/pathlib.py", line 1013, in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
IsADirectoryError: [Errno 21] Is a directory: 'tokens.json'
2025 Explorer EV