API Documentation

The Social Crow API lets you place and manage orders programmatically — no web interface needed. It is designed for resellers and developers who want to automate their workflow or build tooling on top of Social Crow's services.

Generate an API key on your account API page.
TypeScript SDK— fully typed, Result pattern, no try/catch
npm install @socialcrow/sdk

Requires Node.js 18+. See the SDK section for usage examples.

Authentication

Every request must include your API key in the Authorization header as a Bearer token. Requests without a valid key receive a 401 response with error code UNAUTHORIZED.

Generate or regenerate your key at any time from the API settings page. Regenerating immediately invalidates the previous key.

curl https://www.socialcrow.co/api/v1/balance \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

Quick Start

Three steps to place your first order: check your balance, find a service, and submit the order.

# 1. Check your balance
curl https://www.socialcrow.co/api/v1/balance \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

# 2. List available services
curl https://www.socialcrow.co/api/v1/services \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

# 3. Place an order
curl -X POST https://www.socialcrow.co/api/v1/orders \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"serviceId":"1234","link":"https://instagram.com/username","quantity":1000}'

TypeScript SDK

The official TypeScript SDK wraps the REST API with full types and a Result pattern: every method returns Result<T> instead of throwing. You never need try/catch.

The Result<T> type
result.ok

true — order succeeded

result.data is available and fully typed. TypeScript will not let you access result.error in this branch.

!result.ok

false — something went wrong

result.error.code is a typed union of all possible error codes — your IDE autocompletes every value. result.error.message is a human-readable string with context. No exceptions are thrown.

npm install @socialcrow/sdk
Requires Node.js 18+ for native fetch support.
# The SDK wraps the REST API — use the TypeScript tab for SDK usage.

Endpoints

GET/services

List Services

Returns all active services with their IDs, names, categories, and customer-facing pricing. Cache this response — services change infrequently.

Response fields

idstring
Unique service identifier — use this in order creation
namestring
Human-readable service name
categorystring
Service category (e.g. Instagram, Twitter)
typestring
Determines which fields are required when ordering. If the value contains "comment" (e.g. "custom comments"), the comments field is required. All other types (e.g. "default") use the standard quantity + link fields.
minnumber
Minimum order quantity
maxnumber
Maximum order quantity
ratenumber
Customer price per 1,000 units in USD
dripfeedboolean
Whether this service supports drip-feed (runs + interval)
refillboolean
Whether this service has refill support
curl https://www.socialcrow.co/api/v1/services \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
POST/orders

Create Order

Places a single order using your account balance. Returns an orderId, the charge deducted from your balance, and the currency on success (HTTP 201). Each call creates exactly one order for one service.

Response fields (HTTP 201)

orderIdUnique short ID for the order. Use with GET /orders/:id to track status.
chargeAmount deducted from your account balance for this order, as a decimal number.
currencyCurrency of the charge (always "USD").

Required fields by service type

type: "default"serviceId link quantity
type contains "comment"serviceId link quantity comments required
dripfeed: trueany of the above, plus runs interval (optional)
Check the type field from GET /services before placing an order. If type.toLowerCase().includes("comment") is true, you must include a comments array — the API will return MISSING_COMMENTS otherwise.
ParameterTypeRequiredDescription
serviceIdstringrequiredService ID from GET /services
linkstringrequiredTarget URL or username
quantityintegerrequiredNumber of units — must be within the service's min/max
commentsstring[]optionalArray of comment strings. Required when service.type contains "comment" (e.g. "custom comments"). Omit for all other service types.
runsintegeroptionalNumber of delivery runs. Only valid when service.dripfeed is true.
intervalintegeroptionalMinutes between runs. Required when runs is provided.
curl -X POST https://www.socialcrow.co/api/v1/orders \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "serviceId": "1234",
    "link": "https://instagram.com/username",
    "quantity": 1000
  }'

# Response (HTTP 201)
# { "data": { "orderId": "V1StGXR8", "charge": 1.25, "currency": "USD" } }
POST/quote

Get Quote

Get the exact charge amount for an order without placing it. Uses the same pricing logic as order creation — including rounding and minimums — so the returned amount matches what would be deducted from your balance. Useful when service rates are per 1,000 units but you order fewer (e.g. 100 followers at $6.24/1,000); the actual charge may differ from a naive rate × quantity ÷ 1000.

Response fields (HTTP 200)

