V2Ray Subscription Parse Errors: Check the URL, Base64 Encoding, and Expiration

If your subscription imports as an empty list or fails to parse, check the URL, response format, protocol compatibility, and subscription status.

At a glance

A practical checklist for v2rayN, v2rayNG, and v2flyNG users seeing “update failed” or an empty list after import. First distinguish download errors from parse errors, then check the URL, response body, Base64 encoding, and node fields. Finally, test a single node to narrow down the cause without mistaking a subscription issue for a core or DNS problem.

First, identify the failure: request, parsing, or connection

A subscription update has several separate steps: the client requests the subscription URL, the server returns content, the client recognizes the format and creates nodes, and the core uses each node’s settings to connect. An empty list only means there are no entries to display; it does not prove the server is offline. “Update succeeded, but no nodes appeared” can also mean the group is filtered, the response is empty, or every entry was discarded.

What you seeCheck firstAvoid for now
Timeout or DNS lookup failureSubscription domain, current network, and whether updates use a proxyChanging node protocols repeatedly
Content received, but format error reportedResponse body, encoding, and formats supported by the clientImporting a webpage as node data
List is empty after an updateWhether the response is empty, group and filter settings, and subscription accessDeleting all existing nodes right away
Nodes appear, but connections failNode settings, core support, security layer, and server statusContinuing to troubleshoot Base64

Back up your current settings and note the full update error. If you already have working nodes, don’t delete the existing group just to retry. Create a test group instead to compare results and avoid disrupting your everyday setup if an update goes wrong.

Check the URL: a subscription URL is not a single-node share link

Subscription URLs usually point to a resource and start with https://. Single-node share links may start with vmess://, vless://, or trojan://. Add the former to a subscription group and update it; import the latter through the client’s share-link option. If you enter a node link in the subscription URL field, the client may reject it or fail when making the request.

  1. Copy it again

    Copy the full URL again from your provider’s subscription page, then paste it into a plain-text editor and check both ends. Remove any stray quotation marks, line breaks, or punctuation, but don’t delete query parameters by hand.

  2. Check the right menu

    In v2rayN, the usual path is “Subscription Group” → “Subscription Group Settings” → “Add.” Enter a name and URL, then save. Labels may vary slightly by version; use the subscription group editor, not the single-node editor.

  3. Update it on its own

    Go back to “Subscription Group” and test with “Update Current Subscription (without proxy).” If your version says “Selected” instead of “Current,” make sure the test group you just added is selected.

  4. Note the result

    Record the update time, the exact message, and whether the node count changed. On Android, check the URL under v2rayNG’s “Subscription Group Settings,” then test from the main menu using “Update Subscription.”

In a query string, &, =, and % may be part of a token or parameter; don’t remove them just because they look unnecessary. If copying from page source or a forwarded message leaves the literal text & in the URL, use the original copy button again rather than treating HTML-escaped text as the actual URL.

Check the response first: HTTP success doesn’t mean the subscription is valid

When inspecting a response in a trusted local environment, check both the status code and the response body. Opening a login page in a browser only shows that the site is reachable; the client needs recognizable node data. A response containing a web challenge, login redirect, or error message may be impossible to parse even if the status code is 200. Browsers may also send login cookies, so success in a browser doesn’t guarantee that the client’s request will work.

200
A successful request still needs the right response format
401
Missing valid authentication credentials
403
Access denied; check permissions or restrictions

Bottom line: verify the response before checking the encoding

If the response is a login page, an access-denied message, or empty, re-encoding it won’t produce valid nodes. Fix subscription access first, then test the client’s parser.

Troubleshoot Base64: check the encoding layers, don’t add characters blindly

One common subscription format encodes multiple share links together as Base64; others return plain-text share links. A VMess share link often contains JSON that is itself Base64-encoded, so seeing vmess:// after decoding the outer subscription is normal and doesn’t mean decoding failed. Whether a particular format is accepted depends on the client’s subscription parser.

Whitespace handling varies: some subscription parsers strip it, while strict decoding tools may not. Save the original content, then inspect a copy locally. Don’t globally replace characters in node URIs or remove every =. If the content was truncated during copying, adding padding may make it look syntactically correct, but it can’t restore missing data.

illegal base64 data at input byte 0

Cause: Go’s Base64 decoder encountered a character that isn’t in the selected alphabet at the start of the input, such as a webpage that begins with an angle bracket.

Fix: Check the start of the response and its original format. If it’s a webpage, fix how you’re accessing the subscription instead of adding padding. The client may show only a simplified “parse failed” message.

unexpected end of JSON input

Cause: The JSON parser received empty or incomplete data. This can happen while parsing fields after decoding VMess share data.

Fix: Retrieve the complete content again and check that the decoded result is intact. Don’t guess at the node settings by manually adding a closing brace.

Protocol compatibility: decoding may work even when no node can be created

Subscription format compatibility and core protocol support are two different things. A graphical client first converts the subscription into its own node configuration, then passes it to the core. v2rayNG uses the Xray core, while v2flyNG uses the V2Fly core. In v2rayN, check which core is actually selected. Two clients recognizing VMess doesn’t mean they support the same transport settings and security-layer combinations.

CheckWhat to verifyCommon impact
Server portMust be an integer from 1 to 65535; 443 is common, but not requiredMissing or out-of-range values may prevent import
CredentialsCheck the UUID for VMess and VLESS; check the password format for other protocolsIncorrect credentials may import successfully but fail authentication
Transport settingsThe transport type, WebSocket path, Host, and other settings must match the serverUnsupported fields may be dropped; incorrect values cause connection failures
Security layerTLS serverName; REALITY public key, shortId, and related settingsMust be supported by both the client parser and the core

REALITY is a security-layer mechanism, not a standalone outbound protocol. Renaming a node to “REALITY” doesn’t make it compatible. If your provider offers subscription URLs for specific clients, choose the format explicitly intended for your client. Don’t assume structured configuration files can be imported as a list of share links.

  1. Keep the original subscription in a test group and import one complete share link provided by your service separately.
  2. If a single node imports but the full subscription fails, check the outer encoding, subscription response format, and whether the content was truncated.
  3. If only certain node types are missing, check whether their protocols and transport fields are supported. Don’t remove required settings just to force an import.
  4. If nodes appear but the core reports an error on startup, check the core configuration logs and distinguish unsupported settings from network connection failures.

Subscription expiration and update routing: run one controlled retest

An expired subscription URL and a failed node connection aren’t necessarily related. Resetting a token may disable the old URL immediately while cached nodes remain visible. An expired plan may return an empty list, an explanatory message, or an access-denied response, depending on the provider. Check your account’s validity period, remaining access, and latest URL instead of repeatedly importing the same old link.

Check the network route used for subscription requests separately. “Update through proxy” depends on the current proxy working; if the node in use is down, the update can get stuck in a dependency loop. Conversely, proxying the update only helps if direct access to the subscription domain fails and you already have a confirmed working node. Change one setting at a time so you can tell what made the difference.

Bottom line: report details from the stage that failed

If the problem persists, send your provider the client name and version, update time, request status, and a redacted error message. Explain how direct and proxied updates differ. Don’t send your full subscription token or node credentials.

After a successful retest, check that node fields are complete, the core starts, and the connection actually works. These steps verify three separate things: “subscription parses,” “configuration runs,” and “connection succeeds.” Don’t stop at an update-success message. For help organizing imports, see the subscription guide. For format conversion, read the subscription conversion guidelines first, and don’t share access credentials with untrusted services.

Download v2rayNChoose a client for your platform