Reseller panel integration reference: endpoints, actions, webhooks, and service codes.
rate x quantity (worker pool before platform fees).
New to panel integration? Follow the visual setup guide first, then return here for the full reference.
https://www.gainworkers.com/api/v2.action=services, map IDs, test action=add.| URL | https://www.gainworkers.com/api/v2 |
|---|---|
| Method | POST recommended. GET allowed for read-only actions. |
| Authentication | key=gw_live_... in POST body, or Authorization: Bearer gw_live_... |
| Content type | application/x-www-form-urlencoded |
| action | Purpose | Parameters |
|---|---|---|
services | Service catalog (JSON array) | n/a |
balance | Spendable USD balance + deposit URL | n/a |
add | Create order | service, link, quantity, comments, title, runs, interval. For comment services, quantity is optional: each non-empty comments line counts as one unit (separated by \n or \r\n). For Reddit Post (1650), title and comments (body) are required. For LinkedIn Post (1750), comments (body) is required; when title is sent, workers publish via LinkedIn Write article with that exact headline. For Reddit Post Google Doc (1660) and LinkedIn Post Google Doc (1760), link is a public Google Docs URL and comments is not used; LinkedIn Google Doc briefs require a title and body in the doc. |
status | Order status (comma-separated IDs) | order or orders |
cancel | Cancel when allowed | order (aliases: orders, order_id) |
orders | Paginated history | page, per_page, status |
refill | Campaign top-up | order, quantity |
export | Bulk export (max 1000) | status, since, limit |
GainWorkers is a proof-based crowdwork platform. API pricing is not traditional per-1,000 bot SMM pricing.
| Field | Meaning |
|---|---|
rate | USD price for one completed unit (one approved worker action, slot, row, or rental period depending on service type). With a wholesale override, this is your effective rate. |
catalog_rate | Base catalog rate before account-specific campaign overrides. |
override_applied | true when your account wholesale campaign rate replaced the catalog rate on that service row. |
pricing_tier | floor or premium for campaign services; catalog for Arena, Rental, Hunter, and Live Task services. |
quantity | How many units you want filled (worker slots / actions). Optional for comment services when comments contains one line per unit. |
rate_unit | Always per_action on GainWorkers (not per_1000). |
rate_label | Human-readable unit, e.g. USD per approved action or USD per worker slot. |
charge_formula | Always rate x quantity for the worker pool estimate (platform fees may apply). |
min | Minimum order quantity. Campaign services use at least the platform minimum positions (default 30), unless your account has an active campaign minimum positions override. With that override, min is your override value (typically 1) on every service type and service catalog min_quantity is not applied. |
pricing_tier reflects the public catalog class (floor or premium).
Arena, Rental, Hunter, and Live Task services always keep catalog_rate.
Check override_applied=true to see where your wholesale rate replaced the catalog price.
floor tier = $0.025 per approved action (like, follow, view, join, upvote, save, ...) premium tier = $0.050 per approved action (comment, share, repost, post, answer, review) Example service codes (International): X Like 1310 floor $0.025 X Comment 1320 premium $0.050 X View 1360 floor $0.025 LinkedIn Post 1750 premium $0.500 LinkedIn Post Google Doc 1760 premium $0.500 Reddit Post 1650 premium $0.500 Reddit Post Google Doc 1660 premium $0.500
rate = 0.1000 quantity = 100 link = https://www.instagram.com/username/ Estimated worker pool = 0.10 x 100 = 10.00 USD Use a profile URL for Follow services. Use a post or reel URL for Like services (for example service 1110).
action=add service=1220 link=https://www.facebook.com/groups/example/posts/123 comments=Great post! Love this group Thanks for sharing quantity is omitted; API derives quantity = 3 from the three comment lines.
action=add service=1750 link=https://www.linkedin.com/company/example/ title=We just launched our new product line comments=We are excited to share our latest product update with the LinkedIn community. quantity=10 Workers publish on their own LinkedIn profile. link is optional (company page or profile URL to reference). Generic homepage URLs such as https://www.linkedin.com/ are ignored. comments (body) is required. title is optional for the API; when you send title, workers must publish via LinkedIn Write article and use that exact headline. When title is omitted, workers use a standard Start a post update.
action=add service=1760 link=https://docs.google.com/document/d/EXAMPLE_DOC_ID/edit quantity=1 Workers publish on their own LinkedIn profile via Write article. link is a public Google Docs URL. The API fetches the doc title and body for worker instructions. The doc must include a post title and body. Include an optional reference link in the doc (e.g. Link: https://www.linkedin.com/company/example/). comments is not used.
action=add service=1650 link=r/Mommit title=Should I buy a bottle washer if I only use bottles or pump parts a few times a week? comments=Ok hear me out because this might be unhinged... quantity=10 Workers publish a new post in the target subreddit. link accepts a subreddit URL or r/SUB shorthand. title is required. comments is required post body. Workers must use a Reddit account with at least 100 post karma and 30+ days account age.
action=add service=1660 link=https://docs.google.com/document/d/EXAMPLE_DOC_ID/edit quantity=1 Workers publish a new post in the target subreddit. link is a public Google Docs URL. The API fetches the doc and uses its title and body for worker instructions. Include the target subreddit in the doc (e.g. Subreddit: r/Mommit). comments is not used.
{
"service": 1310,
"name": "X Like (International)",
"catalog_rate": "0.0250",
"rate": "0.0200",
"override_applied": true,
"pricing_tier": "floor",
"rate_unit": "per_action",
"rate_label": "USD per approved action",
"quantity_unit": "approved actions",
"charge_formula": "rate x quantity",
"min": 1,
"max": 50000
}
{
"service": 1320,
"name": "X Comment (International)",
"catalog_rate": "0.0500",
"rate": "0.0500",
"override_applied": false,
"pricing_tier": "premium",
"rate_unit": "per_action",
"rate_label": "USD per approved action",
"quantity_unit": "approved actions",
"charge_formula": "rate x quantity",
"min": 1,
"max": 10000
}
link host and path.
Follow / subscribe services need profile or channel URLs.
Like / comment / upvote services need post, reel, or thread URLs.
Accepted variants include mobile hosts, share links, and short links where applicable.
| Platform | Action | Example service | Accepted link examples |
|---|---|---|---|
| Follow | 1130 | https://www.instagram.com/username/ | |
| Like | 1110 | https://www.instagram.com/p/POST_ID/, reel URLs | |
| Upvote | 1610 | .../comments/ID/, .../r/sub/s/SHARE_ID, redd.it/ID | |
| YouTube | Like | 1510 | youtube.com/watch?v=, youtu.be/, shorts |
| TikTok | Like | 1410 | tiktok.com/@user/video/ID, vm.tiktok.com/ |
| X | Like | 1310 | x.com/user/status/ID |
If validation fails, the API error includes the expected format and may suggest the correct service code.
curl -X POST 'https://www.gainworkers.com/api/v2' \ -d 'key=gw_live_YOUR_KEY' \ -d 'action=add' \ -d 'service=1001' \ -d 'link=https://example.com/landing' \ -d 'quantity=100'
{"order":9841203}
Use parameter order or orders with one or more comma-separated order IDs. Do not confuse this with action=orders, which returns paginated order history.
curl -X POST 'https://www.gainworkers.com/api/v2' \ -d 'key=gw_live_YOUR_KEY' \ -d 'action=status' \ -d 'orders=20,21,22,23,24'
{
"20": {"order":20,"status":"Completed","charge":"1.2000","start_count":0,"remains":0},
"21": {"order":21,"status":"Processing","charge":"0.8000","start_count":0,"remains":12}
}
curl -X POST 'https://www.gainworkers.com/api/v2' \ -d 'key=gw_live_YOUR_KEY' \ -d 'action=balance'
{
"balance": "124.5600",
"currency": "USD",
"deposit_url": "https://www.gainworkers.com/wallet/deposit",
"deposits_via_api": false
}
Set a callback URL per API key in Developer Hub → Settings. We POST JSON on status changes with header X-GainWorkers-Signature: sha256=... (HMAC-SHA256 of the raw body).
{
"event": "order.completed",
"order": 12345,
"status": "Completed",
"remains": "0",
"charge": "5.0000",
"currency": "USD",
"timestamp": 1751731200
}
Use webhooks to reduce action=status polling to every 5+ minutes.
| Code | Type | Description |
|---|---|---|
| 1001 | campaign | Micro campaign proof tasks (optional drip: runs + interval) |
| 2001 | live_task | Stream watch |
| 2002 | live_task | Website presence hold |
| 3001 | arena | Headline A/B test |
| 3002 | arena | Visual A/B (image URLs) |
| 4001 | rental | Instagram Story rental |
| 4002 | rental | Instagram Post rental |
| 5001 | task_hunter | Broken link hunt bounty |
| Code | Meaning |
|---|---|
| AUTH_001 | Invalid API key |
| AUTH_002 | IP not whitelisted |
| AUTH_004 | HTTPS required |
| AUTH_005 | API key must not be sent in URL query string |
| RATE_001 | Rate limit exceeded |
| WAL_001 | Insufficient balance (deposit on website) |
| WAL_002 | Deposits blocked via API |
| VAL_005 | Invalid or unsupported link URL for the selected service (host/path mismatch). The error text includes the expected format when available. |
| VAL_007 | Mutation requires POST |
| ORD_001 | Order not found |
add, cancel, refill via POST body.