Create Subscription
Changed onCreates a new subscription with the specified parameters.
Subscription Lifecycle:
- When first created, the subscription has a PENDING status
- To initiate billing, you must call the activate endpoint with payment details
- Once activated, the subscription will automatically bill according to the configured interval
Create from a price:
Send priceId instead of the billing settings. The subscription copies the price's amount, currency, interval, interval count and trial days, and stores priceId and productId. With priceId, the billing and trial fields are rejected. A later change to the price never changes the subscription.
{
"priceId": "3c5a1f8e-2b7d-4e9a-9c41-7d2e6b0f5a13"
}
Key Configuration Parameters:
- Billing settings: Amount, currency, interval (daily, weekly, monthly, yearly). Send either these or priceId
- Schedule customization: Interval count, trial period duration
- Trial pricing: Offer a free trial with trialPeriodDays/trialPeriodEnd (no charge until the trial ends), or discounted introductory pricing with trialAmount + trialIntervalCount (the trialAmount is charged each billing cycle for that many cycles, then the regular amount applies). trialAmount can also be combined with trialPeriodDays/trialPeriodEnd to charge it once at activation for the whole trial period. trialIntervalCount requires trialAmount and cannot be combined with trialPeriodDays/trialPeriodEnd
Example — 5 EUR for the first 3 months, then 10 EUR/month:
{
"amount": 1000,
"currency": "EUR",
"interval": "month",
"intervalCount": 1,
"trialAmount": 500,
"trialIntervalCount": 3
}
The customer pays 5.00 EUR at activation and for the next two monthly cycles (3 discounted cycles in total), then 10.00 EUR every month.
- Allowed payment methods: An array of strings specifying which payment methods are allowed for this subscription (e.g., card, bizum)
- Customer information: Contact details, billing and shipping addresses
- Communication: Callback URLs for webhook notifications about subscription events
Best Practices:
- Set clear, descriptive names for subscriptions to help with identification
- Configure appropriate webhook notifications to monitor subscription status changes
- Consider offering trial periods to increase customer conversion rates
- Use metadata to store additional information relevant to your business logic
Request
- Base URLhttps://api.monei.com/v1
- AuthAPI key in header Authorization
- TypeScriptA function with typed inputs. Its response is checked against the schema.
Request body
Example request
{
"priceId": "3c5a1f8e-2b7d-4e9a-9c41-7d2e6b0f5a13",
"amount": 110,
"currency": "EUR",
"interval": "month",
"intervalCount": 1,
"allowedPaymentMethods": [
"card",
"bizum"
],
"description": "MoonMail Monthly Lite",
"customerId": "a4e1d1dd-e0c2-4f7a-a2b1-2b0f1f9b6b1e",
"customer": {
"email": "john.doe@example.com",
"name": "John Doe"
},
"billingDetails": {
"name": "John Doe",
"email": "john.doe@example.com",
"address": {
"country": "ES",
"city": "Málaga",
"line1": "Fake Street 123",
"zip": "1234",
"state": "Málaga"
}
},
"shippingDetails": {
"name": "John Doe",
"email": "john.doe@example.com",
"address": {
"country": "ES",
"city": "Málaga",
"line1": "Fake Street 123",
"zip": "1234",
"state": "Málaga"
}
},
"trialPeriodEnd": 1636366897,
"trialPeriodDays": 7,
"trialAmount": 100,
"trialIntervalCount": 3,
"retrySchedule": [
{
"interval": "day",
"intervalCount": 1
},
{
"interval": "day",
"intervalCount": 3
},
{
"interval": "week",
"intervalCount": 1
}
],
"callbackUrl": "https://example.com/subscriptions/callback",
"paymentCallbackUrl": "https://example.com/payments/callback",
"metadata": {
"systemId": "12345"
}
}Response
A subscription object
Example response
{
"id": "575bcd84-09fc-4a6e-8c4c-f88b8eb90bfa",
"amount": 110,
"currency": "EUR",
"allowedPaymentMethods": [
"card",
"bizum"
],
"description": "MoonMail Monthly Lite",
"accountId": "aa9333ba-82de-400c-9ae7-087b9f8d2242",
"status": "PENDING",
"priceId": "3c5a1f8e-2b7d-4e9a-9c41-7d2e6b0f5a13",
"productId": "8f2c6d1a-4b3e-4f7a-9d2c-1e5b7a9c3f60",
"customerId": "a4e1d1dd-e0c2-4f7a-a2b1-2b0f1f9b6b1e",
"customer": {
"email": "john.doe@example.com",
"name": "John Doe"
},
"billingDetails": {
"name": "John Doe",
"email": "john.doe@example.com",
"address": {
"country": "ES",
"city": "Málaga",
"line1": "Fake Street 123",
"zip": "1234",
"state": "Málaga"
}
},
"shippingDetails": {
"name": "John Doe",
"email": "john.doe@example.com",
"address": {
"country": "ES",
"city": "Málaga",
"line1": "Fake Street 123",
"zip": "1234",
"state": "Málaga"
}
},
"interval": "month",
"intervalCount": 1,
"pauseIntervalCount": 1,
"skipIntervalCount": 1,
"lastOrderId": "14379133960355",
"lastPayment": {
"id": "af6029f80f5fc73a8ad2753eea0b1be0",
"status": "PENDING",
"statusCode": "E000",
"statusMessage": "Transaction approved"
},
"paymentMethod": {
"method": "card",
"card": {
"country": "ES",
"brand": "visa",
"type": "credit",
"threeDSecureVersion": "2.1.0",
"threeDSecureFlow": "CHALLENGE",
"expiration": 2048544000,
"last4": "0004",
"fingerprint": "7f2afde1566286c5fb126bb7e79bef549755cce6033dc429013c46d1365ff0e9",
"tokenizationMethod": "applePay",
"cardholderName": "John Doe",
"cardholderEmail": "email@example.com"
}
},
"currentPeriodStart": 1636366897,
"currentPeriodEnd": 1636366897,
"trialPeriodEnd": 1636366897,
"trialAmount": 100,
"trialIntervalCount": 3,
"nextPaymentAt": 1636366897,
"retryCount": 1,
"retrySchedule": [
{
"interval": "day",
"intervalCount": 1
},
{
"interval": "day",
"intervalCount": 3
},
{
"interval": "week",
"intervalCount": 1
}
],
"lastProrationAt": 1636366897,
"lastProration": {
"credit": 500,
"charge": 1200,
"net": 700,
"paymentId": "af6029f80f5fc73a8ad2753eea0b1be0"
},
"traceDetails": {
"ip": "100.100.200.100",
"countryCode": "ES",
"lang": "es",
"deviceType": "desktop",
"browser": "Chrome",
"browserVersion": "83.0.4103.116",
"os": "Mac OS",
"osVersion": "10.15.4",
"source": "MONEI/PHP",
"sourceVersion": "0.1.2",
"userAgent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...",
"browserAccept": "text/html,application/xhtml+xml,application/json",
"browserColorDepth": "24",
"browserScreenHeight": "1152",
"browserScreenWidth": "2048",
"browserTimezoneOffset": "-120",
"userEmail": "user@example.com"
},
"sequenceId": "62b23b9f3627cc38b08ff471ccd313ad",
"callbackUrl": "https://example.com/subscriptions/callback",
"paymentCallbackUrl": "https://example.com/payments/callback",
"metadata": {
"systemId": "12345"
},
"createdAt": 1636366897,
"updatedAt": 1636366897
}Changes
- info
added the new optional request property
- info
the request property
became optional - info
the request property
became optional - info
the request property
became optional - info
added the optional property
to the response with the status - info
added the optional property
to the response with the status
- info
- info
added the new optional request property
- info
added the optional property
to the response with the status - info
the
response's property pattern^[a-zA-Z0-9_@./#&+-]{1,40}$was added for the status
- info