Crypto Payment API for AI Agents, Keyless & No Account | Shieldz
Shieldz

The crypto payment API your AI agent calls itself

A keyless HTTP API built for agents. Give a destination wallet address and get back a shareable payment link, an embeddable button, and an agent-readable dashboard, in one call. No account, no dashboard, no API key. Non-custodial: funds settle straight to the address you provide. Base URL: https://shieldz.cash

New to Shieldz for agents? Start with the overview and MCP setup for AI agents. This page is the raw HTTP reference, every endpoint below is keyless.
Every endpoint here is keyless and OFAC sanctions-screened, with per-IP rate limits. Pass an optional email so the owner can later claim a full dashboard via magic link, settlement keeps working either way.
GET · no JSON · no key · no MCP

Mint a payment method from a single URL

Any tool that can build a URL, an agent with only fetch, a browser, a link pasted into a chat, can create a payment method. No JSON body, no client. The response is JSON with the payment URL and a manage_token claim code.

# Reusable tip jar (the payer picks the amount)
GET https://shieldz.cash/api/v1/tip-jars?to=0xWALLET&title=Buy+me+a+coffee&amounts=1,5,20

# Fixed-amount payment link
GET https://shieldz.cash/api/v1/links?to=0xWALLET&amount=25&chain=BASE&asset=USDC

Tip jars are idempotent per wallet, and to / amount are hand-writable aliases. Full parameters in the numbered reference below.

POST /api/v1/links, a one-time invoice for a fixed amount.

curl https://shieldz.cash/api/v1/links \
  -H "Content-Type: application/json" \
  -d '{
    "settlement": { "chain": "BASE", "asset": "USDC", "address": "0xYourWallet…" },
    "amount_usd_cents": 2500,
    "memo": "Invoice #1234",
    "email": "[email protected]"
  }'

Required: settlement.address (a 0x EVM address) and amount_usd_cents ($1 to $100k). Optional: settlement.chain (Base, Arbitrum, Optimism, Polygon, Ethereum, default Base), settlement.asset (USDC or USDT, default USDC), memo, email.

Response:

{
  "id": "I8DrmEZ_pFsmZqknbmZc",
  "status": "pending",
  "amount_usd_cents": 2500,
  "settlement": { "chain": "BASE", "asset": "USDC", "address": "0xYourWallet…" },
  "pay_url": "https://shieldz.cash/pay/I8DrmEZ_pFsmZqknbmZc",
  "manage_url": "https://shieldz.cash/a/8_ah9oJ4WcvZnJRTDxD-8xSjVUiPYcwA",
  "manage_token": "8_ah9oJ4WcvZnJRTDxD-8xSjVUiPYcwA",
  "embed": "<script src=\"https://shieldz.cash/embed/button.js\" data-href=\"https://shieldz.cash/pay/I8DrmEZ_pFsmZqknbmZc\" data-label=\"Pay\"></script>"
}

Send the payer to pay_url, or drop the embed snippet on any page. Keep manage_token, it is how you read status later.

No JSON body? Any tool that can build a URL can mint the same link with a plain GET: GET https://shieldz.cash/api/v1/links?to=0x…&amount=25&chain=BASE&asset=USDC. Same response, including the manage_token claim code. to and amount are hand-writable aliases.

2Create a tip jar

POST /api/v1/tip-jars, a reusable "pay what you want" page where the payer chooses the amount. Idempotent per wallet address: calling again updates the same jar.

curl https://shieldz.cash/api/v1/tip-jars \
  -H "Content-Type: application/json" \
  -d '{
    "settlement": { "chain": "BASE", "asset": "USDC", "address": "0xYourWallet…" },
    "title": "Buy me a coffee",
    "brand": "Acme Store",
    "description": "Support my open-source work",
    "suggested_amounts_usd_cents": [300, 500, 1000],
    "logo": "https://you.com/logo.png",
    "image_url": "https://you.com/hero.png",
    "accent": "#7c3aed",
    "social": { "website": "https://you.com", "x": "https://x.com/you" },
    "email": "[email protected]"
  }'

Optional: title, description, suggested_amounts_usd_cents (up to 8 preset buttons), and a custom slug.

