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 PonchoQuick 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 statusUrlEndpoints
The canonical shape names the network and the service:
/api/{network}/{service}?{parameter}=...&amount=NReadable 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 pathA 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.
| Parameter | Meaning |
|---|---|
| amount | How many units to buy. Aliases: quantity, winners, count. |
| url | The post link, for services that act on one piece of content. |
| handle | The account name, for services that act on a profile. |
| join | A public t.me link, for Telegram membership. |
| action | Set to view to read an existing order. No payment needed. |
| secret | The order token. Can also be sent as an X-Secret header. |
| network | Picks 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)
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| X (Twitter) LikesβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://x.com/grovdotfun/status/1234567890 | xlikes | url | $0.005 | 50 to 5000 |
| X (Twitter) RepostsβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://x.com/grovdotfun/status/1234567890 | xreposts | url | $0.01 | 100 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/1234567890 | xcomments | url | $0.075 | 3 to 1000 |
| X (Twitter) ViewsβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://x.com/grovdotfun/status/1234567890 | xviews | url | $0.0005 | 100 to 50000000 |
| X (Twitter) FollowersβοΈ Start Time: Instant β The account must be public. π Link Example: https://x.com/grovdotfun | xfollowers | handle | $0.01 | 10 to 30000 |
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| Instagram LikesβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://www.instagram.com/p/Cgrovdotfun/ | instalikes | url | $0.0025 | 10 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/ | instacomments | url | $0.005 | 1 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. | instaviews | url | $0.001 | 100 to 100000000 |
| Instagram RepostsβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://www.instagram.com/p/Cgrovdotfun/ | instareposts | url | $0.005 | 1 to 1000000 |
| Instagram Post SavesβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://www.instagram.com/p/Cgrovdotfun/ | instasaves | url | $0.0025 | 10 to 10000000 |
| Instagram FollowersβοΈ Start Time: Instant β The account must be public. π Link Example: https://www.instagram.com/grovdotfun/ | instafollowers | handle | $0.0025 | 10 to 1000000 |
TikTok
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| TikTok LikesβοΈ Start Time: 0-1h β The post and its account must be public. π Link Example: https://www.tiktok.com/@grov/video/7541234567890123456 | tiktoklikes | url | $0.0125 | 10 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/7541234567890123456 | tiktokcomments | url | $0.02 | 10 to 500000 |
| TikTok ViewsβοΈ Start Time: 0-1h β The post and its account must be public. π Link Example: https://www.tiktok.com/@grov/video/7541234567890123456 | tiktokviews | url | $0.001 | 100 to 10000000 |
| TikTok SharesβοΈ Start Time: 0-1h β The post and its account must be public. π Link Example: https://www.tiktok.com/@grov/video/7541234567890123456 | tiktokshares | url | $0.0025 | 10 to 10000000 |
| TikTok Post SavesβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://www.tiktok.com/@grov/video/7541234567890123456 | tiktoksaves | url | $0.0025 | 10 to 10000000 |
| TikTok FollowersβοΈ Start Time: 0-1h β The post and its account must be public. π Link Example: https://www.tiktok.com/@grov | tiktokfollowers | handle | $0.02 | 10 to 2000 |
YouTube
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| YouTube LikesβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://www.youtube.com/watch?v=grovdotfun0 | ytlikes | url | $0.01 | 10 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=grovdotfun0 | ytcomments | url | $0.015 | 10 to 50000 |
| YouTube ViewsβοΈ Start Time: Instant β The post and its account must be public. π Link Example: https://www.youtube.com/watch?v=grovdotfun0 | ytviews | url | $0.01 | 100 to 1000000 |
| YouTube SubscribersβοΈ Start Time: 0-6h β The post and its account must be public. π Link Example: https://www.youtube.com/@grov | ytsubscribers | handle | $0.05 | 50 to 25000 |
Telegram
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| Telegram Channel MembersβοΈ Start Time: Instant β The channel must be public, or the order will not start. π Link Example: https://t.me/grovdotfun | tgmembers | join | $0.005 | 500 to 70000 |
Spotify
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| 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. | spotifyplays | url | $0.005 | 500 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. | spotifysaves | url | $0.005 | 100 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. | spotifyfollowers | url | $0.005 | 100 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. | spotifylisteners | url | $0.01 | 1000 to 20000 |
| Service | Key | Parameter | Price per unit | Range |
|---|---|---|---|---|
| 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/1234567890 | fblikes | url | $0.0025 | 10 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/1234567890 | fbcomments | url | $0.1 | 10 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/1234567890 | fbviews | url | $0.0025 | 100 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/1234567890 | fbshares | url | $0.0025 | 1000 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/1234567890 | fbsaves | url | $0.005 | 10 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/grov | fbfollowers | handle | $0.0025 | 10 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/grov | fbgroupmembers | url | $0.005 | 10 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.
- /skill.mdInstallable agent skill
- /best-practices.mdWhich service to pick, and what to expect
- /llms.txtShort overview for agents
- /llms-full.txtEvery service, parameter and limit
- /openapi.jsonOpenAPI 3.1 with x-payment-info
- /.well-known/x402Machine-readable resource list
- /.well-known/agent-card.jsonERC-8004 agent card
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.
Something unclear or missing? Tell us.
