Update Subscription
Card Tokenization — Update Subscription
6 min readUpdated Mar 27, 2026
PUT /api/v1/payments/card/recurring/{subscriptionId}
Update plan parameters (amount, frequency, dates) or transition the subscription state (ACTIVE, PAUSED, CANCELED). All fields are optional — send only the fields you want to change.
#Headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | Bearer {token} — see Authentication |
#Request Body Parameters
| Field | Type | Required | Description |
|---|---|---|---|
plan | Object — See UpdatePlan | No | |
status | String (PENDING, TRIALING, ACTIVE, PAUSED, CANCELED) | No |
| Field | Type | Required | Description |
|---|---|---|---|
amount | String | No | Transaction amount as a decimal string in major currency units (e.g. "10.00" = ten dollars). Values with more than two decimal places are automatically rounded. |
currency | String | No | Three-letter ISO 4217 currency code (e.g. USD, EUR, GBP). |
frequency | String (DAILY, WEEKLY, MONTHLY, CUSTOM) | No | |
interval | Integer | No | |
startDate | String | No | |
endDate | String | No |
#Response
| Field | Type | Description |
|---|---|---|
subscriptionId | String | |
status | String (PENDING, TRIALING, ACTIVE, PAUSED, CANCELED) | |
nextChargeDate | String | |
createdAt | String | Timestamp when the transaction was created (ISO 8601 format). |
plan | Object — See SubscriptionPlanDto | |
billingDetails | Object — See BillingDetails | |
metadata | Map<String, String> | Arbitrary key-value pairs for your own use (e.g. order reference, campaign ID). Returned unchanged in responses and callbacks. |
failureCount | Integer | |
lastChargeDate | String | |
lastChargeStatus | String |
| Field | Type | Description |
|---|---|---|
amount | String | Transaction amount as a decimal string in major currency units (e.g. "10.00" = ten dollars). Values with more than two decimal places are automatically rounded. |
currency | String | Three-letter ISO 4217 currency code (e.g. USD, EUR, GBP). |
frequency | String (DAILY, WEEKLY, MONTHLY, CUSTOM) | |
interval | Integer | |
startDate | String | |
endDate | String |
| Field | Type | Description |
|---|---|---|
externalUserId | String | Your internal customer identifier. Useful for linking transactions to user accounts in your system. |
firstName | String | Customer's first name. Required for 3DS2 frictionless flow. |
lastName | String | Customer's last name. Required for 3DS2 frictionless flow. |
address1 | String | Billing street address (line 1). Required for 3DS2 frictionless flow. |
city | String | Billing city. Required for 3DS2 frictionless flow. |
state | String | Billing state or province. |
country | String | Billing country as an ISO 3166-1 alpha-2 code (e.g. US, GB, DE). |
postalCode | String | Billing ZIP or postal code. |
phone | String | Customer's phone number (including country code). Required for 3DS2 frictionless flow. |
email | String | Customer's email address. |
dateOfBirth | String | Customer's date of birth in YYYY-MM-DD format. Required for 3DS2 frictionless flow. |
{
"plan": {
"amount": "100.00",
"currency": "USD",
"frequency": "DAILY",
"interval": 12345,
"startDate": "2025-07-17",
"endDate": "2025-07-17"
},
"status": "PENDING"
}{
"subscriptionId": "192.168.1.1",
"status": "PENDING",
"nextChargeDate": "2025-07-17",
"createdAt": "example_createdAt",
"plan": {
"amount": "100.00",
"currency": "USD",
"frequency": "DAILY",
"interval": 12345,
"startDate": "2025-07-17",
"endDate": "2025-07-17"
},
"billingDetails": {
"externalUserId": "example_externalUserId",
"firstName": "John",
"lastName": "Doe",
"address1": "123 Main St",
"city": "New York",
"state": "NY",
"country": "US",
"postalCode": "10001",
"phone": "+12125551234",
"email": "test@example.com",
"dateOfBirth": "2025-07-17"
},
"metadata": {
"key1": "value1"
},
"failureCount": 12345,
"lastChargeDate": "2025-07-17",
"lastChargeStatus": "example_lastChargeStatus"
}Idempotency: The
requestIdfield ensures idempotent processing. If you retry a request with the samerequestId, the original response is returned without reprocessing.
#Error Responses
| HTTP Status | Description |
|---|---|
400 | Bad Request — missing or invalid parameters. Check the response body for field-level details. |
401 | Unauthorized — missing, expired, or invalid bearer token. Re-authenticate via POST /api/v1/auth. |
404 | Not Found — the requested resource does not exist. |
500 | Internal Server Error — an unexpected error occurred. Retry with exponential backoff. |
curl -X PUT https://sandbox.api.exirom.com/api/v1/payments/card/recurring/12345 \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"plan": {
"amount": "100.00",
"currency": "USD",
"frequency": "DAILY",
"interval": 12345,
"startDate": "2025-07-17",
"endDate": "2025-07-17"
},
"status": "PENDING"
}'#Try It
SandboxTry it
https://sandbox.api.exirom.com/api
Was this helpful?