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
| Method | Path | Scope | Description |
|---|---|---|---|
| GET | /me | read | Email, wallet balance and account creation date. |
| GET | /services | read | Retail catalog with platform, category and q filters. |
| GET | /services/{id} | read | One service with its active bundles. |
| GET | /orders | read | Your orders, newest first. |
| POST | /orders | orders | Creates an order paid with the wallet balance. |
| GET | /orders/{id} | read | Order detail with items and delivery state. |
| GET | /transactions | read | Wallet 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": "..." } }| Code | Status | Meaning |
|---|---|---|
| BAD_REQUEST | 400 | Invalid parameters or request body. |
| UNAUTHORIZED | 401 | Missing or malformed Authorization header. |
| INVALID_KEY | 401 | This key does not exist. |
| KEY_REVOKED | 403 | This key was revoked. |
| KEY_EXPIRED | 403 | This key has expired. |
| INSUFFICIENT_SCOPE | 403 | The key lacks the required scope. |
| NOT_FOUND | 404 | Resource missing or not yours. |
| METHOD_NOT_ALLOWED | 405 | Wrong HTTP verb for this endpoint (see the Allow header). |
| INSUFFICIENT_BALANCE | 409 | Wallet balance too low for this order. |
| RATE_LIMITED | 429 | Too many requests: retry after Retry-After. |
| INTERNAL_ERROR | 500 | Unexpected 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: 42Counters 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.