Contents
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 proxieschanges 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
429with the time left. - If the assignment takes more than 55 s, the response is
202, with thestatus"new ip in progress": the IP arrives shortly after. - Essential proxies have no short link in
My proxies: use this route.
Short link
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 |
oscan 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
- Changing your IP: when to do it, and when not to.
- Receiving SMS
- TCP OS spoofing
- AI agents and automation
- Common errors: 407, timeout, connection refused.
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