Skip to content

Docs

grov provides social media growth across X (Twitter), Instagram, TikTok, YouTube, Facebook, Telegram and Spotify. Human customers shop for followers, likes, views, comments, shares, reposts, saves, subscribers, members, plays and listeners, then pay by card or crypto wallet. AI agents order through the API and pay per request in USDC over x402 or MPP. People complete the work through small tasks paid in USDC. AI agents need no API key, account or dashboard to use the API.

Try Grov

Open Grov in Poncho, or choose a client to use from your terminal.

Explore Grov in your browser. No installation needed.

Open in Poncho

Quick start

Two calls, no setup.

# The first call tells you what to pay.
curl -i "https://grov.fun/api/base/xlikes?url=https%3A%2F%2Fx.com%2Fgrovdotfun%2Fstatus%2F1234567890&amount=50"
# 402 Payment Required

# Sign it and repeat the call.
curl -i "https://grov.fun/api/base/xlikes?url=https%3A%2F%2Fx.com%2Fgrovdotfun%2Fstatus%2F1234567890&amount=50" \
  -H "PAYMENT-SIGNATURE: <signed-payment>"
# 200 OK, with an orderId, a secret and a statusUrl

Endpoints

The canonical shape names the network and the service:

/api/{network}/{service}?{parameter}=...&amount=N

Readable aliases resolve to exactly the same handler, so both of these work:

/api/base/xfollowers?handle=example&amount=100
/api/base/x/follower?handle=example&amount=100
/api/x/follower?handle=example&amount=100        # network defaults
/api/base/xfollowers/100?handle=example          # amount in the path

A readable path that names no network uses the first configured one. Add ?network=solana to choose, or use the canonical form to be explicit.

Parameters

Sent as query parameters, or as a JSON body on POST. Query values win on conflict.

ParameterMeaning
amountHow many units to buy. Aliases: quantity, winners, count.
urlThe post link, for services that act on one piece of content.
handleThe account name, for services that act on a profile.
joinA public t.me link, for Telegram membership.
actionSet to view to read an existing order. No payment needed.
secretThe order token. Can also be sent as an X-Secret header.
networkPicks a network when the path does not name one.

Paying with x402

Call the endpoint without a payment header and you get a 402 carrying the requirement. Sign it and repeat the call with the PAYMENT-SIGNATURE header. X-PAYMENT is the older name and is still accepted.

import { wrapFetchWithPayment } from '@x402/fetch'
import { x402Client } from '@x402/core/client'
import { registerExactEvmScheme } from '@x402/evm/exact/client'
import { toClientEvmSigner } from '@x402/evm'
import { privateKeyToAccount } from 'viem/accounts'

const account = privateKeyToAccount(process.env.EVM_PRIVATE_KEY as `0x${string}`)
const client = new x402Client()
registerExactEvmScheme(client, { signer: toClientEvmSigner(account) })

const paymentFetch = wrapFetchWithPayment(fetch, client)
const response = await paymentFetch('https://grov.fun/api/base/xlikes?url=https%3A%2F%2Fx.com%2Fgrovdotfun%2Fstatus%2F1234567890&amount=50')
const order = await response.json()

For Solana use @x402/svm/exact/client with an @solana/kit signer. Assets: USDC 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913 on Base, USDC EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v on Solana.

Paying with MPP

Call without an Authorization header and you get a 402 with a WWW-Authenticate: Payment challenge. Build a credential from that live challenge and repeat the call with Authorization: Payment .... The success response carries a Payment-Receipt header.

Read the amount, recipient, currency and network from the live challenge every time. Never hardcode them from documentation, including this page.

import { Mppx, solana } from '@solana/mpp/client'

const mppx = Mppx.create({ methods: [solana.charge({ signer, rpcUrl })] })
const response = await mppx.fetch('https://grov.fun/api/mpp-solana/xlikes?url=...&amount=100')

Responses

Order created

{
  "ok": true,
  "paid": true,
  "rail": "base",
  "orderId": "7QK4M2XJ9BTN",
  "secret": "keep-this-safe",
  "statusUrl": "https://grov.fun/api/base/xlikes?action=view&secret=keep-this-safe",
  "service": "xlikes",
  "amount": 100,
  "unit": "like",
  "chargedUsd": 2.5,
  "status": "queued"
}

Save the secret immediately. It is the only way to read the order afterwards and it cannot be recovered.

Order status

{
  "ok": true,
  "orderId": "7QK4M2XJ9BTN",
  "status": "in_progress",
  "amount": 100,
  "delivered": 42,
  "remaining": 58,
  "startCount": 1310,
  "completedAt": null
}

Statuses: queued, in_progress, partial, completed, canceled, failed. Delivery is carried out by people, so an order builds up over minutes to hours. Queued means accepted and paid for.

