Skip to main content
← Back to blog
by Dev Team
tutorialboost

Complete Guide to XCROP Boost API — Automate Your Social Growth

Overview

The XCROP Boost API lets you programmatically place and manage social media growth orders. Whether you are building a dashboard for clients, automating campaign launches, or integrating social growth into your SaaS product, the Boost API provides everything you need.

All Boost endpoints use the same authentication, credit system, and response format as the rest of the XCROP API.

Base URL

https://xcrop.io/api/v2/boost

Authentication

All requests require your API key in the Authorization header:

Authorization: Bearer xc_live_your_api_key_here

API Endpoints

EndpointMethodDescription
`/boost/services`GETList all available services
`/boost/order`POSTPlace a new order
`/boost/order/:id`GETCheck order status
`/boost/order/:id/cancel`POSTCancel a pending order
`/boost/order/:id/refill`POSTRequest a refill for completed order
`/boost/orders`GETList your orders (paginated)

Listing Available Services

Fetch the full service catalog to see what is available, including rates, limits, and dripfeed support.

Python

PYTHON
import requests
import os

API_KEY = os.environ["XCROP_API_KEY"]
BASE_URL = "https://xcrop.io/api/v2/boost"
HEADERS = {
    "Authorization": "Bearer " + API_KEY,
    "Content-Type": "application/json"
}

# List all services
response = requests.get(BASE_URL + "/services", headers=HEADERS)
services = response.json()["data"]

# Filter by platform
twitter_services = [s for s in services if s["platform"] == "twitter"]

for svc in twitter_services:
    print(svc["id"] + " - " + svc["name"])
    print("  Rate: $" + str(svc["rate"]) + " per 1K")
    print("  Min: " + str(svc["minQuantity"]) + " / Max: " + str(svc["maxQuantity"]))
    print("  Dripfeed: " + str(svc["dripfeed"]))
    print("  Refill: " + str(svc["refill"]))
    print()

JavaScript

JAVASCRIPT
const API_KEY = process.env.XCROP_API_KEY;
const BASE_URL = "https://xcrop.io/api/v2/boost";
const headers = {
  "Authorization": "Bearer " + API_KEY,
  "Content-Type": "application/json"
};

// List all services
const response = await fetch(BASE_URL + "/services", { headers });
const { data: services } = await response.json();

// Filter by platform
const twitterServices = services.filter(s => s.platform === "twitter");

for (const svc of twitterServices) {
  console.log(svc.id + " - " + svc.name);
  console.log("  Rate: $" + svc.rate + " per 1K");
  console.log("  Min: " + svc.minQuantity + " / Max: " + svc.maxQuantity);
  console.log("  Dripfeed: " + svc.dripfeed);
  console.log("  Refill: " + svc.refill);
}

Placing an Order

Basic Order

PYTHON
# Order 5,000 Twitter followers
response = requests.post(
    BASE_URL + "/order",
    headers=HEADERS,
    json={
        "service": "tw-followers-1",
        "link": "https://x.com/yourprofile",
        "quantity": 5000
    }
)

order = response.json()["data"]
print("Order ID: " + order["order_id"])
print("Status: " + order["status"])        # "pending" or "processing"
print("Credits: " + str(order["credits"]))  # Credits charged
print("Price: $" + str(order["price_usd"])) # USD equivalent

Order with Dripfeed

Add a dripfeed parameter to spread delivery over time:

PYTHON
# Order 10,000 Instagram likes with 12-hour dripfeed
response = requests.post(
    BASE_URL + "/order",
    headers=HEADERS,
    json={
        "service": "ig-likes-1",
        "link": "https://www.instagram.com/p/ABC123/",
        "quantity": 10000,
        "dripfeed": "12h"  # Options: instant, 3h, 6h, 12h, 24h, 3d, 7d
    }
)

order = response.json()["data"]
print("Order ID: " + order["order_id"])
print("Dripfeed: " + order["dripfeed"])
print("Estimated completion: " + order["estimated_completion"])

JavaScript Order Example

