Clash Subscription Management: Troubleshooting Update Failures, Auth, and Health Checks
Subscription suddenly failing to update, every node grayed out? This article starts from how subscriptions work under the hood and walks through common failure causes, health-check configuration, and how to write node filters — all in one place.
What a Subscription Actually Is, and Where to Look When It Breaks
What we usually call "importing a subscription" actually maps to the proxy-providers field at the config-file level: the client periodically hits a URL, pulls down the node list it returns, parses it into nodes, and drops them into the corresponding policy group. Once you understand this layer, you'll know exactly where to look when a subscription "fails to update."
proxy-providers: my-sub: type: http url: "https://example.com/sub?token=xxx" interval: 3600 # Auto-updates every 3600 seconds health-check: enable: true url: https://www.gstatic.com/generate_204 interval: 300
Most graphical clients hide this entire block of config behind the "Import Subscription" input field — the link you type in is the url field, and the "update interval" in the UI maps to interval. There's no fundamental difference under the hood.
Common Reasons Subscription Updates Fail
-
Flagged as an "abnormal client" and denied accessSome subscription services check the request's
User-Agentand block requests from uncommon clients. You can manually set a common UA string in theheaderfield to disguise the request. -
The subscription link requires authenticationIf the subscription URL needs an
Authorizationheader to be accessible (common with self-hosted panel subscription endpoints), attach it the same way through theheaderfield, rather than embedding the token in the URL (some services support both, but using a header is the cleaner approach). -
Fetching the subscription itself needs to go through the proxyIf the subscription server is overseas, and reaching overseas sites on your network requires having a working node first, you end up in a deadlock: no working node means the subscription can't be fetched, and the subscription failing to fetch means there's no node. In that case, you can use the
proxyfield to specify a fixed bootstrap node used solely for updating the subscription. -
The subscription file exceeds a size limitThe
size-limitfield has no limit by default, but if the client or panel has set a more conservative limit on its own, an oversized subscription file will simply be rejected — you can raise or remove that limit.
proxy-providers: my-sub: type: http url: "https://example.com/sub" proxy: Direct Bootstrap Node # Fixed egress used only for updating the subscription header: User-Agent: - clash-verge/v2.0.0 Authorization: - Bearer your-token-here
If a client's GUI doesn't expose the header option directly, you'll usually need to pass it in through an advanced setting like "subscription override / custom parameters." The exact location varies by client — check that client's official docs if you can't find it.
Using health-check to Weed Out Dead Nodes
Over time, subscription nodes go offline, get throttled, or get blocked — that's just normal. Without health checks, your policy group ends up full of unreachable "zombie nodes," which makes auto speed-testing and auto-selection a bad experience. That's exactly what health-check is for:
Add a health-check block under the relevant proxy-providers entry, pointing to a stable test URL (https://www.gstatic.com/generate_204 or https://cp.cloudflare.com are recommended). The client will send a test request to every node at the interval you set.
enable: whether health checking is on — it's recommended to always keep this enabled.interval: check interval in seconds. It doesn't need to be too short — 300–600 seconds is plenty.lazy: defaults totrue, meaning nodes that aren't actually in use won't be checked, saving resources. If you want the dashboard to always show up-to-date latency numbers, you can turn this off, at the cost of a bit more background traffic.
For policy groups of type url-test (auto speed test) or fallback (auto failover), health-check results directly feed into the auto-selection logic — dead nodes get skipped automatically, with no manual intervention needed.
Too Many, Too Messy Nodes? Trim Them Down with filter
Some subscriptions hand you a few hundred nodes at once, and dumping them all into one policy group makes it hard to pick and messy to look at. filter / exclude-filter let you match or exclude nodes by keyword or regex, splitting nodes by region or purpose into separate policy groups.
proxy-providers: hk-only: type: http url: "https://example.com/sub" filter: "(?i)港|hk|hongkong" no-relay: type: http url: "https://example.com/sub" exclude-filter: "(?i)中转|relay"
The same subscription URL can be configured as multiple proxy-providers entries, each with a different filter to split out subsets like "Hong Kong only," "Japan only," or "exclude relays," then give each its own policy group — much easier than scrolling through one giant list of a few hundred nodes.
FAQ
Is there any difference between manually clicking "update subscription" and waiting for the automatic update?
No fundamental difference — manually updating just triggers immediately the same fetch that would otherwise run on the interval schedule, and the effect is identical. If your subscription provider just changed your plan or nodes, a manual update lets it take effect right away instead of waiting for the next automatic cycle.
The subscription URL opens fine in a browser, but the client fails to fetch it — why?
Browsers and clients send different User-Agent strings and headers, and some subscription services only allow access from specific client UAs. As described above, try manually setting a common client UA in header.
I switched to a new subscription link, but old nodes are still showing up in the policy group — what do I do?
This is usually because the locally cached subscription file wasn't replaced. Check the cache file path specified by the path field, manually delete the old cache file, and trigger a subscription update again — or simply rename this entry under proxy-providers so the old and new content don't end up sharing the same cache file.
Further Reading
Done reading? Give Clash a try
Grab the installer for any platform in one place — just follow the recommended tag and you can't go wrong. Up and running in minutes.