serviceIdService ID that was quoted (echoed from the request).
quantityQuantity that was quoted (echoed from the request).
chargeAmount that would be deducted from your account balance, as a decimal number.
currencyCurrency of the charge (always "USD").

Same validation as Create Order: quantity must be within the service's min/max; drip-feed and comment-type services require their respective fields.

ParameterTypeRequiredDescription
serviceIdstringrequiredService ID from GET /services
quantityintegerrequiredNumber of units — must be within the service's min/max
commentsstring[]optionalRequired when service.type contains "comment"
runsintegeroptionalNumber of delivery runs. Only valid when service.dripfeed is true.
intervalintegeroptionalMinutes between runs. Required when runs is provided.
curl -X POST https://www.socialcrow.co/api/v1/quote \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"serviceId":"1234","quantity":100}'

# Response (HTTP 200)
# { "data": { "serviceId": "1234", "quantity": 100, "charge": 0.63, "currency": "USD" } }
GET/orders/:id

Get Order Status

Returns the current status of a single order, synced fresh from the external panel on each call. Only orders placed via API (tied to your account) are accessible.

Status values

PENDINGQueued for delivery
SENDINGIn progress
DELIVEREDComplete
ISSUERequires attention
curl https://www.socialcrow.co/api/v1/orders/V1StGXR8 \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
POST/orders/bulk

Bulk Order Status

Check the status of up to 100 orders in a single request. Returns a map of orderId → status. Order IDs that don't belong to your account return an error entry rather than a 404 — useful for batch reconciliation.

ParameterTypeRequiredDescription
ordersstring[]requiredArray of order IDs (orderIdShort). Maximum 100.
curl -X POST https://www.socialcrow.co/api/v1/orders/bulk \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orders": ["V1StGXR8", "Xk9pLqM2", "unknown_id"]}'
GET/orders

List Orders

Returns a paginated list of all orders placed via the API for your account, sorted newest first.

ParameterTypeRequiredDescription
pageintegeroptionalPage number (default: 1). 20 orders per page.
# First page
curl "https://www.socialcrow.co/api/v1/orders" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

# Page 2
curl "https://www.socialcrow.co/api/v1/orders?page=2" \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
GET/balance

Get Balance

Returns the current account balance in USD. The value is accurate to 4 decimal places with no rounding. Balances are always positive — orders are rejected if balance is insufficient.

curl https://www.socialcrow.co/api/v1/balance \
  -H "Authorization: Bearer sk_live_YOUR_KEY"

# Response
# { "data": { "balance": "12.3400", "currency": "USD" } }
POST/refills

Create Refill Request

Submits a refill request for a delivered order. Social Crow offers a 30-day refill guarantee — if the count on a delivered order drops, you can request a top-up here.

Refills are only processed automatically for services where the underlying panel supports them (i.e. refill: true on the service from GET /services). If the service does not support automatic refills, you will receive a REFILL_NOT_ELIGIBLE error — contact support for a manual refill.
The order must have a status of DELIVERED before a refill can be requested. If a refill is already pending for the order, subsequent requests will return REFILL_ALREADY_PENDING.
ParameterTypeRequiredDescription
orderIdstringrequiredThe order ID (orderIdShort) returned when the order was created.

Response fields

refillIdstring
Unique ID of the created refill request.
orderIdstring
The order ID the refill was created for.
statusstring
Always "pending" on creation. Use GET /refills/:id to check progress.
curl -X POST https://www.socialcrow.co/api/v1/refills \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orderId":"ABC123456789DE"}'
GET/refills/:id

Get Refill Status

Returns the current status of a refill request for a given order. The :id path parameter is the orderId returned when the order was created.

Refill status values

pendingRefill request is queued and awaiting processing
completedRefill has been fulfilled

Response fields

refillIdstring
Unique ID of the refill request.
orderIdstring
The order ID this refill belongs to.
statusstring
"pending" or "completed".
requestCountnumber
How many times a refill has been processed for this order.
createdAtstring
ISO 8601 timestamp when the refill request was first created.
lastRefilledAtstring | null
ISO 8601 timestamp of the most recent successful refill, or null if not yet fulfilled.
curl https://www.socialcrow.co/api/v1/refills/ABC123456789DE \
  -H "Authorization: Bearer sk_live_YOUR_KEY"
POST/refills/bulk

Bulk Create Refills

