V2Ray Subscription Not Working? Check the Link, Format, Proxy, and Client Step by Step

When subscription updates fail or the node list is empty, check the link, encoding, update proxy, and client compatibility in order. Includes troubleshooting paths for v2rayN and v2rayNG.

A subscription update is not a single action. The client first reads the link, resolves the domain, establishes an HTTPS connection, retrieves the response body, identifies its encoding and node protocols, and only then writes entries such as VMess and VLESS to the current subscription group. A failure at any stage may appear in the interface as “Update failed” or “0 nodes.” The goal is therefore not to keep clicking Update, but to identify the layer where the failure occurs.

Quick overview

This checklist covers subscription updates that fail, parse to an empty list, or leave old nodes in v2rayN, v2rayNG, and v2flyNG. Checking five layers—link response, network path, content format, client compatibility, and node availability—helps separate server-side expiry, proxy-path failures, and local parsing errors.

Identify the failing layer first

Before starting, record the update time, client version, subscription group, and the exact error message. Do not delete the original group first: old nodes, group settings, and update logs are useful evidence. If the client lets you copy logs, keep the section from five seconds before clicking Update through ten seconds after the error appears.

Read subscription address Resolve domain Establish connection Read response body Parse node entries Write to subscription group

If neither the browser nor the client can open the same subscription address, start with the link, DNS resolution, and access permissions. If the browser retrieves text but the client reports a Base64, JSON, or protocol-format error, the problem is probably in content parsing. If the update succeeds and adds nodes but latency tests fail for every node, the subscription was read successfully; investigate node addresses, ports, transport, and routing instead.

Bottom line: distinguish “no response body received” from “response body cannot be parsed”

The first requires checking the network, permissions, and HTTP status. The second requires checking encoding, protocol fields, and client version. Treating both as the same problem often leads to changing DNS or reinstalling the client without addressing the actual failure.

Check the subscription link, response status, and expiry

A subscription link may contain an access token, user ID, device parameters, or expiry information. Dropping one character during copying, leaving a trailing space, or having a chat app truncate query parameters can make the server return an error page. Copy the complete address again from the original management page. Do not assemble it manually or put multiple addresses in one field.

  1. Check the beginning and end

    Confirm that the address starts with https:// and has no spaces, line breaks, or non-ASCII punctuation before the first character or after the last. Copy every query parameter, especially the token after the question mark.

  2. Open it separately

    Open the link in a browser on the current device and note whether it returns text, triggers a file download, redirects to a login page, or shows a 401, 403, 404, or 429 status.

  3. Check the expiry

    Open the subscription provider’s management page and verify the account status, expiration time, traffic quota, and whether the subscription was regenerated. Once an address is reset, its old token is usually no longer valid.

  4. Rule out rate limiting

    Wait 60 seconds before making another request. If the first request returns 429, repeated clicks will only prolong the limit; wait until the server allows the next request.

Error: The remote server returned an error: (403) Forbidden.

Cause and fix: The server rejected the current token, source address, or request method—copy a valid subscription address again and check whether access was reset or restricted.

Error: The remote server returned an error: (404) Not Found.

Cause and fix: The path does not exist or the address was truncated—check the full path and query parameters, and do not reuse the redirected page address shown in the browser’s address bar.

Error: Response status code does not indicate success: 429

Cause and fix: Too many requests were sent in a short period—stop repeated updates, wait a few minutes, and run the update once.

A link opening in the browser does not mean its response is parseable. A normal subscription body is often a long encoded string, one protocol link per line, or structured content supported by the client. If the page contains navigation, a CAPTCHA, a login form, or an error message, it is only a web-page response. The client may receive HTTP 200 yet show a parse error because the body type is wrong.

Confirm the network path used for subscription updates

“The current node can access the internet” and “the subscription update request uses the current node” are two different things. A client may send browser traffic through the system proxy while sending subscription updates directly. Conversely, enabling proxy updates before the core has started can point the request to a local port with no listener.

Test condition Update result What to check first
Direct update succeeds Update through proxy fails Check the core status, local proxy ports, and update-proxy settings
Direct update fails, proxy update succeeds Only the proxy path is reachable Keep proxy updates enabled and ensure a working old node is available at startup
Both methods time out Fails after about 10 to 30 seconds Check DNS resolution, server reachability, and the system firewall
Connection refused immediately Error returned in under one second The local address is reachable, but no process is listening on the target port

Two-path testing in v2rayN

  1. Confirm the core

    Select a working old node and start the core first, then check the status at the bottom of the main window. Common local SOCKS and HTTP ports are 10808 and 10809; use the actual listening settings under “Settings” → “Parameters” as the source of truth.

  2. Test direct access

    Open “Subscription Groups” and run “Update All Subscriptions (without proxy).” Record the duration, HTTP status, and change in node count.

  3. Test through the proxy

    Open “Subscription Groups” again and run “Update All Subscriptions,” sending the request according to the current proxy settings. Compare the result with the direct test.

  4. Check the port

    Go to “Settings” → “Parameters” and confirm that the local address and listening port used for subscription updates match the actual listener. Restart the core after changing them, then run one more update.

