curl --request POST \
--url https://api.payviox.com/subscriptions/{subscription_id}/resume \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.payviox.com/subscriptions/{subscription_id}/resume"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.payviox.com/subscriptions/{subscription_id}/resume', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.payviox.com/subscriptions/{subscription_id}/resume",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.payviox.com/subscriptions/{subscription_id}/resume"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.payviox.com/subscriptions/{subscription_id}/resume")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.payviox.com/subscriptions/{subscription_id}/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "psub_8fKx2LmQp4ZrT7vW1nYc3aBd",
"status": "active",
"amount": 999,
"unit_amount": 1029,
"currency": "USD",
"interval": "month",
"interval_count": 1,
"interval_label": "every month",
"customer": "customer_abc123",
"customer_email": "john@example.com",
"order_id": "order_12345",
"items": [
{ "name": "Pro plan", "quantity": 1, "price": 999 }
],
"metadata": { "user_id": "usr_123" },
"payment_method": "credit",
"provider": "stripe",
"provider_subscription_id": "sub_1QxYz2AbCdEfGhIj",
"cycles_count": 2,
"current_period_end": "2026-12-13T10:30:00+00:00",
"cancel_at_period_end": false,
"canceled_at": null,
"canceled_by": null,
"cancel_requested_by": null,
"cancellation_reason": null,
"initial_session_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"management_url": "https://secure.payviox.com/subscription/k3Jd9QwL2xVb7NmP4tRz8YcF1sHg6UaE5oWi0qXn3BvM7ZpD",
"created_at": "2026-10-13T10:30:00+00:00"
}
{
"error": "subscription_update_failed",
"message": "Your customer canceled this subscription. Only they can resume it, from their management link."
}
{
"error": "subscription_update_failed",
"message": "This subscription was canceled by Payviox. Contact Payviox support."
}
{
"error": "subscription_update_failed",
"message": "A canceled subscription cannot be resumed."
}
{
"error": "subscription_update_failed",
"message": "The payment provider is unreachable. Try again in a moment."
}
Resume Subscription
Undo a scheduled cancellation (cancel_at_period_end=true) with the secret key, so the subscription keeps renewing. Only cancellations scheduled on the merchant side (cancel_requested_by api, manager or null) can be resumed; 403 when the customer (payer) or Payviox (admin, system) scheduled it. Returns the Subscription. Errors: 403, 409 already canceled, 502 Stripe refused, 503 Stripe unreachable
curl --request POST \
--url https://api.payviox.com/subscriptions/{subscription_id}/resume \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.payviox.com/subscriptions/{subscription_id}/resume"
headers = {"Authorization": "Bearer <token>"}
response = requests.post(url, headers=headers)
print(response.text)const options = {method: 'POST', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.payviox.com/subscriptions/{subscription_id}/resume', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.payviox.com/subscriptions/{subscription_id}/resume",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.payviox.com/subscriptions/{subscription_id}/resume"
req, _ := http.NewRequest("POST", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.payviox.com/subscriptions/{subscription_id}/resume")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.payviox.com/subscriptions/{subscription_id}/resume")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"id": "psub_8fKx2LmQp4ZrT7vW1nYc3aBd",
"status": "active",
"amount": 999,
"unit_amount": 1029,
"currency": "USD",
"interval": "month",
"interval_count": 1,
"interval_label": "every month",
"customer": "customer_abc123",
"customer_email": "john@example.com",
"order_id": "order_12345",
"items": [
{ "name": "Pro plan", "quantity": 1, "price": 999 }
],
"metadata": { "user_id": "usr_123" },
"payment_method": "credit",
"provider": "stripe",
"provider_subscription_id": "sub_1QxYz2AbCdEfGhIj",
"cycles_count": 2,
"current_period_end": "2026-12-13T10:30:00+00:00",
"cancel_at_period_end": false,
"canceled_at": null,
"canceled_by": null,
"cancel_requested_by": null,
"cancellation_reason": null,
"initial_session_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"management_url": "https://secure.payviox.com/subscription/k3Jd9QwL2xVb7NmP4tRz8YcF1sHg6UaE5oWi0qXn3BvM7ZpD",
"created_at": "2026-10-13T10:30:00+00:00"
}
{
"error": "subscription_update_failed",
"message": "Your customer canceled this subscription. Only they can resume it, from their management link."
}
{
"error": "subscription_update_failed",
"message": "This subscription was canceled by Payviox. Contact Payviox support."
}
{
"error": "subscription_update_failed",
"message": "A canceled subscription cannot be resumed."
}
{
"error": "subscription_update_failed",
"message": "The payment provider is unreachable. Try again in a moment."
}
Overview
Undoes a cancellation scheduled at the end of the period by your side — your backend (cancel_requested_by: "api"), your dashboard ("manager") or your Stripe dashboard (null). The subscription keeps renewing as before.
cancel_requested_by: "payer"), only they can resume it, from that same link; if Payviox did ("admin" or "system"), contact support. Both return 403.The customer’s cancellation is their withdrawal of consent to be charged: renewing anyway would be a charge they didn’t authorize, the typical cause of “canceled recurring payment” disputes. For the same reason, if you resume a customer’s cancellation directly in your Stripe dashboard, Payviox re-applies the cancellation.canceled (it reached current_period_end, or it was canceled immediately), it can’t be resumed: have the customer subscribe again with a new session.Authentication
This endpoint requires your Secret API Key (server-side only). See Authentication for details.Authorization: Bearer sk_live_xxxxxxxxxxxx
Path Parameters
psub_...).Response
The updated Subscription object, withcancel_at_period_end: false and cancellation_reason: null. If no cancellation was scheduled, it returns 200 without changing anything.
Example Requests
curl https://api.payviox.com/subscriptions/psub_8fKx2LmQp4ZrT7vW1nYc3aBd/resume \
-H "Authorization: Bearer sk_live_xxxxxxxxxxxx" \
-X POST
const response = await fetch(
'https://api.payviox.com/subscriptions/psub_8fKx2LmQp4ZrT7vW1nYc3aBd/resume',
{
method: 'POST',
headers: { Authorization: `Bearer ${process.env.PAYVIOX_SECRET_KEY}` },
}
);
const subscription = await response.json();
console.log(subscription.cancel_at_period_end); // false
import os
import requests
response = requests.post(
'https://api.payviox.com/subscriptions/psub_8fKx2LmQp4ZrT7vW1nYc3aBd/resume',
headers={'Authorization': f"Bearer {os.environ['PAYVIOX_SECRET_KEY']}"}
)
print(response.json()['cancel_at_period_end']) # False
Example Response
{
"id": "psub_8fKx2LmQp4ZrT7vW1nYc3aBd",
"status": "active",
"amount": 999,
"unit_amount": 1029,
"currency": "USD",
"interval": "month",
"interval_count": 1,
"interval_label": "every month",
"customer": "customer_abc123",
"customer_email": "john@example.com",
"order_id": "order_12345",
"items": [
{ "name": "Pro plan", "quantity": 1, "price": 999 }
],
"metadata": { "user_id": "usr_123" },
"payment_method": "credit",
"provider": "stripe",
"provider_subscription_id": "sub_1QxYz2AbCdEfGhIj",
"cycles_count": 2,
"current_period_end": "2026-12-13T10:30:00+00:00",
"cancel_at_period_end": false,
"canceled_at": null,
"canceled_by": null,
"cancel_requested_by": null,
"cancellation_reason": null,
"initial_session_id": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6",
"management_url": "https://secure.payviox.com/subscription/k3Jd9QwL2xVb7NmP4tRz8YcF1sHg6UaE5oWi0qXn3BvM7ZpD",
"created_at": "2026-10-13T10:30:00+00:00"
}
{
"error": "subscription_update_failed",
"message": "Your customer canceled this subscription. Only they can resume it, from their management link."
}
{
"error": "subscription_update_failed",
"message": "This subscription was canceled by Payviox. Contact Payviox support."
}
{
"error": "subscription_update_failed",
"message": "A canceled subscription cannot be resumed."
}
{
"error": "subscription_update_failed",
"message": "The payment provider is unreachable. Try again in a moment."
}
Error Responses
401 -- Unauthorized
401 -- Unauthorized
403 -- Cancellation scheduled by the customer or Payviox
403 -- Cancellation scheduled by the customer or Payviox
cancel_requested_by is payer (only the customer can resume, from their management link) or admin/system (contact support).404 -- Subscription not found
404 -- Subscription not found
subscription_not_found).409 -- Already canceled
409 -- Already canceled
409 with The subscription changed meanwhile. Try again. means it was modified during your request: retry.502 -- Provider refused
502 -- Provider refused
503 -- Provider unreachable
503 -- Provider unreachable
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Path Parameters
Payviox subscription ID (psub_...)
Response
Subscription resumed (or no cancellation was scheduled); returns the subscription
Payviox subscription ID (psub_ prefix)
active: paid up, renews automatically (also while a cancellation is scheduled, see cancel_at_period_end). past_due: the last renewal charge failed and Stripe is retrying it. canceled: ended, no further charges.
active, past_due, canceled Your price per period in cents — the amount of the signup session
Amount charged to the customer at each renewal, in cents. Includes the fees added for the customer at checkout, but not one-time add-on fees (such as fraud screening) charged on the first payment only, so it can be lower than the first charge.
Always USD
day, week, month, year Human-readable period, e.g. every month, every 3 months
order_id of the signup session. Renewals use {order_id}-{cycle}
Billing cycles started so far, signup included (1 = signup only). A renewal whose charge failed counts too.
true when the subscription is scheduled to end at current_period_end
Session ID of the signup payment
Customer identifier from the signup session
Customer email, from the signup session or entered at checkout
Items of the signup session (one period)
Metadata of the signup session
Method the customer subscribed with (read with provider)
credit, apple_pay, google_pay Provider that charges the renewals (stripe)
ID of the subscription on your Stripe account (sub_...). null until Payviox has created it, usually within a minute of the first payment.
End of the current billing period: date of the next renewal charge, or the date a scheduled cancellation takes effect
When the subscription ended (null while not canceled)
Who ended it: api (your backend), manager (your dashboard), admin (Payviox support), payer (the customer, from the management link), provider (on Stripe, e.g. after failed retries or a cancellation in the Stripe dashboard), system (Payviox, e.g. signup payment refunded or setup_failed). null until the subscription is canceled.
api, manager, admin, payer, provider, system, null Who scheduled the end-of-period cancellation: payer (the customer), api, manager (your dashboard), admin (Payviox support) or system. null when no cancellation is scheduled, or when it was scheduled from your Stripe dashboard. Only the same side can resume it: you (api, manager, null), the customer (payer) or Payviox (admin, system).
payer, api, manager, admin, system, null Set as soon as a cancellation is requested or scheduled: requested_by_merchant, requested_by_customer, initial_payment_refunded, admin (canceled by Payviox support), setup_failed:<code>, or a Stripe reason such as payment_failed, cancellation_requested, provider or provider_deleted. Treat unknown values as informational.
Customer self-service page (view, cancel at period end, undo). Share it with your customer, e.g. in your confirmation email.