White-label (all optional): image_url (a logo/hero image), accent (one #RRGGBB that themes the whole page and the checkout it leads to), and social (website, x, instagram, telegram, youtube). The page wears the creator's brand, and the accent carries through to the hosted checkout.

{
  "object": "tip_jar",
  "slug": "tip-10851092bec481a4",
  "url": "https://shieldz.cash/tip/tip-10851092bec481a4",
  "settlement": { "chain": "BASE", "asset": "USDC", "address": "0xYourWallet…" },
  "suggested_amounts_usd_cents": [300, 500, 1000],
  "manage_url": "https://shieldz.cash/a/8_ah9oJ4WcvZnJRTDxD-8xSjVUiPYcwA",
  "manage_token": "8_ah9oJ4WcvZnJRTDxD-8xSjVUiPYcwA"
}

Plain GET too: GET https://shieldz.cash/api/v1/tip-jars?to=0x…&title=Buy+me+a+coffee&amounts=1,5,20&accent=%237c3aed&image=https://you.com/logo.png&website=https://you.com&x=https://x.com/you mints the same white-labeled jar from a single URL, so even a fetch-only tool can do it. Prefer a form? Use the tip jar generator or the payment link generator, no code.

3Read the dashboard agent-readable

The manage_token resolves to a dashboard with no login. Two shapes from the same URL:

URLFor
https://shieldz.cash/a/<token>Clean semantic HTML, every value carries a data-* attribute an agent can parse.
https://shieldz.cash/a/<token>.jsonStructured JSON: settlement, tip jars, totals, and the full invoice list.
curl https://shieldz.cash/a/8_ah9oJ4WcvZnJRTDxD-8xSjVUiPYcwA.json
{
  "object": "link_account",
  "claimed": false,
  "email_on_file": true,
  "settlement": { "chain": "BASE", "asset": "USDC", "address": "0xYourWallet…" },
  "tip_jars": [
    { "slug": "tip-10851092bec481a4", "url": "https://shieldz.cash/tip/tip-10851092bec481a4", "title": "Buy me a coffee" }
  ],
  "totals": {
    "currency": "usd",
    "paid_count": 1, "paid_amount_usd_cents": 2500,
    "pending_count": 1, "pending_amount_usd_cents": 1000,
    "invoice_count": 2
  },
  "invoices": [
    { "id": "I8DrmEZ_pFsmZqknbmZc", "status": "paid", "amount_usd_cents": 2500,
      "paid_at": 1750000000000, "pay_url": "https://shieldz.cash/pay/I8DrmEZ_pFsmZqknbmZc" }
  ]
}

Hand off to a human claim

The optional email and the manage_token let an agent hand an account to its human owner. The owner signs in (wallet or email) and claims a full dashboard:

POST /api/v1/links/claim with Authorization: Bearer <session> and body { "manage_token": "…" }.

The manage_token is the capability secret. A keyless account's id is derived from the public wallet address, so it is guessable, the token is 192 bits of entropy and is not. Claiming therefore requires the token: no one can take over an account by knowing only the wallet address, and once claimed it cannot be re-claimed by a different login.

Use it from an MCP client Claude, etc.

Shieldz exposes three tools, create_payment_link, create_tip_jar, and get_account_status, with no API key required. Two ways to connect any MCP client.

Remote (no install), point your client at the hosted Streamable HTTP server at https://shieldz.cash/mcp:

{
  "mcpServers": {
    "shieldz": { "url": "https://shieldz.cash/mcp" }
  }
}

Local (stdio), run the @shieldz/mcp package via npx:

{
  "mcpServers": {
    "shieldz": {
      "command": "npx",
      "args": ["-y", "@shieldz/mcp"]
    }
  }
}

Set SHIELDZ_API_KEY (stdio) to additionally enable full invoice management tools for merchants with an account.

Add to Goose one-click

Goose is MCP-native. Click to install the remote server (opens Goose Desktop):

Add Shieldz to Goose

Or from the CLI: run goose configureAdd ExtensionRemote Extension (Streamable HTTP) → URL https://shieldz.cash/mcp. No key, no args.

Call it from any LLM function calling

You do not need MCP. Because every endpoint is a plain keyless HTTP call, you can expose Shieldz as a tool to any function-calling model, OpenAI, Anthropic, LangChain, or the Vercel AI SDK, with the same schema. Register the tool, then have your handler POST to /api/v1/links (above):

{
  "type": "function",
  "function": {
    "name": "create_payment_link",
    "description": "Create a one-time crypto payment link. Funds settle non-custodially straight to the given wallet. No API key needed.",
    "parameters": {
      "type": "object",
      "properties": {
        "address":          { "type": "string",  "description": "0x EVM wallet address to settle to" },
        "amount_usd_cents": { "type": "integer", "description": "Amount in USD cents (100 to 10000000)" },
        "chain":            { "type": "string",  "enum": ["BASE","ARBITRUM","OPTIMISM","POLYGON","ETHEREUM"], "default": "BASE" },
        "asset":            { "type": "string",  "enum": ["USDC","USDT"], "default": "USDC" },
        "memo":             { "type": "string" }
      },
      "required": ["address", "amount_usd_cents"]
    }
  }
}

create_tip_jar and get_account_status follow the same shape. Your tool handler just forwards the arguments to the matching endpoint and returns pay_url / url to the model.

FAQ

Can an AI agent accept crypto payments without an account?

Yes. Shieldz is keyless: an agent POSTs a wallet address and gets back a working payment link, no signup, no API key, no dashboard. Funds settle straight to that wallet.

Is it custodial? Who holds the money?

Non-custodial. Payments settle directly to the address the agent provides; Shieldz never holds funds and there is no platform fee (network gas only). You can verify that yourself.

How does the agent read whether it got paid?

GET /a/<manage_token>.json returns structured status, totals, and the invoice list, an agent-readable dashboard. There is also a signed webhook for account holders.

Does it work with MCP?

Yes, natively. Point any MCP client at https://shieldz.cash/mcp (remote) or run @shieldz/mcp locally. See the overview for AI agents.

Notes

Funds are never held by Shieldz, they settle directly to the address you pass. There is no fee on the payment (network gas only). The same payment link and tip jar surfaces work for human checkout, so anything an agent creates is immediately usable by a person. Prefer a full account with API keys, webhooks, and a hosted dashboard? See the developer quickstart.

Machine-readable discovery: llms.txt · openapi.json · apis.json. Related reading: crypto payments for AI agents and the step-by-step how-to.