Guide
Docker "client version 1.24 is too old. Minimum supported API version is 1.44"
The Docker daemon is refusing a program that asks for an older API version than it allows. Engine 29.0 set that floor at 1.44 and 29.3 lowered it to 1.40. We pointed real Traefik, Watchtower and Docker CLI images at Engine 29.9.2 and 29.2.1 to see which ones still fail and which fix works.
How do you fix Docker "client version is too old. Minimum supported API version is 1.44"?
Upgrade Docker Engine to 29.3.0 or later first. That lowers the floor from API 1.44 to 1.40 and clears tools that send 1.40 to 1.43, such as Woodpecker 2.x and CasaOS. If the error still says 1.24 or 1.25, upgrade the tool: Traefik 3.6.1 and 2.11.31 negotiate the version. Watchtower is archived, so set DOCKER_API_VERSION=1.40 on its container. DOCKER_MIN_API_VERSION=1.24 on the daemon works as a stopgap.
The Docker daemon is refusing a program because it asked for an older API version than the daemon allows. The fix depends on the two numbers in the message. The first, after "client version", is what the program asked for. The second is the daemon's floor.
On current Docker the floor is 1.40, not 1.44. Engine 29.0.0 (10 November 2025) raised it to 1.44. Engine 29.3.0 (5 March 2026) lowered it to 1.40. So upgrade the engine first, then fix whatever still fails:
docker version --format 'server {{.Server.Version}}, min API {{.Server.MinAPIVersion}}'The terms this answer turns on#
The Docker Engine API is how every program controls Docker. The docker command is one such program. Traefik, Watchtower and Portainer are others. Each one sends HTTP requests to the daemon, usually through /var/run/docker.sock. Docker's docs call any of them a client.
Each request names an API version in its path, such as /v1.24/containers/json. Newer Docker releases speak higher numbers. Docker's API reference maps them: 1.24 is Docker 1.12, 1.25 is 1.13, 1.40 is 19.03, and 1.44 is 25.0. Engine 29.9.2 speaks up to 1.56.
Version negotiation is how a client picks one. Docker's reference says the client and daemon settle on "the highest version of the API supported by both". A pinned client skips that step and always sends the same number. Pinned clients are the ones this error catches. The daemon's minimum API version is the oldest number it will still answer.
Two answers circulate, and the date decides which is right#
Most pages on this error say "Docker 29 requires API 1.44". That was true from 10 November 2025 until 5 March 2026. Then 29.3.0 shipped. Its release notes say "Lower minimum API version from v1.44 to v1.40 (Docker 19.03)". The change came from moby PR 52067, "Add compatibility with API v1.40 and up".
The other answer is "set DOCKER_MIN_API_VERSION=1.24 and restart Docker". It works. It also lowers the bar for every program that reaches the socket, and you forget it is there. It is a stopgap for one case: a tool you cannot upgrade, on an engine you cannot upgrade.
The pages also blur which tools are affected. On 29.3 and later, a tool sending 1.40 to 1.43 is fine again. Only tools pinned below 1.40 still fail, and in practice that means 1.24 and 1.25.
What we measured#
We ran the docker:dind image at Engine 29.9.2, released 20 October 2026, and at 29.2.1. The latest release is 29.9.3, from 3 November 2026. We sent raw API requests at each version number, then pointed real images at the socket.
| Request or program | Engine 29.2.1 | Engine 29.9.2 |
|---|---|---|
| Raw API 1.24, 1.25, 1.39 | Refused | Refused |
| Raw API 1.40, 1.43 | Refused | 200 |
| Raw API 1.44 | 200 | 200 |
| Docker CLI 18.09 (sends 1.39) | not run | Refused |
| Docker CLI 19.03 (sends 1.40) | Refused | Works |
| Traefik 3.5.4, 3.6.0, 2.11.30 (send 1.24) | not run | Refused |
| Traefik 3.6.1, 2.11.31 | not run | Work |
| Watchtower 1.7.1 (sends 1.25) | not run | Refused |
Every refusal on 29.9.2 had the same wording, with only the first number changing:
Error response from daemon: client version 1.24 is too old. Minimum supported API version is 1.40, please upgrade your client to a newer versionOn 29.2.1 the second number was 1.44. The HTTP status was 400 in both. A request with no version in its path got 200.
Traefik 3.5.4 logged the error and retried within a second, over and over. Watchtower 1.7.1 logged the error and exited with code 1 at startup. With --run-once it panicked with a nil pointer error. It did not sit quietly.
Find the program that sent it#
The daemon's own log is no help. Our 29.9.2 daemon wrote nothing at its default level for any refused request. The error goes back to the client, so it shows up in that client's log or terminal.
If you saw it in your terminal, the client is the docker command or a script calling it. Run docker version. The client's API line should read 1.40 or higher. If you saw it nowhere, look at the containers that hold the socket:
docker ps --filter volume=/var/run/docker.sock --format '{{.Names}}\t{{.Image}}'That filter listed our Watchtower container and skipped a plain one. Then read each one's log with docker logs --tail 20 NAME 2>&1 | grep 'too old'. A container that exits at startup will not show in docker ps, so add -a if one is missing.
Which fix for which tool#
This table is the answer for each tool. The middle column is what the tool sends. The last column is the version or setting that stops the error.
| Tool | API version it sends | Fails on 29.3 and later? | Fixed by |
|---|---|---|---|
| Traefik v3 up to 3.6.0 | 1.24 (measured) | Yes | Traefik 3.6.1, "Auto-negotiate Docker API Version" (measured) |
| Traefik v2 up to 2.11.30 | 1.24 (measured) | Yes | Traefik 2.11.31, same fix (measured) |
| Watchtower 1.7.1, archived | 1.25 (measured) | Yes | No release coming. DOCKER_API_VERSION=1.40 on its container (measured) |
| Docker CLI 18.09 or older | 1.39 or lower (measured) | Yes | Any CLI from 19.03 on (measured) |
| Docker CLI 19.03 to 24.x | 1.40 to 1.43 | No | Engine 29.3 or later (measured with 19.03) |
| Woodpecker 2.8.x and older | 1.43 (OneUptime) | No | Engine 29.3 or later, or Woodpecker 3.x |
Traefik fixed this in both branches. The Traefik 3.6.1 and 2.11.31 releases each list "Auto-negotiate Docker API version". In our run 3.6.1 logged Provider connection established with docker 29.9.2 (API 1.56) and built its routers. Upgrade within your branch. Setting DOCKER_API_VERSION=1.44 on Traefik 3.5.4 did nothing, and it kept sending 1.24.
Watchtower will not be fixed. Watchtower was archived on 17 December 2025, and 1.7.1 is the last image. It does read DOCKER_API_VERSION. Its docs list the default as 1.24, but the image we ran sent 1.25. With DOCKER_API_VERSION=1.40 it started and scheduled its first check. With 1.44 a one-time run scanned and finished. Treat that as a bridge to a replacement, which Watchtower vs Diun covers.
Woodpecker agents up to 2.8.x send 1.43, according to OneUptime's August 2026 write-up. That fails on 29.0 to 29.2 only. The post's fixes are Woodpecker 3.x or a current engine. It notes that 3.0.0 already supported the range.
CasaOS is the same case. Its issue 2387, opened the day 29.0.0 shipped, reports "Failed to load apps". Our CasaOS profile records the app manager as built against 1.43. On 10 December 2025 a maintainer said the install script now sets compatibility overrides. On 29.3 or later, 1.43 is above the floor.
A worked case: Traefik after an unattended upgrade#
Take a host where unattended-upgrades pulls Docker from Docker's own apt repository. It moves the engine to 29.9.3 overnight. Traefik runs as traefik:v3.5. Next morning every site returns 404 page not found.
Read Traefik's log first. Suppose it repeats Failed to retrieve information of the docker client and server host with client version 1.24 is too old. Minimum supported API version is 1.40. The 1.24 names Traefik. The 1.40 says the engine is already past 29.3, so upgrading the engine will not help.
Change the image tag to traefik:v3.6 or later and run docker compose up -d. That stays within v3. The log should now show Provider connection established with the engine version. The 404s clear once the routers are rebuilt. If they do not, the cause is a different one, and Why Traefik returns 404 page not found for a Docker container works through the rest.
Suppose instead you cannot change Traefik today. The daemon override below buys time, at the cost of a Docker restart.
The daemon override, and its limits#
DOCKER_MIN_API_VERSION is read by dockerd at startup. On a systemd host, puvvadi.net's fix is a drop-in made with sudo systemctl edit docker.service:
[Service]
Environment=DOCKER_MIN_API_VERSION=1.24Then run sudo systemctl restart docker. We set it on Engine 29.9.2 and 29.2.1. Both then reported minimum 1.24, and a 1.24 client got answers. A 1.23 request was still refused.
The floor under the floor is 1.24. Docker's deprecation page says support below 1.24 "has been permanently removed in Docker Engine v26". With DOCKER_MIN_API_VERSION=1.12, our 29.9.2 daemon did not start at all. It logged invalid DOCKER_MIN_API_VERSION: minimum supported API version is 1.24: 1.12. On a real host, a typo there takes every container down.
The variable can also raise the floor. Set to 1.39, the daemon refused 1.25 and accepted 1.39.
For one tool, prefer a client-side setting. DOCKER_API_VERSION on that one container affects only that container. Docker's reference says it "disables API version negotiation", so remove it once the tool is upgraded.
When this answer stops applying#
This covers Docker Engine on Linux, measured in Docker-in-Docker containers at 29.9.2 and 29.2.1. We did not test Docker Desktop, rootless Docker, Podman's Docker-compatible socket, or socket proxies, which can add their own version rules. We did not run Woodpecker or CasaOS. Their API versions come from the sources named above, not from our run. A future Engine may raise the floor again, so read the release notes before a major upgrade, as An update strategy that does not lose data suggests. Docker vs Podman covers what else changed in 29.x.
What to do next#
Read the two numbers in the error. If the second is 1.44, upgrade Docker Engine to 29.3 or later. If the first is 1.24 or 1.25, upgrade or replace the tool it came from. Use the daemon override only while you do.
Questions#
Which Docker version lowered the minimum API version back to 1.40?
Docker Engine 29.3.0, released 5 March 2026. Its release notes say "Lower minimum API version from v1.44 to v1.40 (Docker 19.03)." Engine 29.0.0 to 29.2.1 accept only 1.44 and up. Run docker version and read the server's API line. On 29.9.2 it says 1.56 (minimum version 1.40). On 29.2.1 the minimum read 1.44.
Does setting DOCKER_API_VERSION fix Traefik?
No, not on the Traefik versions that need fixing. We set DOCKER_API_VERSION=1.44 on a Traefik 3.5.4 container, and it kept sending 1.24 and logging the same error. Those versions fix the API version in code. Upgrade to Traefik 3.6.1 or later on v3, or 2.11.31 or later on v2. Both negotiate, and 3.6.1 logged Provider connection established with docker 29.9.2 (API 1.56).
Is DOCKER_MIN_API_VERSION safe to use?
It works, and it lowers the bar for every program that can reach the socket, not only the one you meant to fix. Set to 1.24 on Engine 29.9.2 and 29.2.1, it let 1.24 clients through. Never set it below 1.24: with 1.12 the daemon refused to start.
Why does the error say 1.40 on one server and 1.44 on another?
The number after "Minimum supported API version is" is that daemon's floor. Engine 29.0 to 29.2 print 1.44. Engine 29.3 and later print 1.40. Engines 25 to 28 print 1.24. If you set DOCKER_MIN_API_VERSION, it prints that value. The first number, after "client version", is what the program asked for. That one tells you which program to fix.
What about client version 1.57 is too new?
That is the opposite case: the program is newer than the daemon. Engine 29.9.2 answered a 1.57 request with client version 1.57 is too new. Maximum supported API version is 1.56. Programs that negotiate step down by themselves. A program pinned too high needs a lower DOCKER_API_VERSION, or the engine needs an upgrade.
Sources#
- Docker Engine 29 release notes (29.0.0 "requires API version v1.44", 29.3.0 "Lower minimum API version from v1.44 to v1.40", 29.9.3 on 3 Nov 2026)
- moby/moby PR 52067, "Add compatibility with API v1.40 and up" (merged 27 Feb 2026)
- Docker Engine API reference (version negotiation, DOCKER_API_VERSION, version table)
- Docker docs, deprecated features (API versions below 1.24 removed in Engine 26)
- Traefik v3.6.1 release ("Auto-negotiate Docker API Version", #12256)
- Traefik v2.11.31 release ("Auto-negotiate Docker API version", #12262)
- Watchtower arguments (--api-version, DOCKER_API_VERSION)
- containrrr/watchtower repository (archived 17 Dec 2025)
- puvvadi.net, Docker v29 and Traefik client version fix (11 Nov 2025)
- OneUptime blog, Woodpecker and Docker Engine 29 client version too old (11 Aug 2026)
- CasaOS issue 2387, apps fail to load after Docker 29 (opened 10 Nov 2025)
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.