Documentation
SIMSwarm gateway documentation
One endpoint, targeting encoded in your credentials, and a different mobile exit on every request.
Quickstart
SIMSwarm is an ordinary forward proxy. There is no SDK to install and no API call to make before you can send traffic — everything is controlled through the credential you authenticate with.
SIMSwarm is sold to registered data-collection businesses only. Credentials are issued once an account has been approved — there is no public self-serve signup.
Once your account is approved we issue your credentials. Then send a request:
curl -x gb.simswarm.io:9000 -U "swarm11072:YOUR_SECRET" https://api.ipify.org 82.132.214.19 curl -x gb.simswarm.io:9000 -U "swarm11072:YOUR_SECRET" https://api.ipify.org 92.40.176.88 # different SIM, different carrier, different city
That is the entire integration. Point your existing crawler at the same host and port and every request it makes will leave from a different British mobile IP.
Endpoints
| Host | Port | Protocol | Notes |
|---|---|---|---|
| gb.simswarm.io | 9000 | HTTP, HTTPS (CONNECT) and SOCKS5 | Shared endpoint. All three protocols on this one port. |
| gb.simswarm.io | 9001–10000 | HTTP, HTTPS and SOCKS5 | Your dedicated port, if you have one. Pinned to your account. |
| app.simswarm.io | 443 | REST — usage & account | Your account, usage and, if enabled, the Fetch API. |
There are no regional endpoints. Every country we cover is reached from this same host and port by adding a targeting token to your username — -country-us, -country-de. Widening a crawl to a new country is a string change, not an integration.
One port, three protocols. The gateway identifies HTTP, HTTPS CONNECT and SOCKS5 from the first byte of the connection, so there is no separate SOCKS port to configure. The same credential works for all three.
Authentication
Standard proxy basic auth. The username carries your account name and your targeting rules, separated by hyphens; the password is your secret.
Account names never contain a hyphen. Everything after the first hyphen is parsed as targeting, so a name with one in it could not be told apart from a typo. That is deliberate: a mistyped option fails loudly instead of being swallowed into the username.
# structure <account>[-option-value]... : <secret> # plain — rotate on every request swarm11072:YOUR_SECRET # Manchester, EE only — still rotating on every request swarm11072-city-manchester-carrier-ee:YOUR_SECRET
IP whitelisting
Prefer not to put secrets in a proxy URL? If you have a dedicated port, we can whitelist your source addresses and you connect with no login at all — plain HTTP with no Proxy-Authorization, or SOCKS5 offering “no authentication”. Your pool, rotation, limits and metering are unchanged.
Two things worth knowing. The shared port on 9000 never honours a whitelist — whitelisting only applies to your own dedicated port. And if you do send a login it is always honoured and must be correct, which is how whitelisted customers still get targeting: send the username with its targeting tokens as normal.
Targeting parameters
| Parameter | Values | Effect |
|---|---|---|
| country | gb · us · ie · nl · de · fr · es · pl · au | Restrict to one country. Alias: cc. |
| city | manchester, chicago, amsterdam, … | Restrict to one city. Accepts a unique prefix. |
| carrier | ee · o2 · three · verizon · att · tmobile · orange · vodafone · … | Restrict to one network. Alias: isp. Country-scoped, so fr/orange and pl/orange are distinct. |
| server | a server name | Restrict to one specific server. Accepts a unique prefix. |
| Code | Meaning | What to do |
|---|---|---|
| 400 | Targeting could not be parsed or matched | The message names the problem: unknown option, missing value, unknown city, or an ambiguous prefix with its candidates. Fix the username. |
| 403 | Protocol not permitted on this account | Some accounts are SOCKS5-only. Use the protocol your account is configured for. |
| 405 | Method not understood by the proxy | Check you are speaking HTTP proxy, HTTPS CONNECT or SOCKS5. |
| 407 | Bad or unknown credentials | Check the account name and secret. On a dedicated port, another account’s valid credentials are still refused — the port is pinned to you. |
| 413 | Response larger than your per-request limit | Raise the limit or fetch something smaller. On plain HTTP we refuse before the body moves; on HTTPS the transfer is cut when it crosses the limit. |
| 429 | Daily data cap reached | Resets at midnight UTC. Ask us to raise the cap if you need more. |
Beyond that, the gateway gives each request up to three attempts on different exits. An exit that has not answered within three seconds is abandoned and the next one dialled. Those retries are ours, not yours — you do not need to layer aggressive client-side retries on top, and doing so mostly multiplies load on the target.
Account & usage API
Bearer-authenticated JSON at app.simswarm.io, so you can reconcile our figures against your own rather than taking an invoice on trust.
curl -H "Authorization: Bearer sws_live_…" "https://app.simswarm.io/v1/usage?from=2026-09-01&to=2026-09-30"
{
"period": { "from": "2026-09-01", "to": "2026-09-30" },
"bytes": 161061273600,
"gb": 150.0,
"by_day": [ { "date": "2026-09-01", "gb": 4.9 }, … ]
}
/v1/account returns your endpoint, your dedicated port if you have one, your whitelisted addresses, your daily cap and your per-request size limit.
We do not publish the size or composition of the pool behind your account — how many exits or addresses sit behind it, or their health. Your pool has a name and a set of countries, cities and carriers you can target within it; the inventory itself is not customer-visible.
Fetch API
Optional, and a different shape of product: give us a URL, get the page body back. We handle the exit, the retries and the browser-shaped TLS handshake, so you are not maintaining a scraping client at all.
curl "https://app.simswarm.io/v1/fetch?token=sws_live_…&url=https%3A%2F%2Fwww.example.co.uk%2Fproduct%2F123&country=gb"
The response body is the target’s. The headers tell you what happened:
X-Target-Status: 404 # the TARGET's code, not ours — a 404 means discontinued X-Swarm-Result: ok X-Swarm-Attempts: 1 X-Swarm-Ms: 640 X-Swarm-Billed: 1
- Only successful fetches are billed. Blocks, timeouts and errors are logged free. Up to five attempts, a different mobile exit each time.
- Our own status codes are separate from the target’s:
502blocked,504upstream error,400a bad request,401a bad token. - Pass your own headers through as
X-Fetch-<Header>—X-Fetch-Cookie,X-Fetch-Accept-Language. - The client presents a real browser’s TLS fingerprint and HTTP/2 framing, and keeps a cookie jar per host, which is what gets several anti-bot systems to answer at all.
- JavaScript rendering is not available yet. Pages whose prices are drawn client-side will come back as the shell the server sent.
Honest about the ceiling: on a 40-page basket across nine retailers we returned 100% of pages with 95% carrying the real price, median 0.9 s. But some sites — Akamai Bot Manager and Imperva in particular — defeat us and everyone else, and we will tell you which of yours do before you buy rather than after. Ask for a measured trial on your three hardest targets.
Practical advice
- Give it time. Mobile is not datacentre. Set client timeouts to 30 seconds or more — a 5-second timeout will fail perfectly good requests and still bill you for the bytes already moved.
- Design for statelessness. Every request gets a different IP, so anything that depends on continuity — a login, a basket, a cursor tied to a session cookie — will not work today. Fetch pages that stand on their own, and keep any state your side.
- Do not pin a city unless the data changes by city. Targeting shrinks the pool you can draw from, which raises queueing at peak. Store locators and regional pricing justify it; a generic product page does not.
- Do not score exits by IP. CGNAT means one address can serve many subscribers, and a mobile IP can rotate underneath you mid-connection. Judge a crawl on whether the page came back with the content you expected, not on which address delivered it.
- Fetch what you need. You are billed on bytes, so blocking images, fonts and video in a headless browser typically cuts your bill by 60–80%.
Limits & fair use
Three limits are set per account, and all three are visible to you on /v1/account:
- Concurrent connections. Agreed with you when the account is set up and raised on request — tell us how many workers you intend to run.
- Daily data cap. Reaching it returns
429until midnight UTC. It exists so a runaway crawl cannot spend your month in an afternoon. - Per-request size limit. Optional, returns
413. Useful protection against accidentally pulling a video through mobile data.
Accounts are issued to registered companies for commercial data collection. Personal use, resale of raw proxy access, social media automation, bulk account creation and limited-release purchasing bots are outside the terms and will end the account.
Prohibited outright: credential stuffing, card testing, fraud, malware distribution, CSAM, and any traffic directed at UK critical national infrastructure. Accounts above £500 a month are KYC-verified. We respond to abuse reports within one business day and can trace any exit IP back to the account and SIM that used it.
Ready to point something at it?
Approved business accounts start with an evaluation gigabyte.