Shadowrocket Subscription Imported but No Nodes: Check the URL, Provider Response, and Update Timing

If a subscription fails to parse or the list is empty, check the URL, confirm the subscription is active with your provider, then test manual and automatic updates.

At a glance

Saving a subscription URL in Shadowrocket does not mean nodes have been retrieved or parsed. This guide is for users who already have their own provider and subscription. Check in order: display state, URL, response content, manual update, and automatic update. Keep the original configuration and error details, then run one observable update to pinpoint the issue instead of repeatedly deleting and reimporting the subscription.

First, tell an empty list from a collapsed group or a connection failure

In Home, check the subscription group you just added. Seeing the group name only confirms that an entry was saved locally; it does not mean the subscription request succeeded or that the response contains recognizable nodes. If the group is collapsed, expand it and clear any search filter before confirming that the list is actually empty.

“No nodes” and “nodes won’t connect” are different stages. For an empty list, check the URL, response, and parsing. If nodes are available to select, then troubleshoot the server address, port, credentials, and connection path. Don’t change protocol settings or repeatedly switch Global Routing before the list has loaded.

Save URL Request subscription Receive response Parse nodes Display list

Check the URL: copy the subscription link, not the account page

Open your provider’s account page and use its clearly labeled subscription-copy option. Don’t copy the account homepage URL from your browser’s address bar or paste an entire set of sharing instructions. A page that opens in a browser may be a login page, help page, or error page—not subscription content Shadowrocket can parse.

The example below uses a fake value to illustrate URL structure; it is not a usable subscription. Query parameters may be used for authentication. The parameter may not be named token, so don’t replace your actual fields with the example.

https://example.com/sub?token=xxxx
  1. Check the beginning and end: Make sure the link is complete, with no extra spaces, line breaks, quotation marks, or punctuation.
  2. Keep the original characters: Don’t change anything after ?, &, =, or %, and don’t decode and reassemble the URL yourself.
  3. Check where you copied it from: Chat messages, email previews, and text recognition from screenshots can truncate long URLs. Go back to the original page and copy the link again.
  4. Confirm what the URL is for: A subscription URL retrieves a set of nodes. A single-node share link and a Config file are different input types.
  5. Check your credentials: If you reset your subscription credentials, the old link may no longer work even if its format is correct. Get your current link again.

Step-by-step: run one manual update in Home

Keep the existing entry, then check its type and URL. Home manages nodes and subscriptions; Config manages configuration files. Importing a subscription URL as a Config file is not the right way to troubleshoot an empty node list. Follow the subscription flow in Home below; button labels may vary by app version.

  1. Record the current state

    In Home, expand the target group and note the current node count, update message, and exact error text. If you already have a working configuration, keep it—don’t delete everything.

  2. Check the type

    Open the existing subscription’s edit screen. If you need to add it again, go to Home → “+” in the upper-right → Type → Subscribe. Don’t enter a subscription URL as the settings for a single server.

  3. Check the URL

    Paste your complete subscription URL into the URL field. Use a clear label that contains no credentials, check that the URL hasn’t been truncated, then save.

  4. Update manually

    Return to Home and pull down to refresh. Wait for the update to finish. If you have multiple subscriptions, check the result for the target group; a successful update in another group doesn’t mean this one succeeded.

  5. Check the result

    Expand the target group again and check whether nodes have appeared or the list has changed. If it’s still empty, save the exact error and the time it occurred, then check the response content.

Keep the network and configuration unchanged during troubleshooting. Don’t reset the URL, switch networks, change routing, and reimport all at once. Change one thing at a time to determine whether the URL correction or a different network path made a difference.

Check the server response: HTTP success doesn’t mean the content can be parsed

Fetching a subscription and connecting to a node are two separate network operations. Even with an HTTPS subscription URL, the response could be a login form, an access verification page, or an empty body. The HTTP status code indicates how the request was handled; whether nodes appear also depends on the response body and its format. Don’t assume the subscription is working just because the URL opens.

443
The default port for HTTPS when none is specified is not a node’s port
200
An HTTP request can succeed while the response body still needs to be checked for parseable content
429
Too Many Requests indicates that the request has been rate-limited

