Creating a Subscription
When a customer wants to subscribe, you create a subscription for them on one of your plans.
Step 1 — Create the subscription
POST /api/v3/subscriptions
Identify the subscriber by email. You can also attach a customerProfile. Its profileId comes back as customerProfileId, so you can match webhooks and filter lists against your own records.
curl -X POST https://api.confirmo.com/api/v3/subscriptions \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"planId": "9f3a6e2c-1b7d-4c5e-9a0f-2d8b4e6c1a3f",
"subscriber": { "email": "[email protected]" },
"customerProfile": {
"type": "individual",
"profileId": "user-8421",
"firstName": "Jane",
"lastName": "Doe",
"dateOfBirth": "1990-04-21",
"streetAddress": "Musterstrasse 12",
"city": "Mannheim",
"postalCode": "68159",
"country": "DE"
},
"notifyUrl": "https://your-platform.com/webhooks/subscriptions",
"returnUrl": "https://your-platform.com/account/billing"
}'Request body parameters:
| Field | Required | Description |
|---|---|---|
planId | Yes | The plan this subscription bills against. |
subscriber.email | Yes | The subscriber's email address. |
amount | Conditional | The per-subscription amount (value only; the currency comes from the plan). Required for a VARIABLE plan, omit it for FIXED. |
customerProfile | Conditional | Travel Rule information for the customer who owns this account. Mandatory for Merchants operating in the EU. |
notifyUrl | No | Where Confirmo sends all lifecycle and payment events. We recommend always setting it. |
returnUrl | No | Where the subscriber lands after checkout. |
AboutcustomerProfileConfirmo uses it to meet Travel Rule obligations on the underlying transfers. It's never shown to the subscriber, and only
profileIdis returned to you. If you are a merchant operating in the EU, you must supply a complete profile on every subscription — otherwise the request is rejected with422 CUSTOMER_PROFILE_REQUIRED.
The response includes a checkoutUrl (e.g. https://checkout.confirmo.com/s/...). The subscription sits in PENDING until the subscriber completes checkout.
Step 2 — Send the subscriber to checkout
Redirect the subscriber to the checkoutUrl, or send it to them by email or link. The checkout is a Confirmo-hosted page that shows the subscriber exactly what they're signing up for — the plan name, amount, and frequency — before they authorise anything.
A suggested integrationLet the subscriber pick their plan on your own site, redirect them to the hosted
checkoutUrl, and send them straight back to yourreturnUrlonce checkout is done. This creates a continuous checkout experience for the subscriber.
Here's what the subscriber does:
- Opens your checkout link and reviews the plan summary.
- Connects a wallet via WalletConnect.
- Chooses a chain and stablecoin from the options you've enabled.
- Approves a spending allowance for the subscription. This is a single signature, and the checkout shows clearly what's being authorised, including any network fees.
- The first charge confirms, the subscription becomes
ACTIVE, and they're redirected to yourreturnUrl. Future payments are collected automatically, with nothing more for the subscriber to do.
Network feesSubscribers never pay network fees on recurring charges. The only exception is a small one-time fee at subscription creation, when the chosen token needs an on-chain approval (USDT on all chains except Polygon, and any token on Solana). Every other token and chain combination uses a free gasless signature.
Step 3 — Provision access
When the first payment confirms, Confirmo sends subscription.activated to your notifyUrl. Provision access on that event — not when you create the subscription, since a PENDING subscription hasn't been paid for yet. See Subscription Webhooks.
APENDINGsubscription can time outIf the subscriber never finishes checkout, the subscription is auto-canceled with
cancellation.reason: CHECKOUT_TIMEOUT. Wait forsubscription.activatedbefore you provision access.