Network checks in v2rayNG and v2flyNG

On Android, confirm that the connection switch on the main screen is enabled before updating the subscription. v2rayNG uses the Xray core, while v2flyNG uses the v2fly core; subscription requests still depend on the app’s current network, proxy state, and system restrictions on background networking. A common local SOCKS port is 10808, but use the port shown in the app settings when troubleshooting.

Error: A task was canceled.

Cause and fix: The request exceeded the client’s timeout or the connection was interrupted—switch between direct and proxy updates, and check DNS, network stability, and whether the local core keeps running.

Error: No connection could be made because the target machine actively refused it

Cause and fix: The update request points to a local proxy port with no listener—check the SOCKS or HTTP port at 127.0.0.1 and restart the core.

Bottom line: change one network variable at a time

Compare direct and proxy updates first, then compare different networks. Do not change the address, DNS, core, and subscription group simultaneously; otherwise, even if the issue clears, you will not know its actual cause.

Check the subscription body’s encoding and protocol format

After the connection succeeds, the client must determine the format of the response body. It may contain Base64-encoded node links on separate lines or links beginning directly with a protocol name. After decoding, every record must still meet that protocol’s field requirements. VMess commonly contains encoded JSON, while VLESS usually places the user ID, server, port, and transport parameters in the URI.

Example of a recognizable entry:
vmess://encoded node configuration
vless://user ID@server address:port?type=ws&security=tls
trojan://authentication details@server address:port?security=tls

Key checks:
1. Does each record occupy one complete line?
2. Is the protocol prefix made of half-width characters?
3. Is the port an integer from 1 to 65535?
4. Are query parameters separated with &?
5. Does the response contain a web page, error message, or blank content?

Standard Base64 commonly uses letters, numbers, plus signs, slashes, and trailing equals signs; URL-safe variants may use hyphens and underscores. Clients usually support common variants, but truncation, inserted notice text, or incorrect line-break conversion can still corrupt the length. Do not add characters at random to “repair” it: successful decoding does not prove that the node fields are complete.

Error: Invalid length for a Base-64 char array or string.

Cause and fix: The encoded body was truncated, contains extra characters, or has invalid padding—retrieve the original response again and check the copying process, server output, and any intermediate page.

Error: Unexpected character encountered while parsing value

Cause and fix: The parser expected JSON but received HTML, a plain-text notice, or corrupted content—inspect the beginning of the response. If it contains page markup or an error message, return to the server response layer.

Error: unsupported scheme

Cause and fix: The entry’s protocol prefix is unsupported by the current client, or was damaged by spaces or punctuation—check the original entry and upgrade the client before importing it again.

Chinese characters, spaces, and special symbols in node names usually need proper encoding. If only one record fails, inspect the subscription body line by line and see whether the failure always occurs near the same entry. If removing one malformed record lets the rest import, the network and overall encoding are probably fine; focus on that node’s fields or escaping.

Client version, core, and group settings

When the same subscription fails in an older version but works in a newer one, the cause is often a change in protocol fields, share-link format, or core capabilities. v2rayN 7.x has different interface and configuration entry points from early 6.x releases; compared with some 1.8.x releases, v2rayNG 1.10.x includes a newer Xray core and import handling. Record the full version number instead of writing only “latest.”

Item v2rayN v2rayNG / v2flyNG
Version location “Help” → “About” Side menu → “About”
Subscription entry “Subscription Groups” → “Subscription Group Settings” Side menu → “Subscription Group Settings”
Update entry “Subscription Groups” → “Update All Subscriptions” Top-right menu on the main screen → “Update Subscription”
Core focus Selects and invokes the corresponding core according to the configuration v2rayNG uses Xray; v2flyNG uses v2fly
  1. Record the version

    Write down the complete client and core versions. For example, “7.x” alone is not enough to compare parsing behavior; keep every version segment shown on the About page.

  2. Upgrade the client

    Download the current stable version from this site’s download page, exit the old process, and update it for the relevant platform. Keep a copy of the original configuration so the troubleshooting sample is not lost.

  3. Create a new group

    Do not modify the old group immediately. Go to “Subscription Groups” → “Subscription Group Settings,” create a test group, paste the same address, and run one update.

  4. Disable filters

    Temporarily clear include, exclude, regex, and deduplication rules. If the node count changes from 0 to a specific number, the problem is group filtering, not subscription parsing.

  5. Compare counts

    Record the node count shown by the server, the number imported by the client, and the number filtered out. For example, if the source shows 24 entries but the client writes 0, check the format or filters first; if 23 are written, inspect the single malformed record.

