Skip to content

API documentation

Control your proxies over HTTP: change the IP, restart the line, read SMS, set the OS fingerprint. Routes, responses, limits and examples.

update Updated

Quick start

The API acts on one proxy at a time: the one whose username and password you send.

  • Base URL: https://frproxy.com
  • Authentication: Basic Auth, with the proxy's username and password, not your account's. You will find them in My proxies.
  • Responses: JSON.

A first call, which changes the proxy's IP:

curl -X POST -u "USER:PASS" https://frproxy.com/api/v1/rotate

Replace USER and PASS with your proxy's credentials.

Routes

Method Route Purpose
GET or POST /api/v1/rotate Change the proxy's IP
GET or POST /apix/<port>/<token> Change the IP with a short link, without credentials
POST /api/v1/reboot Restart the line
GET /api/v1/sms Read received SMS
POST /api/v1/spoof Choose the OS fingerprint
GET or POST /api/v1/wg-rotate Change the IP of a WireGuard tunnel

Authentication

Every request carries the proxy's username and password, using Basic Auth. With curl, that is the -u option; with the Python requests library, the auth parameter.

curl -u "USER:PASS" https://frproxy.com/api/v1/sms
  • Changing the proxy's password in My proxies changes the API password too, immediately.
  • An expired proxy can no longer be controlled: the API answers 403.
  • Credentials can also be written in the URL: https://USER:PASS@frproxy.com/api/v1/rotate. Some browsers and tools reject that form; the short link, described below, does without it.

Changing the IP

GET or POST /api/v1/rotate

The proxy's mobile line reconnects to the network and gets a new IP from its carrier. The response comes back at once, and the rotation carries on in the background: about ten seconds, usually. Meanwhile, the proxy does not answer and open connections are cut.

curl -X POST -u "USER:PASS" https://frproxy.com/api/v1/rotate

Response:

{
  "success": true,
  "status": "rotation started — 轮换已启动 — ротация запущена",
  "wait_sec": 30,
  "retry_after": 30
}
Field Meaning
success true: the rotation has started.
status Informational message, in English, Chinese and Russian. Do not rely on it in a script.
wait_sec Seconds to wait before using the new IP.
retry_after Seconds to wait before asking for another rotation.

GET is accepted so that a plain link is enough: a browser, a bookmark or a tool can trigger the rotation. The response does not include the new IP; to read it, see "Checking the new IP", below.

On an Essential proxy

An Essential proxy shares its line with other proxies. The same route gives a new IP to that proxy alone, without touching the line or its neighbours. The response waits until the IP is ready, and includes it:

{
  "success": true,
  "status": "new ip assigned — 已分配新 IP — назначен новый IP",
  "ip": "203.0.113.42",
  "wait_sec": 0,
  "retry_after": 86400
}
  • One new IP per proxy every 24 h. Before that, the API answers 429 with the time left.
  • If the assignment takes more than 55 s, the response is 202, with the status "new ip in progress": the IP arrives shortly after.
  • Essential proxies have no short link in My proxies: use this route.

GET or POST /apix/<port>/<token>

The same IP change, with no username or password in the URL. The link can be pasted as is into a browser, a bookmark or a tool.

curl https://frproxy.com/apix/15002/a1b2c3d4e5f6
  • Each proxy's link is in My proxies, behind the "ROT IP" tag, and on the API page of your account.
  • Same response and same limits as /api/v1/rotate.
  • The token can only change this proxy's IP: it gives no access to the proxy or to your account. Keep it to yourself all the same: whoever holds it can change your IP at any time.
  • It does not change when you change the proxy's password.

Checking the new IP

The rotation does not return the IP it obtained, except on an Essential proxy. To read it, query an IP service through the proxy itself:

curl -x http://USER:PASS@frproxy.com:15002 https://api64.ipify.org

Replace 15002 with your proxy's HTTP port. The command prints the address that websites see, in IPv4 or IPv6 depending on the line. More methods in Testing your proxy.

Restarting the line

POST /api/v1/reboot

Restarts the device that carries the proxy's line, modem or phone. It is the remedy when the proxy stops answering. To change the IP, a rotation is enough, and it cuts for less time.

curl -X POST -u "USER:PASS" https://frproxy.com/api/v1/reboot

Response, once the device has received the order:

{
  "status": "ok"
}

If the order takes more than 40 s to go through, the API answers 202 without waiting for the end, and the restart completes on its own:

{
  "status": "pending",
  "message": "The restart is under way and continues on the device (up to 2 minutes for a phone)."
}
  • Allow one to two minutes for the line to come back. If it does not, wait 10 min before trying again: chaining restarts does not bring it back any faster.
  • Not available on an Essential proxy (403): the line is shared, and restarting it would cut the other proxies.
  • The delays between restarts and rotations are described under "Limits", below.