Services

Prices are per unit, in USD, settled 1:1 in USDC. The 402 is always authoritative.

X (Twitter)

ServiceKeyParameterPrice per unitRange
X (Twitter) Likes⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://x.com/grovdotfun/status/1234567890xlikesurl$0.00550 to 5000
X (Twitter) Reposts⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://x.com/grovdotfun/status/1234567890xrepostsurl$0.01100 to 2000
X (Twitter) Comments (random-generic)⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://x.com/grovdotfun/status/1234567890xcommentsurl$0.0753 to 1000
X (Twitter) Views⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://x.com/grovdotfun/status/1234567890xviewsurl$0.0005100 to 50000000
X (Twitter) Followers⌚️ Start Time: Instant β†’ The account must be public. πŸ”— Link Example: https://x.com/grovdotfunxfollowershandle$0.0110 to 30000

Instagram

ServiceKeyParameterPrice per unitRange
Instagram Likes⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.instagram.com/p/Cgrovdotfun/instalikesurl$0.002510 to 10000000
Instagram Comments (random-generic)⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.instagram.com/p/Cgrovdotfun/instacommentsurl$0.0051 to 100000
Instagram Views⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.instagram.com/p/Cgrovdotfun/ and all other Instagram links.instaviewsurl$0.001100 to 100000000
Instagram Reposts⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.instagram.com/p/Cgrovdotfun/instarepostsurl$0.0051 to 1000000
Instagram Post Saves⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.instagram.com/p/Cgrovdotfun/instasavesurl$0.002510 to 10000000
Instagram Followers⌚️ Start Time: Instant β†’ The account must be public. πŸ”— Link Example: https://www.instagram.com/grovdotfun/instafollowershandle$0.002510 to 1000000

TikTok

ServiceKeyParameterPrice per unitRange
TikTok Likes⌚️ Start Time: 0-1h β†’ The post and its account must be public. πŸ”— Link Example: https://www.tiktok.com/@grov/video/7541234567890123456tiktoklikesurl$0.012510 to 50000
TikTok Comments (random-generic)⌚️ Start Time: 0-1h β†’ The post and its account must be public. πŸ”— Link Example: https://www.tiktok.com/@grov/video/7541234567890123456tiktokcommentsurl$0.0210 to 500000
TikTok Views⌚️ Start Time: 0-1h β†’ The post and its account must be public. πŸ”— Link Example: https://www.tiktok.com/@grov/video/7541234567890123456tiktokviewsurl$0.001100 to 10000000
TikTok Shares⌚️ Start Time: 0-1h β†’ The post and its account must be public. πŸ”— Link Example: https://www.tiktok.com/@grov/video/7541234567890123456tiktoksharesurl$0.002510 to 10000000
TikTok Post Saves⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.tiktok.com/@grov/video/7541234567890123456tiktoksavesurl$0.002510 to 10000000
TikTok Followers⌚️ Start Time: 0-1h β†’ The post and its account must be public. πŸ”— Link Example: https://www.tiktok.com/@grovtiktokfollowershandle$0.0210 to 2000

YouTube

ServiceKeyParameterPrice per unitRange
YouTube Likes⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.youtube.com/watch?v=grovdotfun0ytlikesurl$0.0110 to 100000
YouTube Comments (random-generic)⌚️ Start Time: 0-6h β†’ The post and its account must be public. πŸ”— Link Example: https://www.youtube.com/watch?v=grovdotfun0ytcommentsurl$0.01510 to 50000
YouTube Views⌚️ Start Time: Instant β†’ The post and its account must be public. πŸ”— Link Example: https://www.youtube.com/watch?v=grovdotfun0ytviewsurl$0.01100 to 1000000
YouTube Subscribers⌚️ Start Time: 0-6h β†’ The post and its account must be public. πŸ”— Link Example: https://www.youtube.com/@grovytsubscribershandle$0.0550 to 25000

Telegram

ServiceKeyParameterPrice per unitRange
Telegram Channel Members⌚️ Start Time: Instant β†’ The channel must be public, or the order will not start. πŸ”— Link Example: https://t.me/grovdotfuntgmembersjoin$0.005500 to 70000

Spotify

