Your panel.
Connected to Followex.
Discover Rubino services, submit orders and track independently verified delivery. Choose the integration that fits your panel.
راهنمای اتصال پنل شما به فالو ایکس — برای پنلهای Perfect Panel و پنلهای اختصاصی. کلید اتصال را از پنل همکاران دریافت کنید.
Perfect Panel ↗
One POST endpoint. Familiar action-based requests.
https://api.followex.ir/api/v2
REST APICustom panels ↗
JSON requests, Bearer authentication and paginated orders.
https://api.followex.ir/api/v1/panel
Get connected
- Sign in to the Provider Portal. Open providers.followex.ir with the username and password supplied by Followex.
- Create a panel connection. In اتصالات پنلها, choose Perfect Panel or Custom REST and enter your panel details. Use one connection per external panel.
- Save the issued key securely. The full key is shown only when issued. Use it only from your server. Keys are protocol-specific, scoped and expire after 30 days. Rotate or revoke them in the portal.
- Discover services, then check credit. Successful discovery of an eligible, nonempty catalog activates a configuring connection. Ordering also requires approved access, an ordering key and sufficient available wallet credit.
Keep API keys out of browser code, URLs, screenshots and public tickets. If support needs access, use a separate restricted connection and their approved private credential-sharing method; revoke it after testing. Your portal password is not an API key.
Perfect Panel API
https://api.followex.ir/api/v2Send application/x-www-form-urlencoded. Put key and action in the request body, not the query string. Every request requires your Perfect Panel connection key.
Discover services
curl 'https://api.followex.ir/api/v2' \
--data-urlencode 'key=YOUR_CONNECTION_KEY' \
--data 'action=services'
[
{
"service": 1,
"name": "Rubino Followers",
"type": "Default",
"category": "Rubino",
"rate": "1.001",
"currency": "IRT",
"min": 10,
"max": 100000,
"refill": false,
"cancel": true,
"service_reference": "follow",
"platform": "Rubino"
}
]
rate is the global selling price per 1,000 followers in Tomans. Service IDs are connection-local aliases: always use the ID returned for your own connection. An empty catalog is not permission to submit an arbitrary ID.
Check available balance
curl 'https://api.followex.ir/api/v2' \
--data-urlencode 'key=YOUR_CONNECTION_KEY' \
--data 'action=balance'
{ "balance": "100.842920", "currency": "IRT" }
Submit an order
| Field | Required | Meaning |
|---|---|---|
key | Yes | Perfect Panel connection key. |
action | Yes | add |
service | Yes | Numeric ID from your services response. |
link | Yes | Rubino target profile URL; maximum 2,048 characters. |
quantity | Yes | Whole number within published service limits. |
external_order_id | One identity required | Your stable order reference. Alternatively send the Idempotency-Key HTTP header. This is a Followex extension. |
target_profile_id | Conditional | Expected immutable Rubino profile ID when required by target resolution. Do not guess an ID from a username. |
curl 'https://api.followex.ir/api/v2' \
--data-urlencode 'key=YOUR_CONNECTION_KEY' \
--data 'action=add' \
--data 'service=1' \
--data-urlencode 'link=https://rubino.ir/example' \
--data 'quantity=10' \
--data-urlencode 'external_order_id=SHOP-1001'
{ "order": 23501 }
order is the Followex order ID. Save it with your own reference. The target must be independently resolved before admission; the example URL is illustrative and is not a test account.
Read order status
Use action=status and either order=23501 for one order, or orders=23501,23502 for up to 100 IDs. Do not send both fields.
curl 'https://api.followex.ir/api/v2' \
--data-urlencode 'key=YOUR_CONNECTION_KEY' \
--data 'action=status&order=23501'
A single order returns the order object below. A batch returns an object keyed by Followex order ID. An unknown batch item returns {"error":"Unknown order"} for that item; other authorized items can still succeed.
Request cancellation
curl 'https://api.followex.ir/api/v2' \
--data-urlencode 'key=YOUR_CONNECTION_KEY' \
--data 'action=cancel&orders=23501,23502'
[
{ "order": 23501, "cancel": 1 },
{ "order": 23502, "cancel": { "error": "Cancellation pending or unavailable" } }
]
Only cancel: 1 confirms cancellation. A request can remain pending while an in-flight action is reconciled. Poll status; do not assume immediate release of all reserved credit. The form cancellation action accepts orders, including a single ID in that field.
List this connection’s orders FOLLOWEX EXTENSION
Use action=orders. The response contains items (up to 25 order objects) and next_before. For the next page send before equal to that value; a null value means no next page.
Custom REST API
https://api.followex.ir/api/v1/panelUse a Custom REST connection key in Authorization: Bearer YOUR_CONNECTION_KEY. Quantities and service IDs are JSON integers; financial amounts are decimal strings. A Perfect Panel key cannot be reused as a REST key.
| Method | Path | Result |
|---|---|---|
| GET | /services | Service catalog with connection-local numeric IDs and effective limits. |
| GET | /balance | Available balance and currency. |
| POST | /orders | Accept an order and return its full projection. |
| GET | /orders/{id} | One authorized order’s current projection. |
| GET | /orders?before={cursor} | items and next_before; omit the query for the first page. |
| POST | /orders/{id}/cancel | Current order projection after cancellation processing. Check cancellation_confirmed. |
Discover services
curl 'https://api.followex.ir/api/v1/panel/services' \
-H 'Authorization: Bearer YOUR_CONNECTION_KEY'
Create an order
Send Content-Type: application/json. Required JSON fields: service_id, quantity, target. Supply a stable external_order_id or Idempotency-Key header. target_profile_id is conditional, as in the form API. Unknown fields and string quantities are rejected.
curl 'https://api.followex.ir/api/v1/panel/orders' \
-H 'Authorization: Bearer YOUR_CONNECTION_KEY' \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: SHOP-1001' \
--data '{"service_id":1,"quantity":10,"target":"https://rubino.ir/example","external_order_id":"SHOP-1001"}'
Track or cancel
curl 'https://api.followex.ir/api/v1/panel/orders/23501' \
-H 'Authorization: Bearer YOUR_CONNECTION_KEY'
curl -X POST 'https://api.followex.ir/api/v1/panel/orders/23501/cancel' \
-H 'Authorization: Bearer YOUR_CONNECTION_KEY'
Both return the same order-field contract. The REST status projection can explicitly represent Recovery required or Review required; do not interpret those states as success or safe permission to create another order.
Read an order with confidence
This illustrative terminal partial order delivered 3 of 10 followers. At a rate of 1.001 IRT per 1,000, its original cost is 0.010010 IRT. Only the verified portion is settled.
{
"order": 23501,
"external_order_id": "SHOP-1001",
"status": "Partial",
"quantity": 10,
"completed": 3,
"remains": 7,
"live_remaining_followers": 7,
"target_initial_follower_count": 1250,
"target_initial_follower_count_observed_at": "2026-11-03T09:00:00Z",
"start_count": "1250",
"currency": "IRT",
"order_cost": "0.010010",
"reserved": "0.010010",
"charge": "0.003003",
"released": "0.007007",
"cancellation_confirmed": false
}
| Field / type | Meaning |
|---|---|
order · integer | Followex order ID, scoped to this connection. |
external_order_id · string | Your stable purchase reference. |
status · string | Current evidenced state; see lifecycle below. |
quantity · integer | Accepted requested quantity. |
completed · integer | Independently verified deliveries credited toward this specific order. |
remains, live_remaining_followers · integer | max(0, quantity − completed). Pending, uncertain and duplicate results do not reduce it. |
target_initial_follower_count · integer or null | Immutable pre-execution observation. Zero is a real observed zero; null means unavailable. |
target_initial_follower_count_observed_at · timestamp or null | ISO 8601 observation time of the stored initial count. |
start_count · string or null | Compatibility representation of that same initial count, not a live total. |
currency · string | IRT: Iranian Toman. |
order_cost, reserved · decimal string | Original order reservation, not the wallet’s current held balance. |
charge · decimal string | Amount settled for independently verified delivery. |
released · decimal string | Unused reserved amount returned to available credit. |
cancellation_confirmed · boolean | True only when requested cancellation is confirmed at terminal closeout. |
Order lifecycle & cancellation
Pending means accepted work is outstanding. In progress means fulfillment is underway. Completed requires the full requested quantity with consistent verified delivery and financial evidence. Partial is a terminal closeout with fewer verified deliveries. Canceled is confirmed cancellation without full delivery.
REST can also return Failed, Review required and Recovery required. The Perfect Panel adapter returns an error for those unsupported/uncertain representations. Inconsistent evidence can return HTTP 503 instead of a normal order object.
Cancellation closes new admission for that order. Already-dispatched work may need reconciliation; cancellation does not undo an external action. Verified work is charged, unused credit is released once at closeout, and uncertain work keeps its reservation until resolved. A completed delivery is not automatically reversed because of a later unfollow.
One wallet. Exact pricing.
All connections belonging to your provider account share one prepaid Toman wallet. The balance endpoint returns available credit. Reserved credit covers outstanding orders; spent credit records settled deliveries. Funding is handled manually by an authorized Followex administrator.
quantity × rate_per_1000 ÷ 1000The selling rate is global; accepted orders retain their original price. Any whole-number quantity within the published bounds is valid, including quantities that are not multiples of 1,000. Global bounds are 10–100,000; service and account policy may be tighter. Admission atomically reserves sufficient available credit, including when requests arrive concurrently.
Amounts are exact decimal strings. Use a decimal or fixed-point library, preserve fractional Tomans and do not round API amounts or calculate with binary floating-point. A rounded portal display does not change ledger amounts. There are no automatic deposits or payment-gateway top-ups in this integration.
Retry the request, not the purchase
Every add needs an identity: external_order_id or the Idempotency-Key header. References contain 1–128 ASCII characters, begin with a letter or digit and then use letters, digits, ., _, : or -.
| Situation | Correct action |
|---|---|
| Timeout or lost acknowledgement | Retry with the same reference, connection and payload. Keep any supplied header stable. |
| Same reference, same order | Followex returns the original order; no second reservation. |
| Same reference, changed payload | HTTP 409 conflict. Do not reinterpret it as a new purchase. |
| Second intentional purchase with identical details | Use a new unique reference. |
| No identity supplied | Admission is refused before tasks or wallet reservation; inspect API activity before retrying. |
References are isolated by connection. Rotating a connection’s key preserves its order namespace. Revoking or disabling a connection stops new API access; it does not automatically cancel accepted orders. Use the portal’s Orders and API activity to investigate uncertain outcomes.
Errors & request limits
{ "error": "CONNECTION_RATE_LIMITED" }
| HTTP | Meaning / action |
|---|---|
| 200 | Successful protocol response. A batch may still contain per-order error objects; inspect every item. |
| 400 / 413 / 415 / 422 | Invalid fields, oversized body or wrong content type. Correct the request before retrying. |
| 401 | Invalid, expired or revoked credential. Check the connection and protocol. |
| 403 | Missing scope, inactive connection or account policy refusal. |
| 404 | Unknown/unauthorized order or unavailable adapter. Verify the URL and your connection’s order ID. |
| 408 | Request body timed out. |
| 409 | Funding, quota or conflicting idempotency identity. Inspect the error and portal state. |
| 429 | Configured provider or connection rate limit reached. Back off; do not retry in a tight loop. |
| 503 | Temporary evidence/storage uncertainty or required reconciliation. Preserve the original order identity and inspect status/activity. |
Save the response’s X-Correlation-ID, request time, action and your order reference for support. Do not send the API key in diagnostic logs. Not every API error uses HTTP 200.
- Request body: at most 8,192 bytes. Form requests: at most 32 fields; no duplicates or query parameters.
- Single/multiple status and cancellation: at most 100 IDs per request.
- Compressed request bodies are unsupported. JSON create requests reject duplicate and unknown fields.
- Request-rate, daily quantity and open-order limits depend on the provider’s configured policy; there is no universal published requests-per-minute value.
What this API supports
Available
- Rubino follower services (Default)
- Service discovery and prepaid balance
- Order submission with stable retry identity
- Single/batch form status; REST order pagination
- Order cancellation with truthful pending outcomes
- Initial follower baseline and verified remaining count
Not implemented
- Refill and refill status
- Automatic replacement after later follower drops
- Drip-feed:
runsandinterval - Package or custom-comment orders
- Likes, comments or other invented service types
- Automatic wallet top-ups
refill: false is intentional. The connection adapter does not implement refill or refill_status; an authenticated request reaching action dispatch is rejected as unsupported. Retry/recovery preserves the original purchase and is not a refill service.