Products & Prices
These are the things you sell. You create them once in the dashboard and reference them by id from checkout. Here's exactly what each object holds.
Products, Prices and Payment Links are managed under Products & prices in the dashboard (the create/list endpoints are authenticated by your dashboard session, not by an API key). What a developer needs day-to-day is the id and the shape — both below.
Product
A named thing you sell. A Product groups one or more Prices.
{
"productId": "prod_1",
"name": "Pro plan",
"description": "Monthly workspace",
"active": true
}
Price
An amount in USD on a Product. This is what your button references. Stablecoins are 1:1 with USD, so unitAmountCents: 2900 means the buyer pays 29.00 USDC or USDT.
{
"priceId": "price_123",
"productId": "prod_1",
"unitAmountCents": 2900,
"amount": "29.00",
"currency": "usd",
"acceptedNetworks": [],
"acceptedTokens": [],
"type": "one_time",
"active": true
}
| Field | Notes |
|---|---|
unitAmountCents | The charge, in USD cents. |
acceptedNetworks | Chains the buyer may use. Empty = all chains you hold a wallet for. |
acceptedTokens | Tokens allowed. Empty = both USDC and USDT (where the chain supports them). |
type | "one_time" by default. "recurring" makes checkout start a subscription: the widget collects the buyer's email, and renewals are reminder-driven with a hosted one-click pay link (crypto is never auto-charged). |
interval | Recurring only: "month" (default) or "year". Each subscriber renews on their own signup anniversary. |
currency | Always "usd". |
Payment Link
A shareable wrapper around a Price, with an optional email capture. Open it with the embed using paymentLinkId or data-hashpay-link — handy for emails, social posts, or a "buy" button where you don't want to reference the raw Price.
{
"paymentLinkId": "plink_1",
"priceId": "price_123",
"collectEmail": true,
"active": true
}