First, distinguish connection details from the URL used to retrieve a list. Links beginning with ss://, vmess://, vless://, or trojan:// typically contain the parameters for one connection; a subscription URL retrieves and refreshes a list of entries. This guide explains the fields, encoding, import options in Shadowrocket, and what updates can and cannot change. It is for users who already have their own service configuration. Examples use nonfunctional demo data and do not provide a service.
Start with the prefix: protocol links and subscription URLs serve different purposes
When Shadowrocket receives a link, it first needs to determine whether the link describes a connection or a way to retrieve content remotely. A protocol link typically contains the server address, port, credentials, and transport options in one text string. A subscription URL usually uses HTTPS; the app requests that URL to retrieve a list of entries. Either type can be shared as a QR code or through the clipboard, so the fact that a link came from a QR code does not identify its type.
A subscription URL may look like this. token is the query parameter name and may serve as an access credential; the path and parameters of the actual URL depend on the service the user already has. An HTTPS URL may also lead to a web page. It can be parsed as a subscription only if its response matches a format supported by the app.
https://example.com/sub?token=xxxx
- Protocol prefix: Tells the parser how to interpret the following parameters; it does not guarantee that the server is available.
- QR code: A text carrier that can contain either a single protocol link or a subscription URL.
- Subscription response: May contain multiple links and may be Base64-encoded; not all subscriptions use the same response format.
- Config: Used to manage configuration files. These are different from server entries in Home. A configuration file containing rules is not the same as a server subscription.
ss://: Identify the encryption method, then check the password and address
ss:// is used for Shadowsocks. A common SIP002 format encodes “encryption method:password” before @, followed by the server address and port. In the demo link below, the credentials decode to aes-128-gcm:password; the server is an example domain, and the port is 8388.
ss://[email protected]:8388#SS-demo
| Position | Meaning | How to check |
|---|---|---|
ss:// | Shadowsocks share-format marker | Check Type after import |
Before @ | Encoded encryption method and password | Both the method and password must match the server configuration |
edge.example.com:8388 | Server address and port | Do not enter the port in the address field |
#SS-demo | Display name | Changing the display name usually does not change connection parameters |
Some legacy formats encode more of the link in Base64, so the presence or absence of a plain-text @ is not a reliable way to identify the format. Links with plugins may also include a plugin query parameter. If a parameter is lost when copying, the connection details may still be incomplete even when the server, port, and password are present.
vmess://: The payload is commonly encoded JSON
vmess:// is used for VMess. A common share format places Base64-encoded JSON after the prefix rather than spelling out “user@host.” So, not seeing a plain-text server address does not mean the link is empty. The example below shows a decoded demo payload, not a complete link that can be pasted into the app for import.
{
"v": "2",
"ps": "VMess-demo",
"add": "edge.example.com",
"port": "443",
"id": "00000000-0000-4000-8000-000000000000",
"aid": "0",
"scy": "auto",
"net": "ws",
"type": "none",
"host": "edge.example.com",
"path": "/demo",
"tls": "tls",
"sni": "edge.example.com"
}
add,port, andidcontain the server, port, and user UUID, respectively. The UUID is not the display name.psis the display name, andvis a format field for this share payload—not the Shadowrocket app version.net=wsspecifies WebSocket transport.hostandpathhold the corresponding transport parameters and should not be removed arbitrarily.tlsandsniare related to TLS. The address, Host, and SNI may be the same in an example, but a real service can specify them separately.aidis a legacy compatibility field. When troubleshooting, do not change its value by guesswork; check it against the actual service configuration.
A successful import only means the app recognized the data. It does not confirm network reachability, valid credentials, or matching TLS parameters. If an entry appears in the list but will not connect, open its edit screen and check each field instead of importing the same link repeatedly.
vless:// and trojan://: Similar formats, different authentication fields
Both link types commonly use the format “authentication field@server:port” and add transport settings as query parameters. The VLESS authentication field is typically a UUID; Trojan uses a password. The examples below illustrate the structure only. Their UUIDs, passwords, and domains do not correspond to real services.
vless://[email protected]:443?encryption=none&security=tls&type=ws&host=edge.example.com&path=%2Fdemo&sni=edge.example.com#VLESS-demo
trojan://[email protected]:443?security=tls&sni=edge.example.com#Trojan-demo
| Field | VLESS | Trojan |
|---|---|---|
Before @ | Usually a UUID | Password |
security=tls | Common parameter indicating TLS use | TLS parameter in common share formats |
type=ws | WebSocket used in this example | Check the actual link to determine whether additional transport is used |
sni | Server name used for TLS | Server name used for TLS |
After # | Display name | Display name |
encryption=none does not mean the entire connection has no protection. It relates to a VLESS field; check the security parameters separately to see whether TLS is used. Likewise, a port of 443 does not prove that TLS is configured correctly. The port is only one part of the connection destination.
%2F in a query parameter is the percent-encoded form of a slash. Special characters in passwords, display names, and paths may also be encoded. Avoid repeatedly decoding the entire link before copying it; an @, #, or & that belongs to a password could be mistaken for a structural separator. Share formats do not all handle extension parameters the same way, so check the fields the app actually saved after import.
Choose an import method and update workflow in Shadowrocket
Identify the type of data you have before choosing an import method. Home is for managing servers and subscriptions; Config is for configuration files; Settings is for app preferences. Do not assume an HTTPS URL belongs in Config as a rules file, or treat a single protocol link as a subscription that refreshes automatically.
Subscribe: Manage an existing subscription
List updatesFor an existing subscription whose list needs to stay in sync, go to Home, tap “+” to open Add Server, set Type to Subscribe, enter the complete subscription URL, and save. Update the subscription later to retrieve the latest list from the remote source.
Best for: An existing subscription URL whose list needs to stay in sync
Clipboard or QR code: Import a single set of parameters
Copy the complete protocol link and return to the app. Follow the clipboard detection prompt to add it, or use the QR code scanner in Home. If iOS asks for permission to paste, allow access for this paste. Check Type and the server fields after import.
Best for: A complete share link or its corresponding QR code
Add Server: Enter fields manually
In Home, tap “+” to open Add Server, select the matching Type, and enter the address, port, and authentication fields from the parameters you already have. Then configure any required TLS and transport options. Adding an entry manually does not create a remote subscription.
Best for: A list of parameters, or checking fields that may have been missed during import
In short: Keep the subscription relationship to refresh a list
For a single protocol link, changed parameters usually mean importing the new link or editing the entry. For a subscription URL, update the corresponding subscription. Pasting the same old link again will not retrieve new parameters from a remote source.
- Before importing: Confirm that the configuration is one you already have, and keep a recoverable copy of the original. Do not delete an entry that still works.
- After saving: Check Type, server, port, and display name. Do not judge a successful import by the name alone.
- Before testing: Check required fields such as TLS, SNI, Host, and Path. Fields vary by protocol; not every connection needs all of them.
- After updating: Check whether entries in the subscription group have changed. A remote update may replace manually edited entries, so keep a separate record of important changes.
Troubleshooting: Check parsing, updates, and connectivity separately
Break troubleshooting into three stages: whether the text can be parsed, whether a subscription request retrieves content, and whether a saved connection works. Global Routing controls the routing mode; it cannot fix an incomplete share link. Switching Proxy or Config will not fill in a missing password.
Copied a link but did not see an import prompt?
Check that the text starts with ss://, vmess://, vless://, or trojan://. Remove any explanatory text or code fences added by a messaging app, then copy the complete link again. Make sure Shadowrocket is allowed to read the clipboard for this paste. If you only have a list of fields, enter them manually via Home → “+” → Add Server.
The HTTPS URL opens in a browser. Why can’t I use it as a subscription?
A login, information, or error page does not mean the URL returned a list. Check that the URL is complete, especially any token parameter after the question mark, and confirm the URL’s purpose with the service you already use. Do not submit URLs containing credentials to third-party web tools.
The subscription updated. Why didn’t my manually added entry change?
A manually added entry may not belong to that subscription. Go to Home and check its group and source, then update the corresponding subscription. If the entry originally came from a single protocol link, get the new link and import it, or edit the existing entry with the updated parameters.
The port is 443. Why does the connection still fail?
Open the entry’s edit screen and check the address, port, authentication fields, and TLS, SNI, and transport parameters. 443 is only a port number; it does not configure the other settings for you. For certificate issues, check the server name and certificate configuration. Do not disable certificate verification as a general fix.
What should I hide in a screenshot shared for troubleshooting?
Hide the password, UUID, complete subscription URL, token, and QR code, along with any other authentication parameters. You can leave Type, port, transport type, and error messages visible. If credentials have been exposed, replace them through the service you already use.
After checking the fields, distinguish server connectivity from rule behavior. Connection parameters determine how a connection is established; rules in Config determine which policy applies to each request. A successful subscription update, a passing connection test, and traffic routed as expected are three separate outcomes to verify.