AgentDrop is an x402-enabled growth service for agent apps.
It helps developers solve activation, not just checkout: pay AgentDrop to create a funded claim link, share it with a target agent or user via text message or email, and sponsor their first paid onchain interaction.
- Base URL:
https://agentdrop.8o.vc - Health:
https://agentdrop.8o.vc/health - Manifest:
https://agentdrop.8o.vc/.well-known/agent.json - Pricing:
https://agentdrop.8o.vc/v1/pricing - Paid endpoint:
POST https://agentdrop.8o.vc/v1/campaigns
This repo ships two layers:
agentdrop-service.js: an Express service with an x402 paywall for campaign creationlinkdrop-agent.js: a strict JSON CLI for the underlying Linkdrop send/claim primitive
- Accepts x402 payments for
POST /v1/campaigns - Creates claimable onchain credits using Linkdrop
- Defaults delivery to Base
- Keeps a strict JSON contract for automation
- Exposes free discovery endpoints for agents:
//health/agent.json/.well-known/agent.json/v1/capabilities/v1/pricing
The funding and claim primitive supports the chains available in the current linkdrop-sdk runtime:
base(default)polygonarbitrumoptimismavalanche
- Install dependencies:
npm install
- Configure env vars from
.env.example - Required env:
PRIVATE_KEYfor the wallet that funds the claimable credit
- Recommended env:
RPC_URL_BASEorRPC_URL
- Optional service env:
PORTdefault4021X402_PAY_TOdefault is the address derived fromPRIVATE_KEYX402_NETWORKdefaulteip155:84532X402_PRICE_USDdefault$0.05X402_FACILITATOR_URLdefaulthttps://x402.org/facilitator
Start AgentDrop:
npm run serviceOn startup it prints one JSON object with the active x402 configuration.
The service attempts x402 initialization during startup. If the facilitator is unavailable, the free routes still boot and the paid route returns 503 X402_UNAVAILABLE until the facilitator is reachable. The service re-attempts x402 initialization lazily on paid requests.
GET /GET /healthGET /agent.jsonGET /.well-known/agent.jsonGET /v1/capabilitiesGET /v1/pricing
POST /v1/campaigns
Example request body:
{
"amount": "0.01",
"token": "native",
"chain": "base",
"campaign": "signup bonus",
"recipientType": "agent"
}Successful response:
{
"ok": true,
"product": "agentdrop_onboarding_credit",
"request": {
"campaign": "signup bonus",
"recipientType": "agent",
"amount": "0.01",
"token": "native",
"chain": "base"
},
"x402": {
"network": "eip155:84532",
"payTo": "0x...",
"price": "$0.05"
},
"linkdrop": {
"ok": true,
"chain": "base",
"claimUrl": "https://...",
"transferId": "...",
"depositTx": "0x..."
}
}If the request is unpaid or underpaid, the x402 middleware returns 402 Payment Required with payment instructions.
There is not a one-command end-to-end test in the repo yet, but you can exercise the important paths locally.
Syntax-check the service and CLI:
npm run checkVerify the CLI contract still prints JSON help:
npm run smoke:cliThis verifies boot, discovery routes, and degraded x402 behavior without funding a real transfer:
PRIVATE_KEY=0x1111111111111111111111111111111111111111111111111111111111111111 PORT=4022 npm run serviceIn another terminal:
curl -s http://127.0.0.1:4022/health
curl -s http://127.0.0.1:4022/.well-known/agent.json
curl -s http://127.0.0.1:4022/v1/pricingTest the paid route shape:
curl -s -X POST http://127.0.0.1:4022/v1/campaigns \
-H 'Content-Type: application/json' \
-d '{"amount":"0.01","token":"native","chain":"base"}'Expected result:
- If the facilitator is reachable and payment is missing, the route should return
402 Payment Required. - If the facilitator is not reachable, the route should return
503 X402_UNAVAILABLE.
Use a funded key and a real RPC:
export PRIVATE_KEY=0xYOUR_FUNDED_KEY
export RPC_URL_BASE=https://mainnet.base.org
node linkdrop-agent.js send --amount 0.0001 --token native --chain baseThen redeem the returned claim URL:
node linkdrop-agent.js claim --url "<claimUrl>" --to 0xRecipient --chain baseSet a funded key, a real RPC, and a reachable facilitator:
export PRIVATE_KEY=0xYOUR_FUNDED_KEY
export RPC_URL_BASE=https://mainnet.base.org
export PORT=4021
npm run serviceThen:
- Check
GET /healthand confirmx402Ready: true. - Send an unpaid
POST /v1/campaignsrequest and confirm you get402 Payment Required. - Pay that route with an x402-aware client and confirm you receive
claimUrl,transferId, anddepositTx.
This repo does not yet ship a dedicated x402 client smoke script, so the last step currently requires your own x402-capable client.
The CLI is still available for direct automation and debugging.
Print usage JSON:
node linkdrop-agent.js --helpCreate a native-token claim link:
node linkdrop-agent.js send --amount 0.01 --token native --chain baseCreate an ERC20 claim link:
node linkdrop-agent.js send --amount 5 --token 0xTokenAddress --chain polygonClaim a transfer:
node linkdrop-agent.js claim --url "<claimUrl>" --to 0xRecipient --chain baseEvery CLI invocation prints exactly one JSON object to stdout.
- Success:
{ "ok": true, ... } - Error:
{ "ok": false, "error": { "code": "...", "name": "...", "message": "...", "details": { ... } } }
x402 solves how an agent gets paid.
AgentDrop solves how an agent gets its first customer. Instead of waiting for a new user or agent to arrive with a funded wallet, a service can create a claimable credit, bootstrap the wallet, and sponsor the first paid interaction.
- Primary target:
Base - Agent Services on Base - Secondary target:
Synthesis Open Track
Submission copy and registration notes live in HACKATHON_PACKAGE.md.