Group filtering is a common reason for “update succeeded but the list is empty.” Include rules keep only matching names, while exclude rules remove matching names. A broad dot or wildcard range in a regular expression can filter out every entry. For testing, clear all filters first, then restore them one by one and record each change in node count.

Bottom line: when the node count is 0, check the “raw count” and “filtered count” first

A raw count of 0 points to a response or parsing problem; a raw count above 0 with a final count of 0 points to group filtering. These two numbers are more useful for diagnosis than an “Update succeeded” message.

Update succeeds, but nodes still do not work

A successful subscription update only proves that the client retrieved and parsed the configuration; it does not prove that every node is online. The next layer includes server DNS resolution, destination ports, transport, TLS parameters, system time, and routing. Do not keep changing the subscription link at this stage—the link has already done its job.

Error: failed to find an available destination

Cause and fix: The destination address could not be resolved, or no outbound remained after routing—check the node hostname, DNS result, and routing rules, then restart the core.

Error: connection refused

Cause and fix: The destination host is reachable, but no service is listening on the configured port—check whether the port in the subscription has expired and compare it with the current node details on the source page.

Error: TLS handshake timeout

Cause and fix: The TLS handshake did not finish within the timeout—check the server name, system time, packet loss, and intermediate links instead of repeatedly testing latency alone.

Read latency results by type. TCP latency checks only whether a connection to the destination port can be established; it does not fully validate a VMess, VLESS, TLS, or WebSocket session. A real connection test also passes through authentication, transport encapsulation, and routing, so “80 ms TCP latency but no access” usually indicates a problem with protocol parameters after the port.

Minimal connection verification

  1. Choose one node with complete fields and a clear name, and temporarily disable complex routing rules.
  2. Start the core and confirm that the local SOCKS or HTTP port is listening.
  3. Route only one test application through the proxy to keep unrelated traffic out of the logs.
  4. Watch for the earliest error in the logs rather than focusing on repeated retries later.
  5. Test again after restoring the routing rules. If it fails then, the issue is in the split-routing conditions or outbound tag.

A reusable ten-minute troubleshooting sequence

Layered diagnosis suits complex issues, but everyday troubleshooting needs a fixed order. The workflow below puts high-probability, low-cost checks first, avoiding an immediate client reinstall or complete configuration rebuild. Record the result after every step, especially the response status, duration, node count, and exact error.

  1. Save the current state

    Record the client and core versions, and save the old group, update time, node count, and first error log entry.

  2. Copy the link again

    Copy the complete subscription address from the original management page and check leading or trailing spaces, line breaks, tokens, and expiry.

  3. Inspect the response

    Confirm that the response is the subscription body, not a login page, CAPTCHA, blank page, or a 401, 403, 404, or 429 response.

  4. Switch the path

    Test direct updates and proxy updates separately, and confirm that local ports such as 10808 and 10809 match the actual settings.

  5. Create a new group

    Import the same address into a blank test group with include, exclude, regex, and deduplication rules disabled.

  6. Verify the nodes

    After the update succeeds, test TCP and real connections, then continue in order through DNS, port, TLS, transport, and routing.

If the process stops at step two, the link or account status is usually the issue; stopping at step three usually indicates a server response or access restriction; step four usually points to the network path or local port; step five usually indicates a format, version, or filter problem. Only after the first five steps pass should you investigate node protocols and server configuration in depth.

Save logs Verify link Inspect response Switch update path Import into blank group Test node connection

Frequently asked questions

The subscription update says it succeeded. Why is the node list still empty?

First check that the current subscription group is enabled and that include, exclude, or regex filters have not removed every node. Then check the raw entry count in the update log: a raw count of 0 means inspect the response body, while a raw count above 0 means inspect filtering and writing.

The subscription link opens in a browser. Why does v2rayN still report an error?

The browser may be showing a login page, error page, or redirected webpage instead of the subscription body. Check the HTTP status, response beginning, and content type. If the body is valid, compare v2rayN’s direct-update and proxy-update results.

Should subscription updates use a direct connection or a proxy?

There is no universal answer; it depends on whether the subscription server is reachable from the current network. Test both once: if direct access works, avoid adding proxy dependence; if only the proxy works, make sure a working node is available and the local proxy port is listening before the update.

The subscription still fails to parse after switching to v2rayNG. Does that mean it has expired?

Not based on one failure alone. First check the response status and body, then record the v2rayNG version, Xray core version, and exact error. If v2rayN, v2rayNG, and v2flyNG all retrieve the same corrupted body on different networks, the problem is more likely at the subscription-generation end.

Why does the subscription update fail when old nodes still connect?

Old nodes come from the local cache, while an update must reach the subscription server again. The node server and subscription server are separate destinations. A working old node can help test proxy updates, but it does not prove that the subscription link is still valid.

Download v2rayN