JAVASCRIPT
// Order 1,000 TikTok likes with 6-hour dripfeed
const orderResponse = await fetch(BASE_URL + "/order", {
  method: "POST",
  headers,
  body: JSON.stringify({
    service: "tt-likes-1",
    link: "https://www.tiktok.com/@user/video/1234567890",
    quantity: 1000,
    dripfeed: "6h"
  })
});

const { data: order } = await orderResponse.json();
console.log("Order ID: " + order.order_id);
console.log("Status: " + order.status);
console.log("Credits charged: " + order.credits);

Order Parameters

ParameterTypeRequiredDescription
`service`stringYesService ID (e.g., `tw-followers-1`)
`link`stringYesTarget URL (profile, tweet, video, etc.)
`quantity`numberYesAmount to deliver (within service min/max)
`dripfeed`stringNoDelivery speed preset: `instant`, `3h`, `6h`, `12h`, `24h`, `3d`, `7d`

Checking Order Status

Python

PYTHON
# Check order status
order_id = "boost_abc123"
response = requests.get(
    BASE_URL + "/order/" + order_id,
    headers=HEADERS
)

order = response.json()["data"]
print("Status: " + order["status"])
print("Delivered: " + str(order["delivered"]) + " / " + str(order["quantity"]))
print("Remaining: " + str(order["remaining"]))

JavaScript

JAVASCRIPT
// Check order status
const orderId = "boost_abc123";
const statusResponse = await fetch(BASE_URL + "/order/" + orderId, { headers });
const { data: status } = await statusResponse.json();

console.log("Status: " + status.status);
console.log("Delivered: " + status.delivered + " / " + status.quantity);
console.log("Remaining: " + status.remaining);

Order Status Values

StatusDescription
`pending`Order received, queued for processing
`processing`Delivery in progress
`completed`Full quantity delivered
`partial`Partially delivered (remaining refunded)
`cancelled`Cancelled by user (undelivered portion refunded)
`refilling`Automatic refill in progress

Cancelling an Order

Cancel a pending or in-progress order. Undelivered credits are refunded automatically.

PYTHON
# Cancel an order
response = requests.post(
    BASE_URL + "/order/" + order_id + "/cancel",
    headers=HEADERS
)

result = response.json()["data"]
print("Status: " + result["status"])              # "cancelled"
print("Refunded credits: " + str(result["refunded_credits"]))
JAVASCRIPT
// Cancel an order
const cancelResponse = await fetch(BASE_URL + "/order/" + orderId + "/cancel", {
  method: "POST",
  headers
});

const { data: cancelResult } = await cancelResponse.json();
console.log("Refunded credits: " + cancelResult.refunded_credits);

Requesting a Refill

For services with refill guarantees, you can manually request a refill if the delivered count has dropped:

PYTHON
# Request a refill
response = requests.post(
    BASE_URL + "/order/" + order_id + "/refill",
    headers=HEADERS
)

result = response.json()["data"]
print("Refill status: " + result["status"])  # "refilling"
print("Refill amount: " + str(result["refill_quantity"]))

> Note: Refills are free and only available for services with a refill guarantee. The refill window is typically 30 days (365 days for YouTube views and Spotify plays).

Listing Your Orders

Fetch a paginated list of all your Boost orders:

PYTHON
# List recent orders
response = requests.get(
    BASE_URL + "/orders",
    headers=HEADERS,
    params={
        "limit": 20,
        "offset": 0,
        "status": "completed"  # Optional filter: pending, processing, completed, cancelled
    }
)

result = response.json()
orders = result["data"]
total = result["meta"]["total"]

print("Total orders: " + str(total))
for o in orders:
    print(o["order_id"] + " | " + o["service"] + " | " + o["status"] + " | " + str(o["delivered"]) + "/" + str(o["quantity"]))

Error Handling

The Boost API returns standard HTTP status codes and error objects:

PYTHON
response = requests.post(
    BASE_URL + "/order",
    headers=HEADERS,
    json={
        "service": "tw-followers-1",
        "link": "https://x.com/yourprofile",
        "quantity": 5  # Below minimum of 10
    }
)

