> ## Documentation Index
> Fetch the complete documentation index at: https://docs.reclack.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Products and prices

> Model what you sell, and what it costs, without hard-coding either.

A product is the thing. A price is the deal. Keeping them apart means you can
change what you charge without touching what you sell, and without rewriting
your integration.

<Frame caption="One product, as many prices as the way you sell needs">
  <img className="block dark:hidden" src="https://mintcdn.com/reclack/hSqUHJp0KVXvwTsQ/images/catalog.svg?fit=max&auto=format&n=hSqUHJp0KVXvwTsQ&q=85&s=bee14d4dd564bd2ea64564d9e1e94adc" alt="A product record on the left linked to three prices: monthly and yearly on Base, and monthly on Ethereum." width="880" height="326" data-path="images/catalog.svg" />

  <img className="hidden dark:block" src="https://mintcdn.com/reclack/hSqUHJp0KVXvwTsQ/images/catalog-dark.svg?fit=max&auto=format&n=hSqUHJp0KVXvwTsQ&q=85&s=c91497263d58f44cf7bb0aafca24100d" alt="A product record on the left linked to three prices: monthly and yearly on Base, and monthly on Ethereum." width="880" height="326" data-path="images/catalog-dark.svg" />
</Frame>

## Creating a product with its first price

Most of the time you want both at once, so the create call accepts a nested
price.

<CodeGroup>
  ```bash curl theme={null}
  curl -X POST "https://api.reclack.com/v1/products" \
    -H "Api-Key: $RECLACK_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "name": "Pro Plan",
      "description": "Everything in Starter, plus priority support",
      "price": {
        "amount": "29.00",
        "cadence": "monthly",
        "networks": ["base", "ethereum"]
      },
      "metadata": { "tier": "pro" }
    }'
  ```

  ```js Node theme={null}
  const product = await reclack("/v1/products", {
    method: "POST",
    body: {
      name: "Pro Plan",
      description: "Everything in Starter, plus priority support",
      price: {
        amount: "29.00",
        cadence: "monthly",
        networks: ["base", "ethereum"],
      },
      metadata: { tier: "pro" },
    },
  });
  ```
</CodeGroup>

```json Response theme={null}
{
  "data": {
    "id": "prod_2Pb8xk9",
    "name": "Pro Plan",
    "description": "Everything in Starter, plus priority support",
    "active": true,
    "metadata": { "tier": "pro" },
    "prices": [
      {
        "id": "price_7Fh2PqX9",
        "product_id": "prod_2Pb8xk9",
        "amount": "29.00",
        "currency": "USDC",
        "cadence": "monthly",
        "interval_seconds": 2592000,
        "network": "base",
        "chain_id": 8453,
        "active": true
      }
    ],
    "created_at": "2026-10-18T22:07:41Z",
    "updated_at": "2026-10-18T22:07:41Z"
  }
}
```

## Cadences

| Cadence | Bills | Typical use |
| - | - | - |
| `once` | A single payment | One-off purchases, top-ups |
| `daily` | Every day | Short trials, high-frequency services |
| `weekly` | Every week | Lightweight memberships |
| `monthly` | Every month | Most SaaS plans |
| `yearly` | Every year | Annual plans, usually at a discount |

If you need an interval the list does not cover, send `interval_seconds`
instead and Reclack bills on that rhythm.

## Adding more prices

A product can carry as many prices as you need. Add a yearly option next to the
monthly one:

```bash theme={null}
curl -X POST "https://api.reclack.com/v1/products/prod_2Pb8xk9/prices" \
  -H "Api-Key: $RECLACK_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "amount": "290.00",
    "cadence": "yearly",
    "networks": ["base"]
  }'
```

<Tip>
  Changing a price is usually the wrong instinct. Create a new one and point new
  customers at it. Existing subscriptions keep the terms their customers agreed
  to, which is what the approval in their wallet was signed against.
</Tip>

## Networks

A price lists the networks it can settle on. The payer picks from that list at
checkout, which means they can settle where their funds already are rather than
bridging first.

```json theme={null}
{
  "amount": "29.00",
  "cadence": "monthly",
  "networks": ["base", "ethereum", "polygon"]
}
```

You need a registered settlement address for each network you accept. See
[Settlement](/guides/settlement).

## Retiring a price

Deactivate rather than delete where a price has history. A deleted price takes
its reporting with it, and a subscription that referenced it becomes harder to
explain.

```bash theme={null}
curl -X PATCH "https://api.reclack.com/v1/products/prod_2Pb8xk9/prices/price_7Fh2PqX9" \
  -H "Api-Key: $RECLACK_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "active": false }'
```

An inactive price cannot start new subscriptions. The ones already running are
untouched.

Full parameters are in the [products](/api-reference/products/create) and
[prices](/api-reference/prices/create) reference.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.