API reference

Sendclap API

Use the API to sell from your own site or app. You can create checkouts from your backend, find out when they are paid, and manage license keys inside the software you ship.

Base URLhttps://sendclap.com/api/v1

Requests and responses are JSON. Amounts are in US dollars, so 29 means $29.00.

For AI agents

Sendclap is built so that software can pay creators as easily as people can. There are three ways in, and none of them needs a browser.

FieldTypeDescription
x402payAn agent with a wallet requests a URL, receives the price, and pays in USDC on Base in the same HTTP exchange. No account and no API key.
MCPtoolsConnect an assistant to https://sendclap.com/mcp to look up creators, start checkouts and read your own payments.
RESTdataPlain JSON endpoints for everything a creator can see in the dashboard.

A machine-readable summary of the whole product lives at /llms.txt.

Pay with x402

GEThttps://sendclap.com/x402/{handle}/tip?amount=5

GEThttps://sendclap.com/x402/{handle}/products/{id}?email=…

x402 is the open standard that puts payments on HTTP status 402. Request one of these URLs and the server answers 402 Payment Required with the price in a PAYMENT-REQUIRED header. Your client signs a USDC transfer for that amount and repeats the request with a PAYMENT-SIGNATURE header. The USDC moves straight from your wallet to the creator's, and the reply carries the result and a PAYMENT-RESPONSE header with the transaction.

FieldTypeDescription
amountnumberTip amount in US dollars, from 0.01 to 10000. Defaults to the creator's suggested tip.
emailstringWhere to send the receipt. Required for products, because that is where the purchase is delivered.
messagestringAn optional note that appears on the creator's page with the tip.
1 · Ask for the price
curl -i "https://sendclap.com/x402/demo/tip?amount=1"
Response · 402
HTTP/2 402
payment-required: eyJ4NDAyVmVyc2lvbiI6Mi…

{
  "x402Version": 2,
  "error": "PAYMENT-SIGNATURE header is required",
  "resource": { "url": "https://sendclap.com/x402/demo/tip?amount=1", "description": "A $1 tip for Ada Builds", "mimeType": "application/json" },
  "accepts": [{
    "scheme": "exact", "network": "eip155:84532", "amount": "1000000",
    "asset": "0x036CbD53842c5426634e7929541eC2318f3dCF7e",
    "payTo": "0x…the creator's split address", "maxTimeoutSeconds": 120,
    "extra": { "name": "USDC", "version": "2" }
  }]
}
2 · Pay and repeat, with any x402 client
import { wrapFetchWithPaymentFromConfig } from "@x402/fetch"
import { ExactEvmScheme } from "@x402/evm"
import { privateKeyToAccount } from "viem/accounts"

const account = privateKeyToAccount(process.env.AGENT_KEY)
const pay = wrapFetchWithPaymentFromConfig(fetch, {
  schemes: [{ network: "eip155:*", client: new ExactEvmScheme(account) }],
})

const res = await pay("https://sendclap.com/x402/demo/tip?amount=1")
console.log(await res.json())
Response · 200
{
  "paid": true, "amount": 1, "currency": "usd", "to": "demo",
  "payer": "0x…", "transaction": "0x…", "network": "eip155:84532",
  "message": "Thank you from Ada Builds!"
}

Buying a product the same way returns its license_key and download_url in the reply. Payments over x402 use the exact scheme with USDC on Base Sepolia, and they cost the same flat 1% as everything else. The payTo address is the creator's own split address, a small public contract that forwards 99% to the creator's wallet and 1% to Sendclap and can do nothing else. A creator needs a wallet address in their settings to be payable this way, and looking up a creator tells you whether they are.

MCP server

POSThttps://sendclap.com/mcp

The Model Context Protocol server gives an AI assistant Sendclap as a set of tools. It speaks MCP over HTTP and keeps no session. Without a key, an assistant can look up any creator and start a checkout for someone to pay. With a creator's API key it can also answer questions about that creator's payments, members, license keys and disputes.

