Shadowrocket Link Formats: How to Tell ss://, vmess://, vless:// and trojan:// Links from Subscription URLs

Learn how common share links are structured and encoded, how single-server links differ from subscription URLs, and how to identify and import each in Shadowrocket. All examples use dummy values.

At a glance

A Shadowrocket server share link carries connection parameters directly; a subscription URL points to configuration content that must be retrieved. This guide is for users who already have their own connection configuration. It explains how to identify links by their prefixes, encoding, and fields, and where to import them. You’ll learn when to use link import, Type → Subscribe, or Add Server for manual entry—and why a successful import does not guarantee a successful connection. All addresses, passwords, UUIDs, and port combinations below are dummy values for illustration and cannot be used to connect.

Check the prefix, then confirm what the URL is for

The scheme at the start of a link determines how it is parsed. ss:// indicates Shadowsocks parameters, vmess:// indicates VMess parameters, vless:// indicates VLESS parameters, and trojan:// indicates Trojan parameters. Each link usually describes one server entry. Putting several links on separate lines does not turn them into a subscription URL that can be updated over time.

A URL beginning with https:// only tells you that HTTPS is used to retrieve content; the prefix alone does not mean it is a subscription. Websites, account management pages, and subscription endpoints can all use HTTPS. Enter a URL in Subscribe only when the configuration provider explicitly identifies it as a subscription and the client can recognize its response.

4 types
Share link prefixes covered in this guide: ss / vmess / vless / trojan
443
TLS example port used below; not a fixed port for all connections
8388
Shadowsocks example port used below; check the original parameters for the actual value
FormatWhat it typically containsWhat to check first
ss://…Shadowsocks encryption method, password, address, and portWhether the encoded section is complete and includes any plugin parameters
vmess://…Often Base64-encoded JSON parametersWhether the address, UUID, transport, and TLS settings are present
vless://…UUID, address, port, and query parametersFields such as type, security, and flow
trojan://…Password, address, port, and TLS and transport parametersPassword encoding, SNI, and certificate verification settings
https://example.com/sub?token=xxxxExample subscription endpoint; the actual content must be retrievedWhether it is a subscription, rather than a login or error page

ss://: distinguish the Base64 section from the server address

A common Shadowsocks share link has this structure: ss://user-info@host:port#name. The user information may be a Base64 representation of method:password. In the example below, decoding the user information gives aes-128-gcm:demo-pass; example.com is a demo host, 8388 is a demo port, and Demo-SS is the name.

ss://[email protected]:8388#Demo-SS

Some older formats encode the entire string, including the host and port. So you should not expect every ss:// link to show an @ character. Standard Base64 and URL-safe Base64 may look different, and the trailing = padding may be omitted. These differences in appearance alone do not mean the parameters are invalid.

vmess://: check the JSON fields after decoding

A common VMess share format is a Base64-encoded JSON string after vmess://. The example below shows the decoded demo content, not a link you can paste into a subscription field. To import a real link, keep the original text intact; there is no need to decode and re-encode it manually.

{
  "v": "2",
  "ps": "Demo-VMess",
  "add": "example.com",
  "port": "443",
  "id": "11111111-1111-4111-8111-111111111111",
  "aid": "0",
  "scy": "auto",
  "net": "ws",
  "type": "none",
  "host": "example.com",
  "path": "/demo",
  "tls": "tls",
  "sni": "example.com"
}

add and port identify the connection destination, id is the UUID, and aid corresponds to alterId. net specifies the transport; when its value is ws, interpret host and path as WebSocket parameters. Check tls and sni against the TLS settings. These fields depend on one another, so entering only the UUID is not enough.

If the decoded content is not the expected JSON, do not immediately rewrite the original text. The share format may have variants, or the text may have been truncated. Get the original link again and check the fields shown after importing it into the client; this is usually more useful than repeatedly editing encoded content.

vless:// and trojan://: focus on the query parameters

VLESS and Trojan are often shared as readable URIs. The UUID or password goes before @, followed by the host and port. Query parameters come after ? and are separated by &. The two examples below illustrate the structure only; they do not point to connectable servers.

vless://[email protected]:443?encryption=none&security=tls&type=ws&host=example.com&path=%2Fdemo&sni=example.com#Demo-VLESS

trojan://[email protected]:443?security=tls&type=tcp&sni=example.com#Demo-Trojan
FieldHow to read itCommon misinterpretation
encryption=noneVLESS itself does not provide data encryption at this layerThis does not mean TLS is absent
security=tlsTLS is requested; check the related parameters as wellPort 443 does not mean TLS is configured correctly
type=wsUses WebSocket transport; check host and pathDo not change ws to tcp while keeping only the original password
sniServer name used for the TLS handshakeNot necessarily the same as the connection address or the WebSocket Host
flowA flow control parameter used by some VLESS configurationsThis field should not be added to every VLESS link
%2FPercent-encoded; decodes to a slashWhen entering path manually, do not encode it twice as %252F