The standard HTTP response phrases below can help you compare details shown in the app with response records from your provider. They are not a guarantee that Shadowrocket will display these exact words. If you only see a generic failure message, record it verbatim rather than guessing the status code.

401 Unauthorized

Cause and fix: The request is missing valid authentication details or authentication was rejected. Ask your provider to confirm that your subscription credentials are valid, copy your current link again, and retry the update.

403 Forbidden

Cause and fix: The server rejected the request, possibly due to account permissions or access restrictions. Share redacted details with your provider so they can check the reason. Don’t rely on switching routing settings and guessing.

404 Not Found

Cause and fix: The requested resource wasn’t found. First check whether the URL was truncated or the old endpoint has been retired, then confirm the current subscription link.

429 Too Many Requests

Cause and fix: The request limit was reached. Stop refreshing repeatedly and wait as directed by the server. If a Retry-After header is provided, follow its instructions.

Bottom line: if the list is still empty after a 200 response, check the response body first

Ask your provider to confirm that the URL returns non-empty subscription content in a format Shadowrocket supports—not a webpage or another format. Troubleshooting parsing is useful only after you’ve received the right content.

Network and parsing: distinguish a request timeout from incompatible content

A request timeout, DNS resolution failure, or TLS verification failure happens before parseable content is received; none can be directly attributed to a particular node protocol. Check the device’s date and time, and whether the current network requires web-based sign-in. Then run one comparison update on another network available to you. If you see a certificate error, don’t work around it by disabling verification or installing a certificate from an unknown source.

What you observeWhat to check firstNext step
Times out after a long waitThe request path or server response did not completeKeep the URL unchanged, try once on another available network, and note the time
A login or verification page is returnedThe response is a webpage, not node dataConfirm that the subscription endpoint allows direct retrieval by the app
The request completes, but the response body is emptyThe account may have no entries to returnAsk your provider to check the account status, access permissions, and response records
The response body is not empty, but the list is emptyCheck the content format and entry fieldsConfirm the export format is supported by Shadowrocket, and troubleshoot with a redacted sample
Some entries appearThis does not necessarily mean the entire subscription is inaccessibleCompare the types and required parameters of missing entries; don’t check only the total count

Proxy, Direct, Config, and Scene in Global Routing are routing choices, not subscription format converters. If the path used for an update depends on a proxy that is no longer available, it may affect the request. That doesn’t mean every subscription must be updated in a particular mode. Note the current selection, then run a comparison changing one variable at a time based on the error and available networks.

Don’t assume subscription text is damaged just because it “looks encoded.” Subscriptions may use different formats; don’t arbitrarily Base64-decode them, delete lines, or change protocol names and overwrite the original. Check whether the source returns the right format and whether entry parameters are complete, rather than manually assembling a list that merely looks valid.

Update timing: verify a manual update before checking automatic updates

The initial import, a manual refresh, and later automatic updates are separate events. Saving a URL doesn’t mean it was immediately fetched in the background. Having automatic updates enabled also doesn’t prove a request succeeded at any given time. First run an observable manual update in the foreground, then check the subscription’s automatic update settings and interval available in the app. The exact menus and options depend on what the app currently displays.

What to send for troubleshooting and how to verify recovery

If the list is still empty after these checks, send your provider a reproducible report; it’s more useful than simply saying “the import failed.” Don’t include your full subscription credentials. If your provider needs to check your account, use their existing private support channel. This site does not provide, sell, or recommend nodes or subscriptions; this article only explains how to check information you already have.

After the list returns, make sure entries appear in the target group, then select one of your nodes and test the connection. If only one node won’t connect, stop reimporting the subscription and check that node’s settings and service status instead. After a successful manual update, observe the next automatic update to see whether the problem occurs only at a particular time.

Buying the app ≠ buying a connection plan. Shadowrocket is a paid app for Apple platforms, available exclusively on the App Store; purchasing the app does not include a connection service. For system requirements on iPhone, iPad, and other compatible Apple devices, check the App Store listing.

Verify Shadowrocket on the App Store