Add it to an MCP client
{
  "mcpServers": {
    "sendclap": {
      "type": "http",
      "url": "https://sendclap.com/mcp",
      "headers": { "Authorization": "Bearer sc_your_key" }
    }
  }
}
FieldTypeDescription
get_creatorpublicLook up a Sendclap page: who the creator is, their membership tiers and products with prices, and every way to pay them, including x402 URLs an agent can pay directly with USDC.
create_checkoutpublicStart a payment to a creator and get a checkout URL for a person to open and pay. Use type "tip" with an amount in US dollars, "product" with a product_id, or "membership" with a tier_id and the payer's email.
get_checkoutpublicCheck whether a checkout created with create_checkout has been paid.
get_statsneeds keyYour earnings on Sendclap: payments and income for the last 30 days and all time, active members, monthly recurring income and open disputes.
list_paymentsneeds keyYour most recent payments, newest first. Filter by status (paid, disputed, lost, refunded), type (tip, product, membership) or customer email.
get_paymentneeds keyOne payment in full: what was sold, the purchase IP and device, any dispute, and the customer's activity log that serves as dispute evidence.
list_membersneeds keyYour members with their tier, status and when their current period ends.
list_licensesneeds keyLicense keys you have issued, with how many devices each is activated on. Optionally only for one customer email.
list_disputesneeds keyCard disputes on your payments, with their status and the date to respond by.

Authentication

Create an API key on your dashboard and send it as a bearer token with every checkout request. The key is shown once, and creating a new one stops the old one from working, so keep it on your server and out of client-side code.

Header
Authorization: Bearer sc_your_key

The license endpoints need no key, which lets you call them straight from the app your customers run.

Create a checkout

POST/checkouts

Creates a checkout and returns a url. Send your customer to that address to pay, and they will land on a thank-you page when they finish.

FieldTypeDescription
typestringWhat is being paid for: tip, product or membership. Required.
amountnumberThe tip amount in US dollars, from 1 to 10000. Required for a tip.
product_idnumberThe product to sell. Required for a product.
tier_idnumberThe membership tier to join. Required for a membership.
emailstringThe customer's email, used for the receipt and delivery. Required for a membership.
methodstringcard, which is the default, or crypto.
messagestringAn optional note from the customer, up to 500 characters.
Request
curl https://sendclap.com/api/v1/checkouts \
  -H "Authorization: Bearer sc_your_key" \
  -H "Content-Type: application/json" \
  -d '{"type": "product", "product_id": 1, "email": "buyer@example.com"}'
Response · 201
{
  "id": "0x4f1c…",
  "status": "pending",
  "type": "product",
  "amount": 29,
  "currency": "usd",
  "method": "card",
  "email": "buyer@example.com",
  "url": "https://sendclap.com/checkout/0x4f1c…"
}

Retrieve a checkout

GET/checkouts/{id}

Returns the checkout. Its status is pending until the payment goes through and paid afterwards, so you can poll this endpoint before you deliver an order.

Request
curl https://sendclap.com/api/v1/checkouts/0x4f1c… \
  -H "Authorization: Bearer sc_your_key"
Response · 200
{
  "id": "0x4f1c…",
  "status": "paid",
  "type": "product",
  "amount": 29,
  "currency": "usd",
  "method": "card",
  "email": "buyer@example.com",
  "url": "https://sendclap.com/checkout/0x4f1c…"
}

Your data

Everything in your dashboard is also available as JSON. These endpoints need your API key and only ever return your own data.

FieldTypeDescription
GET /meYour earnings for the last 30 days and all time, active members, monthly recurring income and open disputes.
GET /paymentsYour payments, newest first. Filter with status, type, email and limit (up to 500).
GET /payments/{id}One payment with the purchase IP and device, any dispute, and the customer's full activity log.
GET /membersYour members with tier, status and the end of their current period.
GET /licensesLicense keys you issued and how many devices each is activated on. Filter with email.
GET /disputesCard disputes with their status and the date to respond by.
GET /productsYour products with prices and checkout links.
GET /membershipsYour membership tiers.
Request
curl "https://sendclap.com/api/v1/payments?status=paid&limit=2" \
  -H "Authorization: Bearer sc_your_key"