Submit refill requests for up to 100 orders in a single call. Returns a map of orderId → result. Orders that are ineligible or not found return an error entry in the map rather than a 4xx response — allowing you to process the full batch in one pass.

The same eligibility rules apply per order as for POST /refills. Invalid orders in a batch do not affect the other entries.
ParameterTypeRequiredDescription
ordersstring[]requiredArray of order IDs (orderIdShort). Maximum 100.
curl -X POST https://www.socialcrow.co/api/v1/refills/bulk \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orders":["ABC123456789DE","ord_def456"]}'
POST/refills/status

Bulk Refill Status

Check the refill status of up to 100 orders in a single request. Returns a map of orderId → refill status. Orders with no refill request, or that don't belong to your account, return an error entry rather than a 404.

ParameterTypeRequiredDescription
ordersstring[]requiredArray of order IDs (orderIdShort). Maximum 100.
curl -X POST https://www.socialcrow.co/api/v1/refills/status \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"orders":["ABC123456789DE","ord_def456"]}'

Error Handling

The API uses a consistent, predictable error system across every endpoint. Whether you use the REST API directly or the TypeScript SDK, errors always have the same shape and the same typed codes — making it straightforward to handle each case explicitly in your code.

Response shape

Every response is either a success envelope or an error envelope — never both. HTTP status codes reflect the category of error.

Success — HTTP 200 / 201

{ "data": { ... } }

Error — HTTP 4xx / 5xx

{ "error": { "code": "INSUFFICIENT_BALANCE", "message": "Your balance is $2.40 but this order costs $5.00" } }

error.code

A stable, machine-readable string constant. Use this in switch statements and conditionals. It will never change between API versions.

error.message

A human-readable string with contextual detail — e.g. the exact min/max for INVALID_QUANTITY, or your current balance for INSUFFICIENT_BALANCE. Safe to surface to users.

Handling errors in your code

The TypeScript SDK makes error handling completely explicit via the Result pattern — check result.ok first, then branch on result.error.code. Your IDE autocompletes every possible code value. For other languages, check for the error key in the JSON response before accessing data.

# All responses are JSON — check for the "error" key before using "data".
response=$(curl -s -X POST https://www.socialcrow.co/api/v1/orders \
  -H "Authorization: Bearer sk_live_YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{"serviceId":"1234","link":"https://instagram.com/u","quantity":1000}')

if echo "$response" | python3 -c "import sys,json; d=json.load(sys.stdin); sys.exit(0 if 'error' in d else 1)" 2>/dev/null; then
  code=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin)['error']['code'])")
  msg=$(echo "$response"  | python3 -c "import sys,json; print(json.load(sys.stdin)['error']['message'])")
  echo "Error [$code]: $msg"
else
  order_id=$(echo "$response" | python3 -c "import sys,json; print(json.load(sys.stdin)['data']['orderId'])")
  echo "Order placed: $order_id"
fi

Error codes

CodeHTTPWhen it occurs
UNAUTHORIZED401Missing or invalid API key
SERVICE_NOT_FOUND404serviceId does not exist
SERVICE_INACTIVE400Service exists but is currently disabled
INVALID_QUANTITY400quantity is below min or above max for the service
INVALID_LINK400link is missing or empty
MISSING_COMMENTS400Comment-type service ordered without comments
DRIPFEED_NOT_SUPPORTED400runs or interval sent for a non-drip-feed service
INVALID_DRIPFEED_PARAMS400runs or interval is missing, zero, or non-integer
INSUFFICIENT_BALANCE402Account balance is too low to cover the order
ORDER_NOT_FOUND404Order ID does not exist or belongs to a different account
TOO_MANY_ORDERS400Bulk request exceeds 100 order IDs
INVALID_REQUEST400Request body is malformed or a required field is missing
RATE_LIMITED429Services endpoint exceeded 10 requests/minute
METHOD_NOT_ALLOWED405Wrong HTTP method used (e.g. POST on a GET-only endpoint)
INTERNAL_ERROR500Unexpected server error
REFILL_NOT_ELIGIBLE400Refill requested for a service where the external panel does not support automatic refills — contact support
ORDER_NOT_DELIVERED400Refill requested but the order has not yet reached DELIVERED status
REFILL_ALREADY_PENDING400A refill is already pending for this order — wait for it to complete before requesting another
NO_PANEL_ORDER400No eligible external panel order found for this order — contact support
REFILL_FAILED400The external panel rejected the refill request — the panel's error message is included in the response