Subscriptions
Subscriptions represent recurring billing arrangements between a customer and a plan.
Billing Cadence Options
| Cadence | Configuration |
|---|---|
| Weekly | interval: "day", interval_count: 7 |
| Bi-weekly | interval: "day", interval_count: 14 |
| Monthly | interval: "month", interval_count: 1 |
| Quarterly | interval: "month", interval_count: 3 |
| Annually | interval: "month", interval_count: 12 |
Termination Strategies
| Strategy | How |
|---|---|
| Bill forever | Omit billing_cycles and end_date |
| After N cycles | Set billing_cycles: 12 |
| Until a date | Set end_date: "2025-12-31" |
Status Lifecycle
active → paused → active (resume)
active → canceled
active → completed (all cycles finished)
active → past_due (payment failed)
/subscriptions Create a subscription
Creates a new recurring billing subscription for a customer using a plan and payment method.
Prerequisites
Before creating a subscription, you need:
- A customer with at least one payment method
- A plan (created via the merchant dashboard)
- A payment method attached to the customer
Billing Cadence Options
Day-based: Charge every N days — ideal for custom intervals.
{ "interval": "day", "interval_count": 30 }
Month-based: Charge on a specific day of the month. If the month has fewer days than anchor_day, billing occurs on the last day of the month.
{ "interval": "month", "interval_count": 1, "anchor_day": 15 }
Subscription Duration
| Strategy | Configuration | Example |
|---|---|---|
| Bills forever | Omit billing_cycles and end_date |
Ongoing membership |
| After N cycles | billing_cycles: 12 |
12-month program |
| Until a date | end_date: "2025-12-31" |
School year subscription |
Header parameters
string"2026-02-11"string (uuid)"550e8400-e29b-41d4-a716-446655440000"Request body required
string"550e8400-e29b-41d4-a716-446655440000"string"6ba7b814-9dad-11d1-80b4-00c04fd430d0"string"6ba7b815-9dad-11d1-80b4-00c04fd430d1"objectenumdaymonth"month"integer1integer15string (date)"2025-02-01"integer12string"42"objectstring"John"string"Doe"string"123 Main St"string"Suite 100"string"San Francisco"string"CA"string"94105"string"US"string"+14155551234"string"6ba7b818-9dad-11d1-80b4-00c04fd430c8"string"SAVE10"Code samples
curl -X POST https://api.epd.com/v1/subscriptions \
-H "Authorization: Bearer epd_test_sk_xxxx" \
-H "Content-Type: application/json" \
-H "EPD-Version: 2026-02-11" \
-H "X-EPD-Idempotency-Key: $(uuidgen)" \
-d '{
"customer_id": "550e8400-e29b-41d4-a716-446655440000",
"plan_id": "6ba7b814-9dad-11d1-80b4-00c04fd430d0",
"payment_method_id": "6ba7b815-9dad-11d1-80b4-00c04fd430d1",
"billing_cycle": {
"interval": "month",
"interval_count": 1,
"anchor_day": 15
}
}' const response = await fetch('https://api.epd.com/v1/subscriptions', {
method: 'POST',
headers: {
'Authorization': 'Bearer epd_test_sk_xxxx',
'Content-Type': 'application/json',
'EPD-Version': '2026-02-11',
'X-EPD-Idempotency-Key': crypto.randomUUID(),
},
body: JSON.stringify({
customer_id: '550e8400-e29b-41d4-a716-446655440000',
plan_id: '6ba7b814-9dad-11d1-80b4-00c04fd430d0',
payment_method_id: '6ba7b815-9dad-11d1-80b4-00c04fd430d1',
billing_cycle: {
interval: 'month',
interval_count: 1,
anchor_day: 15,
},
}),
});
const subscription = await response.json();
console.log(subscription.id); // 6ba7b812-9dad-11d1-80b4-00c04fd430c8
console.log(subscription.status); // "active" import uuid
import requests
response = requests.post(
'https://api.epd.com/v1/subscriptions',
headers={
'Authorization': 'Bearer epd_test_sk_xxxx',
'EPD-Version': '2026-02-11',
'X-EPD-Idempotency-Key': str(uuid.uuid4()),
},
json={
'customer_id': '550e8400-e29b-41d4-a716-446655440000',
'plan_id': '6ba7b814-9dad-11d1-80b4-00c04fd430d0',
'payment_method_id': '6ba7b815-9dad-11d1-80b4-00c04fd430d1',
'billing_cycle': {
'interval': 'month',
'interval_count': 1,
'anchor_day': 15,
},
}
)
sub = response.json()
print(sub['id']) # 6ba7b812-9dad-11d1-80b4-00c04fd430c8
print(sub['status']) # "active" $ch = curl_init('https://api.epd.com/v1/subscriptions');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer epd_test_sk_xxxx',
'Content-Type: application/json',
'EPD-Version: 2026-02-11',
'X-EPD-Idempotency-Key: ' . wp_generate_uuid4(),
],
CURLOPT_POSTFIELDS => json_encode([
'customer_id' => '550e8400-e29b-41d4-a716-446655440000',
'plan_id' => '6ba7b814-9dad-11d1-80b4-00c04fd430d0',
'payment_method_id' => '6ba7b815-9dad-11d1-80b4-00c04fd430d1',
'billing_cycle' => [
'interval' => 'month',
'interval_count' => 1,
'anchor_day' => 15,
],
]),
]);
$sub = json_decode(curl_exec($ch), true);
echo $sub['status']; // "active" Responses
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8"string"550e8400-e29b-41d4-a716-446655440002"objectstring"6ba7b814-9dad-11d1-80b4-00c04fd430d2"string"Premium Monthly"integer2999string"usd"enumactivepausedcanceledcompletedpast_duefailed"active"BillingCycleobjectstring"6ba7b815-9dad-11d1-80b4-00c04fd430d2"string"4242"string"visa"objectstring (uuid)stringstringstringstringstringstringstringstringstringstring (date-time)"2024-01-15T10:30:00.000Z"string (date-time)"2024-02-15T10:30:00.000Z"integer3integer12string (date-time)"2024-02-15T10:30:00.000Z"string (date-time)"2023-11-15T00:00:00.000Z"string (date-time)"2024-11-15T00:00:00.000Z"string (date-time)objectstring (uuid)"6ba7b820-9dad-11d1-80b4-00c04fd430c8"string"SAVE10"string"Holiday Promo"enumgeneratedpromo"promo"number10integernullinteger500string"usd"enumoncerepeatingforever"repeating"integer3integer300string (date-time)"2023-11-15T00:00:00.000Z"string (date-time)"2024-01-15T10:30:00.000Z"objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]/subscriptions List all subscriptions
Query parameters
integer10string"550e8400-e29b-41d4-a716-446655440000"string"550e8400-e29b-41d4-a716-446655440001"string"550e8400-e29b-41d4-a716-446655440000"string"active"string"6ba7b814-9dad-11d1-80b4-00c04fd430d0"string"customer,plan"string"created_at[desc]"string"id,status,customer_id,created"Header parameters
string"2026-02-11"Responses
array[Subscription]any"/v1/subscriptions"objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]/subscriptions/{id} Retrieve a subscription
Path parameters
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8"Query parameters
stringHeader parameters
string"2026-02-11"Responses
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8"string"550e8400-e29b-41d4-a716-446655440002"objectstring"6ba7b814-9dad-11d1-80b4-00c04fd430d2"string"Premium Monthly"integer2999string"usd"enumactivepausedcanceledcompletedpast_duefailed"active"BillingCycleobjectstring"6ba7b815-9dad-11d1-80b4-00c04fd430d2"string"4242"string"visa"objectstring (uuid)stringstringstringstringstringstringstringstringstringstring (date-time)"2024-01-15T10:30:00.000Z"string (date-time)"2024-02-15T10:30:00.000Z"integer3integer12string (date-time)"2024-02-15T10:30:00.000Z"string (date-time)"2023-11-15T00:00:00.000Z"string (date-time)"2024-11-15T00:00:00.000Z"string (date-time)objectstring (uuid)"6ba7b820-9dad-11d1-80b4-00c04fd430c8"string"SAVE10"string"Holiday Promo"enumgeneratedpromo"promo"number10integernullinteger500string"usd"enumoncerepeatingforever"repeating"integer3integer300string (date-time)"2023-11-15T00:00:00.000Z"string (date-time)"2024-01-15T10:30:00.000Z"objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]/subscriptions/{id} Update a subscription
Updates a subscription. Only subscriptions with status active or paused can be modified.
Path parameters
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8"Header parameters
string"2026-02-11"string (uuid)"550e8400-e29b-41d4-a716-446655440000"Request body required
string"6ba7b815-9dad-11d1-80b4-00c04fd430c8"string"42"objectstring"John"string"Doe"string"456 Oak Ave"string"Apt 2B"string"Austin"string"TX"string"73301"string"US"string"+15125559876"string"6ba7b819-9dad-11d1-80b4-00c04fd430c8"objectenumdaymonth"month"integer1integer15Responses
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8"string"550e8400-e29b-41d4-a716-446655440002"objectstring"6ba7b814-9dad-11d1-80b4-00c04fd430d2"string"Premium Monthly"integer2999string"usd"enumactivepausedcanceledcompletedpast_duefailed"active"BillingCycleobjectstring"6ba7b815-9dad-11d1-80b4-00c04fd430d2"string"4242"string"visa"objectstring (uuid)stringstringstringstringstringstringstringstringstringstring (date-time)"2024-01-15T10:30:00.000Z"string (date-time)"2024-02-15T10:30:00.000Z"integer3integer12string (date-time)"2024-02-15T10:30:00.000Z"string (date-time)"2023-11-15T00:00:00.000Z"string (date-time)"2024-11-15T00:00:00.000Z"string (date-time)objectstring (uuid)"6ba7b820-9dad-11d1-80b4-00c04fd430c8"string"SAVE10"string"Holiday Promo"enumgeneratedpromo"promo"number10integernullinteger500string"usd"enumoncerepeatingforever"repeating"integer3integer300string (date-time)"2023-11-15T00:00:00.000Z"string (date-time)"2024-01-15T10:30:00.000Z"objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]/subscriptions/{id} Cancel a subscription
Cancels a subscription immediately. The subscription status changes to canceled and no further billing cycles are processed.
Eligibility
| Current Status | Can Cancel? | Notes |
|---|---|---|
active |
Yes | Stops future billing |
paused |
Yes | Cancels permanently |
canceled |
No | Returns 400 (already canceled) |
completed |
No | Returns 400 (already finished) |
Important: Cancellation is immediate and permanent. There is no "cancel at end of period" option — the subscription ends now. To bill through the current period, wait until
current_period_endbefore canceling.
Path parameters
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8"Header parameters
string"2026-02-11"string (uuid)"550e8400-e29b-41d4-a716-446655440000"Code samples
curl -X DELETE https://api.epd.com/v1/subscriptions/6ba7b812-9dad-11d1-80b4-00c04fd430c8 \
-H "Authorization: Bearer epd_test_sk_xxxx" \
-H "EPD-Version: 2026-02-11" \
-H "X-EPD-Idempotency-Key: $(uuidgen)" const response = await fetch('https://api.epd.com/v1/subscriptions/6ba7b812-9dad-11d1-80b4-00c04fd430c8', {
method: 'DELETE',
headers: {
'Authorization': 'Bearer epd_test_sk_xxxx',
'EPD-Version': '2026-02-11',
'X-EPD-Idempotency-Key': crypto.randomUUID(),
},
});
const result = await response.json();
console.log(result.status); // "canceled" import uuid
import requests
response = requests.delete(
'https://api.epd.com/v1/subscriptions/6ba7b812-9dad-11d1-80b4-00c04fd430c8',
headers={
'Authorization': 'Bearer epd_test_sk_xxxx',
'EPD-Version': '2026-02-11',
'X-EPD-Idempotency-Key': str(uuid.uuid4()),
}
)
result = response.json()
print(result['status']) # "canceled" Responses
string"6ba7b812-9dad-11d1-80b4-00c04fd430c8""canceled""canceled"string (date-time)"2024-01-15T10:30:00.000Z"objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]objectenuminvalid_request_errorauthentication_errorauthorization_errorrate_limit_erroridempotency_errorprocessing_errorwebhook_errorstring"validation_error"string"Request validation failed"string"email"string"req_a1b2c3d4e5f67890abcdef0123456789"array[object]