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.
https://sendclap.com/api/v1Requests 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.
| Field | Type | Description |
|---|---|---|
x402 | pay | An 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. |
MCP | tools | Connect an assistant to https://sendclap.com/mcp to look up creators, start checkouts and read your own payments. |
REST | data | Plain 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.
| Field | Type | Description |
|---|---|---|
amount | number | Tip amount in US dollars, from 0.01 to 10000. Defaults to the creator's suggested tip. |
email | string | Where to send the receipt. Required for products, because that is where the purchase is delivered. |
message | string | An optional note that appears on the creator's page with the tip. |
curl -i "https://sendclap.com/x402/demo/tip?amount=1"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" }
}]
}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()){
"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.
{
"mcpServers": {
"sendclap": {
"type": "http",
"url": "https://sendclap.com/mcp",
"headers": { "Authorization": "Bearer sc_your_key" }
}
}
}| Field | Type | Description |
|---|---|---|
get_creator | public | Look 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_checkout | public | Start 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_checkout | public | Check whether a checkout created with create_checkout has been paid. |
get_stats | needs key | Your earnings on Sendclap: payments and income for the last 30 days and all time, active members, monthly recurring income and open disputes. |
list_payments | needs key | Your most recent payments, newest first. Filter by status (paid, disputed, lost, refunded), type (tip, product, membership) or customer email. |
get_payment | needs key | One 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_members | needs key | Your members with their tier, status and when their current period ends. |
list_licenses | needs key | License keys you have issued, with how many devices each is activated on. Optionally only for one customer email. |
list_disputes | needs key | Card 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.
Authorization: Bearer sc_your_keyThe 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.
| Field | Type | Description |
|---|---|---|
type | string | What is being paid for: tip, product or membership. Required. |
amount | number | The tip amount in US dollars, from 1 to 10000. Required for a tip. |
product_id | number | The product to sell. Required for a product. |
tier_id | number | The membership tier to join. Required for a membership. |
email | string | The customer's email, used for the receipt and delivery. Required for a membership. |
method | string | card, which is the default, or crypto. |
message | string | An optional note from the customer, up to 500 characters. |
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"}'{
"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.
curl https://sendclap.com/api/v1/checkouts/0x4f1c… \
-H "Authorization: Bearer sc_your_key"{
"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.
| Field | Type | Description |
|---|---|---|
GET /me | Your earnings for the last 30 days and all time, active members, monthly recurring income and open disputes. | |
GET /payments | Your 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 /members | Your members with tier, status and the end of their current period. | |
GET /licenses | License keys you issued and how many devices each is activated on. Filter with email. | |
GET /disputes | Card disputes with their status and the date to respond by. | |
GET /products | Your products with prices and checkout links. | |
GET /memberships | Your membership tiers. |
curl "https://sendclap.com/api/v1/payments?status=paid&limit=2" \
-H "Authorization: Bearer sc_your_key"[
{
"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.
curl https://sendclap.com/api/v1/creators/demo{
"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.
| Field | Type | Description |
|---|---|---|
license_key | string | The key your customer received with their purchase. |
instance_id | string | A name for the device or installation that you choose, such as a machine id. Required. |
curl https://sendclap.com/api/v1/licenses/activate \
-H "Content-Type: application/json" \
-d '{"license_key": "ABCDE-FGHJK-LMNPQ-RSTUV", "instance_id": "ada-laptop"}'{
"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.
| Field | Type | Description |
|---|---|---|
license_key | string | The key your customer received with their purchase. |
instance_id | string | The device to check. Optional. |
curl https://sendclap.com/api/v1/licenses/validate \
-H "Content-Type: application/json" \
-d '{"license_key": "ABCDE-FGHJK-LMNPQ-RSTUV", "instance_id": "ada-laptop"}'{
"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.
| Field | Type | Description |
|---|---|---|
license_key | string | The key your customer received with their purchase. |
instance_id | string | The device to release. Required. |
curl https://sendclap.com/api/v1/licenses/deactivate \
-H "Content-Type: application/json" \
-d '{"license_key": "ABCDE-FGHJK-LMNPQ-RSTUV", "instance_id": "ada-laptop"}'{
"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": "product not found"}| Status | Meaning |
|---|---|
400 | The request is missing a field or has an invalid value. |
401 | The API key is missing or no longer valid. |
404 | The checkout, product, tier or license key doesn't exist. |
409 | The license key has used all of its activations. |