🦞 satpack
marketplacehire agent →

satpack

cold outreach utilities
for agents and builders.

no signup · no API key · no credit card
pay sats per call · lightning only


agent for hire

not an ai agent?

hire one.

describe your pitch in plain English. the agent searches Google Places, scrapes contact emails, validates deliverability, and drafts personalized outreach — all in one shot, while you watch sats move in real time.

01places searchfinds businesses matching your target market
02email scraperpulls contact emails from each website
03email validatorconfirms deliverability — only keeps high/medium
04draft outreachpersonalizes an email for each verified lead
try it now1000 sats flat · or use individual tools below
wire it to your agent
mcp · claude code · cursor · openclaw
// claude_desktop_config.json  (works with Cursor, OpenClaw, etc.)
{
  "mcpServers": {
    "satpack": {
      "command": "npx",
      "args": ["tsx", "/path/to/satpack/mcp/server.ts"],
      "env": { "SATPACK_URL": "https://satpack.dev" }
    }
  }
}

your agent sees hire_outreach_agent(task). results write to ~/.openclaw/hire_outreach.csv on your machine.

http · 1000 sats · l402
// or call the HTTP endpoint directly
const res = await fetch("https://satpack.dev/api/v1/hire", {
  method: "POST",
  headers: { "Authorization": "L402 <macaroon>:<preimage>" },
  body: JSON.stringify({
    task: "find 5 landscapers in Kelowna and pitch web design"
  }),
});
const { leads, summary } = await res.json();
// leads: [{ business_name, email, draft_subject, draft_body, ... }]

last 10 calls live

loading recent activity


individual tools

use these directly when you want fine-grained control. the hire agent chains them automatically.

email scraper

GET/api/v1/scrape/email

50

Scrapes emails from a webpage + up to 3 linked pages (/contact, /about, /team). Returns deduped addresses with source.

curl
with l402
curl "https://satpack.dev/api/v1/scrape/email?url=https://stripe.com" \
  -H 'Authorization: L402 <macaroon>:<preimage>'

email validator

GET/api/v1/validate/email

32

Syntax + RFC 5321 checks, MX record lookup, disposable-domain detection. Returns deliverability guess: high / medium / low / invalid.

curl
with l402
curl "https://satpack.dev/api/v1/validate/email?addr=ceo@stripe.com" \
  -H 'Authorization: L402 <macaroon>:<preimage>'

contact scraper

GET/api/v1/scrape/contact

100

Full extraction: emails, phones, social links (LinkedIn, Twitter, GitHub, Instagram, Facebook), company name, address.

curl
with l402
curl "https://satpack.dev/api/v1/scrape/contact?url=https://acme.io" \
  -H 'Authorization: L402 <macaroon>:<preimage>'

places search

GET/api/v1/search/places

75

Natural-language Google Places search. Add details=true (150 sats) to fan-out website + phone per result.

curl
with l402
curl "https://satpack.dev/api/v1/search/places?q=plumbers+in+boston&limit=10&details=true" \
  -H 'Authorization: L402 <macaroon>:<preimage>'

why this exists

last week i needed to validate 1,000 cold outreach emails. NeverBounce needed a signup, a credit card, a $20 minimum. ZeroBounce wanted my phone number. Hunter said "contact sales."

i just wanted to call an endpoint and pay for what i used.

now you can. 32 sats per validation. paid in lightning. no relationship with me, no relationship with the upstream provider, no API key floating around in your env.

your script. your sats. our endpoint.


for agents

give your agent a lightning wallet. no API key needed.

// give your agent a bitcoin lightning wallet,
// then point it at any endpoint. example:

const res = await fetch("https://satpack.dev/api/v1/scrape/email?url=https://stripe.com");
const { invoice, macaroon } = await res.json(); // 402 → pay
const preimage = await wallet.pay(invoice);

const data = await fetch("https://satpack.dev/api/v1/scrape/email?url=https://stripe.com", {
  headers: { Authorization: `L402 ${macaroon}:${preimage}` },
}).then(r => r.json());
// -> { url, emails: [...], pages_crawled, found_at, ms }

agent index: /llms.txt · catalog: /api/v1/catalog