API reference

Use TrafficsLab from your own scripts: balance, catalog, orders and wallet transactions with a personal API key.

Authentication

Every request carries a personal key in the Authorization header. You can hold up to 10 active keys at a time.

curl /api/public/v1/me \
  -H "Authorization: Bearer tl_your_key_here"

The key is shown once, at creation: we only store its hash. Use it from server-side code, never from an app running in the browser.

Scopes

  • read reads balance, catalog, orders and transactions.
  • orders creates orders paid with the wallet balance.

Endpoints

/api/public/v1

MethodPathScopeDescription
GET/mereadEmail, wallet balance and account creation date.
GET/servicesreadRetail catalog with platform, category and q filters.
GET/services/{id}readOne service with its active bundles.
GET/ordersreadYour orders, newest first.
POST/ordersordersCreates an order paid with the wallet balance.
GET/orders/{id}readOrder detail with items and delivery state.
GET/transactionsreadWallet movements.

List endpoints are paginated with page (from 1) and size (default 25, max 100); every response carries data, page, size and has_more.

GET /orders accepts an optional status filter; an unknown value answers 400 instead of an empty page. Valid values: pending, processing, completed, partial, canceled, cancelled, refunded

Examples

Browse the catalog

curl "/api/public/v1/services?platform=instagram&page=1&size=25" \
  -H "Authorization: Bearer tl_your_key_here"

Place an order

Send bundle_id for a fixed bundle, or service_id plus quantity for a custom amount. Services that need extra inputs (comments, usernames, hashtag…) take them in provider_params.

curl -X POST /api/public/v1/orders \
  -H "Authorization: Bearer tl_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "bundle_id": "8f0e2f8e-1c2b-4a2e-9d0a-6a5b7c8d9e0f",
    "target_link": "https://instagram.com/p/XXXXXXXXXXX"
  }'
curl -X POST /api/public/v1/orders \
  -H "Authorization: Bearer tl_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "service_id": "1a2b3c4d-5e6f-4a7b-8c9d-0e1f2a3b4c5d",
    "quantity": 1000,
    "target_link": "https://instagram.com/p/XXXXXXXXXXX"
  }'

Check an order

curl /api/public/v1/orders/ORDER_ID \
  -H "Authorization: Bearer tl_your_key_here"

Errors

Errors always come back in this shape, with a matching HTTP status:

{ "error": { "code": "INSUFFICIENT_BALANCE", "message": "..." } }
CodeStatusMeaning
BAD_REQUEST400Invalid parameters or request body.
UNAUTHORIZED401Missing or malformed Authorization header.
INVALID_KEY401This key does not exist.
KEY_REVOKED403This key was revoked.
KEY_EXPIRED403This key has expired.
INSUFFICIENT_SCOPE403The key lacks the required scope.
NOT_FOUND404Resource missing or not yours.
METHOD_NOT_ALLOWED405Wrong HTTP verb for this endpoint (see the Allow header).
INSUFFICIENT_BALANCE409Wallet balance too low for this order.
RATE_LIMITED429Too many requests: retry after Retry-After.
INTERNAL_ERROR500Unexpected server error.

Rate limits

60 requests per minute per key, plus at most 30 order creations per minute. Every response carries the X-RateLimit-* headers; over the budget you get 429 with Retry-After.

X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
X-RateLimit-Reset: 1767225600
Retry-After: 42

Counters live in the server process: on a multi-process deployment the effective budget grows with the number of processes.

API keys

Create up to 10 active keys from your account, with the scopes and expiry you choose, and revoke them at any time.

Changelog

v1 First public version: balance, catalog, orders and wallet transactions.