if response.status_code != 200:
    error = response.json()
    print("Error: " + error["error"]["message"])
    # "Quantity 5 is below minimum of 10 for service tw-followers-1"

Common Error Codes

HTTP StatusError CodeDescription
400`invalid_service`Service ID does not exist
400`invalid_quantity`Quantity outside min/max range
400`invalid_link`Target URL is not valid for the service platform
400`dripfeed_not_supported`Service does not support dripfeed delivery
402`insufficient_credits`Not enough credits for this order
404`order_not_found`Order ID does not exist
409`already_cancelled`Order was already cancelled
429`rate_limited`Too many requests, retry after delay

Robust Error Handling Example

JAVASCRIPT
async function placeBoostOrder(service, link, quantity, dripfeed) {
  const response = await fetch(BASE_URL + "/order", {
    method: "POST",
    headers,
    body: JSON.stringify({ service, link, quantity, dripfeed })
  });

  const result = await response.json();

  if (!response.ok) {
    const errorCode = result.error?.code || "unknown";
    const message = result.error?.message || "Unknown error";

    switch (errorCode) {
      case "insufficient_credits":
        console.error("Not enough credits. Top up at xcrop.io/dashboard/billing");
        break;
      case "invalid_quantity":
        console.error("Quantity out of range: " + message);
        break;
      case "rate_limited":
        const retryAfter = response.headers.get("Retry-After") || 60;
        console.error("Rate limited. Retry after " + retryAfter + "s");
        break;
      default:
        console.error("Order failed: " + message);
    }
    return null;
  }

  return result.data;
}

// Usage
const order = await placeBoostOrder("tw-likes-1", "https://x.com/user/status/123", 500, "6h");
if (order) {
  console.log("Order placed: " + order.order_id);
}

Full Workflow Example

Here is a complete Python script that lists services, places an order with dripfeed, and polls for completion:

PYTHON
import requests
import time
import os

API_KEY = os.environ["XCROP_API_KEY"]
BASE_URL = "https://xcrop.io/api/v2/boost"
HEADERS = {
    "Authorization": "Bearer " + API_KEY,
    "Content-Type": "application/json"
}

# 1. List Twitter services
response = requests.get(BASE_URL + "/services", headers=HEADERS)
services = response.json()["data"]
tw_services = [s for s in services if s["platform"] == "twitter"]
print("Available Twitter services:")
for s in tw_services:
    print("  " + s["id"] + ": " + s["name"] + " ($" + str(s["rate"]) + "/1K)")

# 2. Place order with dripfeed
response = requests.post(
    BASE_URL + "/order",
    headers=HEADERS,
    json={
        "service": "tw-followers-1",
        "link": "https://x.com/yourprofile",
        "quantity": 1000,
        "dripfeed": "24h"
    }
)

if response.status_code != 200:
    print("Error: " + response.json()["error"]["message"])
    exit(1)

order = response.json()["data"]
order_id = order["order_id"]
print("Order placed: " + order_id)
print("Credits charged: " + str(order["credits"]))

# 3. Poll for completion
while True:
    response = requests.get(BASE_URL + "/order/" + order_id, headers=HEADERS)
    status = response.json()["data"]

    delivered = status["delivered"]
    total = status["quantity"]
    pct = int((delivered / total) * 100)
    print("Progress: " + str(delivered) + "/" + str(total) + " (" + str(pct) + "%) - " + status["status"])

    if status["status"] in ("completed", "partial", "cancelled"):
        break

    time.sleep(300)  # Check every 5 minutes

print("Done! Final status: " + status["status"])

Rate Limits

Boost API shares the same rate limits as your XCROP plan:

PlanRequests/min
Starter10
Basic30
Pro60
Pay as You Go30

Order placement is additionally limited to 30 orders per minute to prevent abuse.

Next Steps

Browse the Boost catalog in your dashboard to see all available services
Read the Dripfeed Guide to learn best practices for natural-looking growth
Check the API reference for complete endpoint documentation
Join our Discord for developer support and community discussion