cURL
curl --request POST \
--url https://api.juo.io/customer/v1/schedules/adjustments \
--header 'Content-Type: application/json' \
--header 'X-Delegated-Token: <api-key>' \
--header 'X-Tenant-ID: <x-tenant-id>' \
--data '
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 1
}
},
"action": {
"type": "SKIP_ORDER",
"input": {
"reason": "<string>"
}
}
}
'import requests
url = "https://api.juo.io/customer/v1/schedules/adjustments"
payload = {
"matcher": {
"type": "CYCLE",
"input": { "cycle": 1 }
},
"action": {
"type": "SKIP_ORDER",
"input": { "reason": "<string>" }
}
}
headers = {
"X-Tenant-ID": "<x-tenant-id>",
"X-Delegated-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Tenant-ID': '<x-tenant-id>',
'X-Delegated-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
matcher: {type: 'CYCLE', input: {cycle: 1}},
action: {type: 'SKIP_ORDER', input: {reason: '<string>'}}
})
};
fetch('https://api.juo.io/customer/v1/schedules/adjustments', 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.juo.io/customer/v1/schedules/adjustments",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'matcher' => [
'type' => 'CYCLE',
'input' => [
'cycle' => 1
]
],
'action' => [
'type' => 'SKIP_ORDER',
'input' => [
'reason' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Delegated-Token: <api-key>",
"X-Tenant-ID: <x-tenant-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.juo.io/customer/v1/schedules/adjustments"
payload := strings.NewReader("{\n \"matcher\": {\n \"type\": \"CYCLE\",\n \"input\": {\n \"cycle\": 1\n }\n },\n \"action\": {\n \"type\": \"SKIP_ORDER\",\n \"input\": {\n \"reason\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Tenant-ID", "<x-tenant-id>")
req.Header.Add("X-Delegated-Token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.juo.io/customer/v1/schedules/adjustments")
.header("X-Tenant-ID", "<x-tenant-id>")
.header("X-Delegated-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"matcher\": {\n \"type\": \"CYCLE\",\n \"input\": {\n \"cycle\": 1\n }\n },\n \"action\": {\n \"type\": \"SKIP_ORDER\",\n \"input\": {\n \"reason\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.juo.io/customer/v1/schedules/adjustments")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Tenant-ID"] = '<x-tenant-id>'
request["X-Delegated-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"matcher\": {\n \"type\": \"CYCLE\",\n \"input\": {\n \"cycle\": 1\n }\n },\n \"action\": {\n \"type\": \"SKIP_ORDER\",\n \"input\": {\n \"reason\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"resource": "schedule_adjustment",
"customer": "<string>",
"matcher": {
"type": "<string>",
"input": "<unknown>"
},
"action": {
"type": "<string>",
"input": "<unknown>"
},
"actor": {
"id": "<string>"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}Schedule adjustments
Create a schedule adjustment
Used to create a schedule adjustment.
POST
/
schedules
/
adjustments
cURL
curl --request POST \
--url https://api.juo.io/customer/v1/schedules/adjustments \
--header 'Content-Type: application/json' \
--header 'X-Delegated-Token: <api-key>' \
--header 'X-Tenant-ID: <x-tenant-id>' \
--data '
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 1
}
},
"action": {
"type": "SKIP_ORDER",
"input": {
"reason": "<string>"
}
}
}
'import requests
url = "https://api.juo.io/customer/v1/schedules/adjustments"
payload = {
"matcher": {
"type": "CYCLE",
"input": { "cycle": 1 }
},
"action": {
"type": "SKIP_ORDER",
"input": { "reason": "<string>" }
}
}
headers = {
"X-Tenant-ID": "<x-tenant-id>",
"X-Delegated-Token": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'X-Tenant-ID': '<x-tenant-id>',
'X-Delegated-Token': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
matcher: {type: 'CYCLE', input: {cycle: 1}},
action: {type: 'SKIP_ORDER', input: {reason: '<string>'}}
})
};
fetch('https://api.juo.io/customer/v1/schedules/adjustments', 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.juo.io/customer/v1/schedules/adjustments",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'matcher' => [
'type' => 'CYCLE',
'input' => [
'cycle' => 1
]
],
'action' => [
'type' => 'SKIP_ORDER',
'input' => [
'reason' => '<string>'
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-Delegated-Token: <api-key>",
"X-Tenant-ID: <x-tenant-id>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.juo.io/customer/v1/schedules/adjustments"
payload := strings.NewReader("{\n \"matcher\": {\n \"type\": \"CYCLE\",\n \"input\": {\n \"cycle\": 1\n }\n },\n \"action\": {\n \"type\": \"SKIP_ORDER\",\n \"input\": {\n \"reason\": \"<string>\"\n }\n }\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-Tenant-ID", "<x-tenant-id>")
req.Header.Add("X-Delegated-Token", "<api-key>")
req.Header.Add("Content-Type", "application/json")
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.juo.io/customer/v1/schedules/adjustments")
.header("X-Tenant-ID", "<x-tenant-id>")
.header("X-Delegated-Token", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"matcher\": {\n \"type\": \"CYCLE\",\n \"input\": {\n \"cycle\": 1\n }\n },\n \"action\": {\n \"type\": \"SKIP_ORDER\",\n \"input\": {\n \"reason\": \"<string>\"\n }\n }\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.juo.io/customer/v1/schedules/adjustments")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-Tenant-ID"] = '<x-tenant-id>'
request["X-Delegated-Token"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"matcher\": {\n \"type\": \"CYCLE\",\n \"input\": {\n \"cycle\": 1\n }\n },\n \"action\": {\n \"type\": \"SKIP_ORDER\",\n \"input\": {\n \"reason\": \"<string>\"\n }\n }\n}"
response = http.request(request)
puts response.read_body{
"id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"resource": "schedule_adjustment",
"customer": "<string>",
"matcher": {
"type": "<string>",
"input": "<unknown>"
},
"action": {
"type": "<string>",
"input": "<unknown>"
},
"actor": {
"id": "<string>"
},
"createdAt": "2023-11-07T05:31:56Z",
"updatedAt": "2023-11-07T05:31:56Z"
}Examples
- Skip order
- Change date
- Skip by date
- Update shipping
- Update payment method
- Update products
- Apply discount (code)
Skip order for the third cycle with a reason.
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 3
}
},
"action": {
"type": "SKIP_ORDER",
"input": {
"reason": "Going on vacation"
}
}
}
Reschedule order for the second cycle to a new date.
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 2
}
},
"action": {
"type": "CHANGE_DATE",
"input": {
"newDate": "2025-02-15T00:00:00Z"
}
}
}
CHANGE_DATE only supports the CYCLE matcher. The new date must be within one billing cycle of the original date and cannot be in the past.Skip all orders scheduled for a specific date.
{
"matcher": {
"type": "DATE",
"input": {
"date": "2025-01-01T00:00:00Z"
}
},
"action": {
"type": "SKIP_ORDER",
"input": {
"reason": "Holiday break"
}
}
}
Update shipping address for a specific cycle.
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 3
}
},
"action": {
"type": "UPDATE_SHIPPING",
"input": {
"address": {
"firstName": "John",
"lastName": "Doe",
"address1": "123 Main St",
"city": "New York",
"countryCode": "US",
"zip": "10001"
}
}
}
}
Address must include at least
address1 and countryCode.Update payment method for a specific cycle.
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 4
}
},
"action": {
"type": "UPDATE_PAYMENT_METHOD",
"input": {
"paymentMethodId": "pm_abc123"
}
}
}
Modify product lines for a specific cycle.
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 2
}
},
"action": {
"type": "UPDATE_PRODUCTS",
"input": {
"lines": [
{
"lineId": "line_abc123",
"quantity": 2
},
{
"lineId": "line_def456",
"variantId": "variant_xyz789"
},
{
"lineId": "line_ghi789",
"customAttributes": [
{ "key": "gift_message", "value": "Happy birthday!" }
]
}
]
}
}
}
Each line requires
lineId. Optional fields: variantId (swap variant), quantity (min 1), interval (override billing interval), nextBillingDate, customAttributes (merged onto the item by key; reserved/internal keys are rejected with a 400).Apply a Shopify discount code to a specific cycle.
{
"matcher": {
"type": "CYCLE",
"input": {
"cycle": 2
}
},
"action": {
"type": "APPLY_DISCOUNT",
"input": {
"discountSource": "code",
"discountCode": "SAVE20"
}
}
}
APPLY_DISCOUNT only supports the CYCLE matcher. Discount must exist in Shopify and be valid for subscriptions.Authorizations
DelegatedTokenAccessToken
Headers
Unique identifier of the tenant in the system (usually a store identifier)
Body
application/json
Response
201 - application/json
Default Response
The adjustment identifier
Available options:
schedule_adjustment The customer identifier
Minimum string length:
1Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Show child attributes
Creation date of the adjustment
Last update date of the adjustment
⌘I