Status: Platform Operational | USD Wallet | Proof-Verified Payouts
Home API Docs

API Docs

Reseller panel integration reference: endpoints, actions, webhooks, and service codes.

Deposits are website-only (crypto wallet). Fund your employer wallet with BTC, ETH, USDT, and other supported coins at https://www.gainworkers.com/wallet/deposit. Orders auto-publish when balance is sufficient.
Marketplace pricing and refunds: Published employer ranges are on For Employers and Pricing. Sample SMM service ranges and delivery times are listed on those pages. Refund summary and full policy: Refund Policy.
Rate is per unit, not per 1,000. GainWorkers API rate is USD per unit (per approved worker action), not per 1,000. Estimated worker pool before platform fees: rate x quantity. Formula: rate x quantity (worker pool before platform fees).

Quick start

New to panel integration? Follow the visual setup guide first, then return here for the full reference.

  1. Register as an employer account.
  2. Open Developer Hub and generate an API key.
  3. Add funds at wallet/deposit (not via API).
  4. In your panel, set API URL to https://www.gainworkers.com/api/v2.
  5. Run action=services, map IDs, test action=add.

Endpoint

URLhttps://www.gainworkers.com/api/v2
MethodPOST recommended. GET allowed for read-only actions.
Authenticationkey=gw_live_... in POST body, or Authorization: Bearer gw_live_...
Content typeapplication/x-www-form-urlencoded

Actions

action Purpose Parameters
servicesService catalog (JSON array)n/a
balanceSpendable USD balance + deposit URLn/a
addCreate orderservice, 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.
statusOrder status (comma-separated IDs)order or orders
cancelCancel when allowedorder (aliases: orders, order_id)
ordersPaginated historypage, per_page, status
refillCampaign top-uporder, quantity
exportBulk export (max 1000)status, since, limit

Rate and quantity

GainWorkers is a proof-based crowdwork platform. API pricing is not traditional per-1,000 bot SMM pricing.

Field Meaning
rateUSD 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_rateBase catalog rate before account-specific campaign overrides.
override_appliedtrue when your account wholesale campaign rate replaced the catalog rate on that service row.
pricing_tierfloor or premium for campaign services; catalog for Arena, Rental, Hunter, and Live Task services.
quantityHow many units you want filled (worker slots / actions). Optional for comment services when comments contains one line per unit.
rate_unitAlways per_action on GainWorkers (not per_1000).
rate_labelHuman-readable unit, e.g. USD per approved action or USD per worker slot.
charge_formulaAlways rate x quantity for the worker pool estimate (platform fees may apply).
minMinimum 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.
Wholesale campaign pricing: Account-specific lower rates apply to floor-tier campaign services only (like, follow, view, subscribe, join, and similar). Premium-tier services (comment, share, repost, answer, review) use the catalog premium rate for every account. Reddit Post (1650), Reddit Post Google Doc (1660), LinkedIn Post (1750), and LinkedIn Post Google Doc (1760) use a dedicated post rate (default $0.50, minimum quantity 5). Authorized accounts can receive $0.20 and minimum quantity 1 on those four services via admin override. 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.
Worker proof policy: All campaign services created through the API require workers to submit proof URL, proof text (username), and a screenshot file showing the completed action.
Catalog pricing tiers (default)
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
Example (Instagram Follow, service 1130)
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).
Custom Comments (Facebook Comment, service 1220) — quantity optional
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.
LinkedIn Post (service 1750)
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.
LinkedIn Post Google Doc (service 1760)
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.
Reddit Post (service 1650)
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.
Reddit Post Google Doc (service 1660)
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.
action=services row with wholesale override (floor-tier service)
{
  "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
}
action=services row for premium service (override not applied)
{
  "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 formats (VAL_005): Each campaign service validates the 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.
PlatformActionExample serviceAccepted link examples
InstagramFollow1130https://www.instagram.com/username/
InstagramLike1110https://www.instagram.com/p/POST_ID/, reel URLs
RedditUpvote1610.../comments/ID/, .../r/sub/s/SHARE_ID, redd.it/ID
YouTubeLike1510youtube.com/watch?v=, youtu.be/, shorts
TikTokLike1410tiktok.com/@user/video/ID, vm.tiktok.com/
XLike1310x.com/user/status/ID

If validation fails, the API error includes the expected format and may suggest the correct service code.

Example: create order

Request
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'
Response
{"order":9841203}

Example: order status (single or bulk)

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.

Request (bulk)
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'
Response (multiple IDs)
{
  "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}
}

Example: balance

Request
curl -X POST 'https://www.gainworkers.com/api/v2' \
  -d 'key=gw_live_YOUR_KEY' \
  -d 'action=balance'
Response
{
  "balance": "124.5600",
  "currency": "USD",
  "deposit_url": "https://www.gainworkers.com/wallet/deposit",
  "deposits_via_api": false
}

Webhooks

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).

Payload sample
{
  "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.

Service codes

CodeTypeDescription
1001campaignMicro campaign proof tasks (optional drip: runs + interval)
2001live_taskStream watch
2002live_taskWebsite presence hold
3001arenaHeadline A/B test
3002arenaVisual A/B (image URLs)
4001rentalInstagram Story rental
4002rentalInstagram Post rental
5001task_hunterBroken link hunt bounty

Error codes

CodeMeaning
AUTH_001Invalid API key
AUTH_002IP not whitelisted
AUTH_004HTTPS required
AUTH_005API key must not be sent in URL query string
RATE_001Rate limit exceeded
WAL_001Insufficient balance (deposit on website)
WAL_002Deposits blocked via API
VAL_005Invalid or unsupported link URL for the selected service (host/path mismatch). The error text includes the expected format when available.
VAL_007Mutation requires POST
ORD_001Order not found

Security checklist

  • Store API keys server-side only. Never expose them in browser JavaScript.
  • Enable IP whitelist on each production key.
  • Use HTTPS for API calls and webhook callbacks.
  • Send add, cancel, refill via POST body.
  • API orders auto-publish when balance is sufficient (no manual admin queue).
  • Fund wallet only through the deposit page after login.
  • Verify webhook HMAC before updating order status in your database.