If a Trojan password contains reserved characters such as @, #, or &, they must be URI-encoded correctly. “Cleaning up” these characters after copying can change how the URI is parsed. When entering the details manually, enter the value required by the field rather than pasting the entire URI into Password.

Bottom line: check the fields; don’t guess the protocol from the port

If the address and port are the same but the connection result differs, compare the UUID or password, type, SNI, path, and flow. Port 443 can be used with different protocols; it is not a reason to change VLESS to Trojan.

Subscription URLs retrieve content, not one fixed server entry

A subscription URL is an endpoint that can be requested repeatedly. The client retrieves its response and then parses the server entries in it. The response may contain multiple share links as plain text, their Base64 representation, or another format supported by the client. Whether it can be recognized depends on the returned content, not the length of the URL.

For example, token in https://example.com/sub?token=xxxx is only a demo parameter name. A real URL may include credentials in its path or use other query parameters. Removing parameters that seem irrelevant, changing capitalization, or omitting content after & can make the request return an error page instead of a server list.

Type → Subscribe

Recommended

Save a subscription URL you already have and use its update function to retrieve entries again. This recommendation applies only if you already have a confirmed subscription URL; it is not a recommendation for any connection service.

Best for: a clearly identified subscription endpoint whose entries need to be synced over time

Type → Select the matching protocol

In Add Server, select the matching type, such as Shadowsocks, VMess, VLESS, or Trojan, and save the connection parameters field by field. A manually added entry will not automatically receive new parameters just because the original subscription changes.

Best for: a complete set of parameters that you need to check field by field for one server

Sharing one entry from a subscription usually gives you only a snapshot of that server’s parameters at that time; it does not recover the full subscription URL. Conversely, having a subscription URL does not mean you have only one server entry; updates may add, remove, or change entries. Before editing entries generated by a subscription, record the differences, since a later update may overwrite your changes.

Identify and import links in Shadowrocket

Keep a copy of your original text before choosing an import method. Home is primarily for managing servers and connection status; Config manages rule configurations, so do not treat an arbitrary rule file URL as a server subscription. Scanning a QR code and reading from the clipboard are just ways to get the text—the content itself determines what kind of entry is created.

  1. Check the original text

    Check whether it begins with ss://, vmess://, vless://, or trojan://, or is an HTTPS subscription URL whose purpose has been clearly identified. Remove quotation marks and explanatory text added by a messaging app, but do not remove parameters within the link.

  2. Add a subscription

    For a subscription URL, go to Home → “+” in the top-right corner → Add Server → Type → Subscribe. Enter your complete URL in URL, save it, then update the subscription. Do not enter the full HTTPS URL in the Address field for a regular server.

  3. Import a single link

    Copy the complete single-server link, return to Shadowrocket, and follow the import prompt. Allow clipboard access if prompted by the system. To use a QR code, scan it from the entry at the top of Home and check the result before saving. Do not overwrite an entry you have not checked.

  4. Check the parameters

    Open the imported entry for editing. Check Type, Address, Port, and the corresponding UUID or Password, then verify the TLS and transport settings. If automatic recognition fails, go to Home → “+” → Add Server, choose the matching Type, and enter the existing parameters manually.

  5. Test the connection

    Return to Home, select the intended server, and connect. If prompted to add a VPN configuration for the first time, follow the system instructions to authorize it. Use Connectivity Test as a diagnostic, and confirm that the current Global Routing selection suits the test.

If you have copied the complete link but no import prompt appears, first check whether the system allows clipboard access and whether line breaks, spaces, or rich-text punctuation have truncated the text. Do not keep adding the same content to Subscribe: a parseable single-server URI does not become an updatable subscription endpoint.

Troubleshoot import errors, empty updates, and connection failures separately

These three issues occur at different stages. An import error means the text was not parsed correctly. An empty update means retrieving or parsing the subscription content did not produce the expected entries. A connection failure occurs after the server entry has been created. Troubleshooting by stage avoids repeatedly changing settings in the wrong place.

Global Routing options—Proxy, Direct, Config, and Scene—determine how traffic is routed; they do not turn an invalid link into correct parameters. In particular, successful access to a destination under Direct does not prove that the imported server works. Under Config, a request may match a DIRECT rule. To test a server, check both the selected entry and the current routing mode instead of relying only on whether a page opens in the browser.

Bottom line: keep the original text and change one thing at a time

Troubleshoot in this order: identify the text → retrieve the content → check the fields → test the connection. Record the exact error and each change. First restore the original parameters from the existing configuration, then investigate one issue at a time. Do not change the protocol, port, and TLS settings all at once, or you will not know which change affected the result.

Verify Shadowrocket on the App StoreSee purchase and restore information