Response · 200
[
  {
    "id": 42, "type": "product", "method": "card", "status": "paid",
    "amount": 29, "fee": 0.29, "currency": "usd",
    "email": "buyer@example.com", "message": null,
    "reference": "pi:pi_3Q…", "test": false,
    "created_at": "2026-11-13T18:04:11.000Z"
  }
]

Look up a creator

GET/creators/{handle}

Public and needs no key. It returns who the creator is, what they offer and every way to pay them, including the x402 URLs when they can be paid by an agent.

Request
curl https://sendclap.com/api/v1/creators/demo
Response · 200
{
  "handle": "demo", "name": "Ada Builds", "bio": "I make open-source tools…",
  "url": "https://sendclap.com/demo",
  "payment_methods": { "card": true, "crypto": true, "x402": true },
  "tip": { "suggested": 5, "currency": "usd", "page": "https://sendclap.com/demo",
           "x402": "https://sendclap.com/x402/demo/tip?amount=5" },
  "memberships": [{ "id": 1, "name": "Supporter", "price": 5, "interval": "month", … }],
  "products": [{ "id": 1, "name": "Pro license", "price": 29,
                 "page": "https://sendclap.com/demo/buy/1",
                 "x402": "https://sendclap.com/x402/demo/products/1", … }]
}

Activate a license

POST/licenses/activate

Products can issue a license key with each purchase. Activating a key registers one device against it, and each key allows the number of devices you set on the product. Activating the same device twice counts once.

FieldTypeDescription
license_keystringThe key your customer received with their purchase.
instance_idstringA name for the device or installation that you choose, such as a machine id. Required.
Request
curl https://sendclap.com/api/v1/licenses/activate \
  -H "Content-Type: application/json" \
  -d '{"license_key": "ABCDE-FGHJK-LMNPQ-RSTUV", "instance_id": "ada-laptop"}'
Response · 200
{
  "activated": true,
  "instance_id": "ada-laptop",
  "license": {"key": "ABCDE-FGHJK-LMNPQ-RSTUV", "activations": 1, "max_activations": 3},
  "product": {"id": 1, "name": "Pro license"}
}

Validate a license

POST/licenses/validate

Checks a key when your app starts. With an instance_id, the key is valid only if that device is activated. Without one, the key is valid as long as it exists.

FieldTypeDescription
license_keystringThe key your customer received with their purchase.
instance_idstringThe device to check. Optional.
Request
curl https://sendclap.com/api/v1/licenses/validate \
  -H "Content-Type: application/json" \
  -d '{"license_key": "ABCDE-FGHJK-LMNPQ-RSTUV", "instance_id": "ada-laptop"}'
Response · 200
{
  "valid": true,
  "license": {"key": "ABCDE-FGHJK-LMNPQ-RSTUV", "activations": 1, "max_activations": 3},
  "product": {"id": 1, "name": "Pro license"}
}

Deactivate a license

POST/licenses/deactivate

Releases a device, which frees one activation for the customer to use on another machine.

FieldTypeDescription
license_keystringThe key your customer received with their purchase.
instance_idstringThe device to release. Required.
Request
curl https://sendclap.com/api/v1/licenses/deactivate \
  -H "Content-Type: application/json" \
  -d '{"license_key": "ABCDE-FGHJK-LMNPQ-RSTUV", "instance_id": "ada-laptop"}'
Response · 200
{
  "deactivated": true,
  "license": {"key": "ABCDE-FGHJK-LMNPQ-RSTUV", "activations": 0, "max_activations": 3},
  "product": {"id": 1, "name": "Pro license"}
}

Errors

Errors use standard HTTP status codes and come with a JSON body that explains what went wrong.

Error body
{"error": "product not found"}
StatusMeaning
400The request is missing a field or has an invalid value.
401The API key is missing or no longer valid.
404The checkout, product, tier or license key doesn't exist.
409The license key has used all of its activations.