Reading SMS

GET /api/v1/sms

Returns the SMS received on the proxy's SIM card since the proxy was assigned to you. Messages that arrived before are not returned.

curl -u "USER:PASS" https://frproxy.com/api/v1/sms

Response:

[
  {
    "Index": "3",
    "Phone": "+33612345678",
    "Content": "Your verification code is 481920",
    "Date": "2026-10-27 14:05:12"
  }
]
Field Meaning
Index Number of the message on the SIM.
Phone Sender: a number, or a short name such as "Orange".
Content Text of the message.
Date Date received, as YYYY-MM-DD HH:MM:SS, Paris time.
  • Field names start with a capital letter.
  • If the SMS option is not active on your proxy, the list is empty: [].

Choosing the OS fingerprint

POST /api/v1/spoof?os=<value>

Brings the TCP/IP fingerprint of connections (TTL, window and TCP options) in line with the system your browser declares. HTTP headers are not changed. The principle is explained in TCP OS spoofing.

curl -X POST -u "USER:PASS" "https://frproxy.com/api/v1/spoof?os=windows"

Response:

{
  "status": "ok",
  "os": "windows"
}
os value Fingerprint
windows Windows
macos macOS
linux Linux
android Android
ios iOS
empty (os=) None: the device's original fingerprint
  • os can also be sent in the request body, as a form field. Capital letters are accepted.
  • The setting applies to the whole line: if several proxies share it, the latest setting applies to all of them.
  • Available if your plan includes it; otherwise, the API answers 403.

WireGuard tunnel

GET or POST /api/v1/wg-rotate

Each WireGuard tunnel has its own rotation link, on its card in My proxies. The username is wg followed by the tunnel number, and the password is the tunnel's token:

curl -u "wg12:TOKEN" https://frproxy.com/api/v1/wg-rotate
  • Same response and same limits as a proxy rotation.
  • A tunnel sold with a proxy goes out through the same line: changing the IP of one also changes the IP of the other.
  • If the proxy that carries the tunnel has expired, the API answers 403.

Limits

Action Limit
Changing the IP 1 every 30 s per proxy, panel, API and short link combined
New IP on an Essential proxy 1 every 24 h per proxy
Restarting the line 1 every 5 min
Reading SMS 100 per minute
Choosing the OS fingerprint 10 per minute

Two more rules protect the line, whichever proxy makes the request:

  • no restart during a rotation, nor in the 2 min that follow it;
  • no rotation in the 5 min that follow a restart, nor until the line is back (10 min at most).

Chaining rotations and restarts keeps the line down longer than either one alone.

A refusal answers 429 with a Retry-After header: the number of seconds to wait before trying again. A refusal uses up nothing.

Response codes

Code Meaning What to do
200 Success. Nothing.
202 Accepted: the action continues in the background. Wait, then check.
400 Invalid parameter, for example an unknown os value. Fix the request.
401 Missing or wrong credentials, or unknown short link. Check the proxy's credentials, or copy the link again.
403 Expired proxy, option not included in your plan, or action not available on this proxy. Renew the proxy, or use another action.
404 Malformed short link. Copy the link again from My proxies.
405 HTTP method not accepted. Use GET or POST, as shown.
409 A new IP is already in progress on this Essential proxy. Wait a few seconds.
422 New IP not available for now on this Essential proxy. Try again later.
429 Too early: a limit or a protection rule applies. Wait for the time given by Retry-After.
502 The line or the server is not responding. Try again in a minute; if it persists, contact support.

An error looks like this:

{
  "error": "…"
}

The message is meant for a human, and both its language and its wording may vary: your code should rely on the HTTP status code.

Full example

This Python script changes a proxy's IP, waits until it is ready, then prints the old and the new one. If it comes too early (429), it waits for the time requested and tries once more.

import time

import requests

API = "https://frproxy.com"
AUTH = ("USER", "PASS")
PROXY = "http://USER:PASS@frproxy.com:15002"


def current_ip():
    r = requests.get("https://api64.ipify.org",
                     proxies={"http": PROXY, "https": PROXY}, timeout=30)
    r.raise_for_status()
    return r.text


def rotate():
    r = requests.post(API + "/api/v1/rotate", auth=AUTH, timeout=90)
    if r.status_code == 429:
        time.sleep(int(r.headers["Retry-After"]))
        r = requests.post(API + "/api/v1/rotate", auth=AUTH, timeout=90)
    r.raise_for_status()
    time.sleep(r.json()["wait_sec"])


before = current_ip()
rotate()
print(before, "->", current_ip())

See also

Need a French mobile proxy? A real French 4G/5G line, one HTTP port and one SOCKS5 port, IP rotation on demand.

See the offersarrow_forward
grid_viewWiki