ServiceKeyParameterPrice per unitRange
Spotify Plays⌚️ Start Time: 0-12h β†’ The profile must be set to "public". πŸ”— Link Example: https://open.spotify.com/track/grovdotfun3N5p7S9w2Y4Z πŸ”΄ Don't use any other link format. πŸ”΄ Spotify updates the plays counter once time every 48 hours. πŸ”΄ If the order is marked as completed, but you still don't see the plays counter updated, just wait a couple of days to see the changes.spotifyplaysurl$0.005500 to 20000000
Spotify Saves⌚️ Start Time: 0-12h β†’ The profile must be set to "public". πŸ”— Link Example: https://open.spotify.com/track/grovdotfun3N5p7S9w2Y4Z πŸ”— Link Example: https://open.spotify.com/playlist/grovdotfun5B8d2F4h6J9L πŸ”΄ Don't use any other link format. πŸ”΄ Spotify updates the plays counter once time every 48 hours. πŸ”΄ If the order is marked as completed, but you still don't see the plays counter updated, just wait a couple of days to see the changes.spotifysavesurl$0.005100 to 1000000
Spotify Followers⌚️ Start Time: 0-12h β†’ The profile must be set to "public". πŸ”— Link Example: https://open.spotify.com/user/grovdotfun πŸ”— Link Example: https://open.spotify.com/playlist/grovdotfun5B8d2F4h6J9L πŸ”— Link Example: https://open.spotify.com/artist/grovdotfun7K2m9Q4v6R8T πŸ”΄ Don't use any other link format. πŸ”΄ Spotify updates the plays counter once time every 48 hours. πŸ”΄ If the order is marked as completed, but you still don't see the plays counter updated, just wait a couple of days to see the changes.spotifyfollowersurl$0.005100 to 1000000
Spotify Monthly Listeners⌚️ Start Time: 0-12h β†’ The profile must be set to "public". πŸ”— Link Example: https://open.spotify.com/artist/grovdotfun7K2m9Q4v6R8T πŸ”΄ Don't use any other link format. πŸ”΄ Spotify updates the plays counter once time every 48 hours. πŸ”΄ If the order is marked as completed, but you still don't see the plays counter updated, just wait a couple of days to see the changes.spotifylistenersurl$0.011000 to 20000

Facebook

ServiceKeyParameterPrice per unitRange
Facebook Likes⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. πŸ”— Link Example: https://www.facebook.com/grov/posts/1234567890fblikesurl$0.002510 to 1000000
Facebook Comments (random-generic)⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. πŸ”— Link Example: https://www.facebook.com/grov/posts/1234567890fbcommentsurl$0.110 to 250
Facebook Views⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. πŸ”— Link Example: https://www.facebook.com/grov/videos/1234567890fbviewsurl$0.0025100 to 1000000
Facebook Shares (Split - Last 10 Posts)⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. β†’ Shares For The Latest Posts On Your Facebook Account (10 Posts). β†’ The Requested Quantity Will Be Evenly Distributed Across The Posts . β†’ This Service Is Only Applicable To Your Current Videos Not To Future Posts. πŸ”— Link Example: https://www.facebook.com/grov/posts/1234567890fbsharesurl$0.00251000 to 10000000
Facebook Post Saves⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. β†’ Shares For The Latest Posts On Your Facebook Account (10 Posts). β†’ The Requested Quantity Will Be Evenly Distributed Across The Posts . β†’ This Service Is Only Applicable To Your Current Videos Not To Future Posts. πŸ”— Link Example: https://www.facebook.com/grov/posts/1234567890fbsavesurl$0.00510 to 10000
Facebook Followers⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. πŸ”— Link Example: https://www.facebook.com/grovfbfollowershandle$0.002510 to 500000
Facebook Group Members⌚️ Start Time: 0-6h β†’ The post and its account must be public, or the order will not start. πŸ”— Link Example: https://www.facebook.com/groups/grovfbgroupmembersurl$0.00510 to 20000

MCP

A streamable HTTP MCP server lives at https://grov.fun/mcp. It exposes four tools: grov_services, grov_buy, grov_order_status and grov_help.

grov_buy prices a purchase and returns the exact call to make. It does not spend anything: MCP has no way to carry a signed payment, and your wallet should stay with your own client anyway.

{
  "mcpServers": {
    "grov": {
      "type": "http",
      "url": "https://grov.fun/mcp"
    }
  }
}

Discovery

Prices, limits and endpoint lists below come from the live catalog. Payment guidance is verified against the corresponding payment routes.

Errors

{
  "ok": false,
  "message": "Minimum amount for this service is 10.",
  "errorCode": "AMOUNT_BELOW_MIN",
  "details": {
    "service": "xlikes",
    "minAmount": 10,
    "maxAmount": 10000
  }
}

4xx bodies include the limits and the parameter that was expected, so a client can correct itself without reading this page.

UNKNOWN_SERVICESERVICE_UNAVAILABLENETWORK_DISABLEDMISSING_TARGETINVALID_TARGETINVALID_AMOUNTAMOUNT_BELOW_MINAMOUNT_ABOVE_MAXNOT_PRICEABLEINVALID_SECRETRATE_LIMITEDPAYMENT_REQUIREDPAYMENT_FAILEDSERVER_ERROR

Something unclear or missing? Tell us.