curl --request GET \
--url https://api.cope.com/v1/commerce/subscriptions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cope.com/v1/commerce/subscriptions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cope.com/v1/commerce/subscriptions', 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.cope.com/v1/commerce/subscriptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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.cope.com/v1/commerce/subscriptions"
req, _ := http.NewRequest("GET", 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.get("https://api.cope.com/v1/commerce/subscriptions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cope.com/v1/commerce/subscriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyList subscriptions changed in a time window
Lists your subscriptions in the order their updated_at moved, oldest change first: the feed a
reconciliation reads to learn what changed since it last looked. Every subscription whose updated_at
is in the window [updated_since, updated_until) is returned exactly once, however many share one
updated_at value.
Only changes at least 120 seconds old are served. A change is stamped
when it is written and becomes readable when it commits, so a window reaching up to now could pass a
change that has not committed yet. updated_until defaults to now minus 120
seconds, may not be later, and is returned in the response.
Paging. When has_more is true, request the next page with starting_after set to next_cursor.
The cursor is opaque and carries the window and the filters of the first request, so the next page
needs nothing else; a parameter repeated beside it must have the same value. Keep limit on every page.
A subscription that changes while you page is not lost: its new updated_at is after the window, so the
next window returns it.
A nightly sync. Store the updated_until of the last walk you finished, and start the next one with
updated_since set to it. The windows meet without overlapping, so nothing is missed and nothing is
returned twice.
Reconcile without status. status filters on the status a subscription has now, so a window
filtered by it does not report a subscription that left that status (an active window does not show the
one that was cancelled). Read the window unfiltered and filter on your side.
Requires the subscriptions permission at read. An API key holds a permission at the lower of its own level (read for a read-only key) and its holder’s role; a key without it is refused with 403.
curl --request GET \
--url https://api.cope.com/v1/commerce/subscriptions \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.cope.com/v1/commerce/subscriptions"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.cope.com/v1/commerce/subscriptions', 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.cope.com/v1/commerce/subscriptions",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
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.cope.com/v1/commerce/subscriptions"
req, _ := http.NewRequest("GET", 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.get("https://api.cope.com/v1/commerce/subscriptions")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.cope.com/v1/commerce/subscriptions")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_bodyAuthorizations
Bearer credential for the public API: a live COPE API key (ck_live_*; keys issued earlier as cope_sk_live_* keep working). Dashboard sign-in tokens are not accepted.
Query Parameters
Inclusive lower bound on updated_at, an RFC 3339 date-time with an offset or Z. Without it the window starts at the first subscription.
"2026-10-08T00:00:00.000Z"
Exclusive upper bound on updated_at, an RFC 3339 date-time with an offset or Z. Defaults to now minus 120 seconds; a later value is refused with 422.
"2026-10-09T00:00:00.000Z"
The next_cursor of the previous page. Opaque: it carries that request's window and filters, and a cursor this endpoint did not return is refused with 422.
Only subscriptions in this status now. A subscription that left this status in the window is not returned, so reconcile from the unfiltered window.
pending, trial, active, overdue, paused, canceling, cancelled Only subscriptions sold on this product, by its prod_ id. An id that is not one of your products is refused with 422 validation_failed.
^prod_[A-Za-z0-9]{8,32}$How many subscriptions a page holds.
1 <= x <= 100Response
Successful response
Show child attributes
Show child attributes
Whether another page follows this one.
Pass as starting_after for the next page. null when has_more is false.
The exclusive upper bound this walk serves, in UTC to the millisecond: the next window's updated_since.
Was this page helpful?