curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/change-ship-to \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"new_address_id": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"also_change_billing": false,
"confirm_void_labels": true,
"confirm_repurchase_labels": true,
"repurchase_strategy": "auto_cheapest",
"reason": "Customer corrected ZIP; was 90210, should be 92010."
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/change-ship-to"
payload = {
"new_address_id": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"also_change_billing": False,
"confirm_void_labels": True,
"confirm_repurchase_labels": True,
"repurchase_strategy": "auto_cheapest",
"reason": "Customer corrected ZIP; was 90210, should be 92010."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
new_address_id: 'aa11bb22-cc33-dd44-ee55-ff6677889900',
also_change_billing: false,
confirm_void_labels: true,
confirm_repurchase_labels: true,
repurchase_strategy: 'auto_cheapest',
reason: 'Customer corrected ZIP; was 90210, should be 92010.'
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/change-ship-to', 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.arcuserp.com/v1/orders/{id}/change-ship-to",
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([
'new_address_id' => 'aa11bb22-cc33-dd44-ee55-ff6677889900',
'also_change_billing' => false,
'confirm_void_labels' => true,
'confirm_repurchase_labels' => true,
'repurchase_strategy' => 'auto_cheapest',
'reason' => 'Customer corrected ZIP; was 90210, should be 92010.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.arcuserp.com/v1/orders/{id}/change-ship-to"
payload := strings.NewReader("{\n \"new_address_id\": \"aa11bb22-cc33-dd44-ee55-ff6677889900\",\n \"also_change_billing\": false,\n \"confirm_void_labels\": true,\n \"confirm_repurchase_labels\": true,\n \"repurchase_strategy\": \"auto_cheapest\",\n \"reason\": \"Customer corrected ZIP; was 90210, should be 92010.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.arcuserp.com/v1/orders/{id}/change-ship-to")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"new_address_id\": \"aa11bb22-cc33-dd44-ee55-ff6677889900\",\n \"also_change_billing\": false,\n \"confirm_void_labels\": true,\n \"confirm_repurchase_labels\": true,\n \"repurchase_strategy\": \"auto_cheapest\",\n \"reason\": \"Customer corrected ZIP; was 90210, should be 92010.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/change-ship-to")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"new_address_id\": \"aa11bb22-cc33-dd44-ee55-ff6677889900\",\n \"also_change_billing\": false,\n \"confirm_void_labels\": true,\n \"confirm_repurchase_labels\": true,\n \"repurchase_strategy\": \"auto_cheapest\",\n \"reason\": \"Customer corrected ZIP; was 90210, should be 92010.\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"order_number": "<string>",
"old_shipping_address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_shipping_address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_shipping_address": {},
"voided_labels": [
{}
],
"new_labels": [
{}
],
"rate_deltas": [
{}
],
"charge_results": [
{}
],
"purchase_failures": [
{}
],
"repurchase_strategy": "<string>"
}
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Change an order's ship-to address
Changes an order’s shipping address after labels have already been purchased by voiding every active label, updating the address, recalculating tax for the new destination, and optionally repurchasing new labels and billing or refunding the rate difference. Requires both orders:write and fulfillment:write scopes, confirming the label void explicitly and, unless repurchase is deferred, confirming the repurchase as well; if any label cannot be voided, no changes are made and the response lists which labels did and did not void.
curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/change-ship-to \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"new_address_id": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"also_change_billing": false,
"confirm_void_labels": true,
"confirm_repurchase_labels": true,
"repurchase_strategy": "auto_cheapest",
"reason": "Customer corrected ZIP; was 90210, should be 92010."
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/change-ship-to"
payload = {
"new_address_id": "aa11bb22-cc33-dd44-ee55-ff6677889900",
"also_change_billing": False,
"confirm_void_labels": True,
"confirm_repurchase_labels": True,
"repurchase_strategy": "auto_cheapest",
"reason": "Customer corrected ZIP; was 90210, should be 92010."
}
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
new_address_id: 'aa11bb22-cc33-dd44-ee55-ff6677889900',
also_change_billing: false,
confirm_void_labels: true,
confirm_repurchase_labels: true,
repurchase_strategy: 'auto_cheapest',
reason: 'Customer corrected ZIP; was 90210, should be 92010.'
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/change-ship-to', 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.arcuserp.com/v1/orders/{id}/change-ship-to",
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([
'new_address_id' => 'aa11bb22-cc33-dd44-ee55-ff6677889900',
'also_change_billing' => false,
'confirm_void_labels' => true,
'confirm_repurchase_labels' => true,
'repurchase_strategy' => 'auto_cheapest',
'reason' => 'Customer corrected ZIP; was 90210, should be 92010.'
]),
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>",
"Content-Type: application/json"
],
]);
$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.arcuserp.com/v1/orders/{id}/change-ship-to"
payload := strings.NewReader("{\n \"new_address_id\": \"aa11bb22-cc33-dd44-ee55-ff6677889900\",\n \"also_change_billing\": false,\n \"confirm_void_labels\": true,\n \"confirm_repurchase_labels\": true,\n \"repurchase_strategy\": \"auto_cheapest\",\n \"reason\": \"Customer corrected ZIP; was 90210, should be 92010.\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
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.arcuserp.com/v1/orders/{id}/change-ship-to")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"new_address_id\": \"aa11bb22-cc33-dd44-ee55-ff6677889900\",\n \"also_change_billing\": false,\n \"confirm_void_labels\": true,\n \"confirm_repurchase_labels\": true,\n \"repurchase_strategy\": \"auto_cheapest\",\n \"reason\": \"Customer corrected ZIP; was 90210, should be 92010.\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/change-ship-to")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"new_address_id\": \"aa11bb22-cc33-dd44-ee55-ff6677889900\",\n \"also_change_billing\": false,\n \"confirm_void_labels\": true,\n \"confirm_repurchase_labels\": true,\n \"repurchase_strategy\": \"auto_cheapest\",\n \"reason\": \"Customer corrected ZIP; was 90210, should be 92010.\"\n}"
response = http.request(request)
puts response.read_body{
"data": {
"order_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"order_number": "<string>",
"old_shipping_address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_shipping_address_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_shipping_address": {},
"voided_labels": [
{}
],
"new_labels": [
{}
],
"rate_deltas": [
{}
],
"charge_results": [
{}
],
"purchase_failures": [
{}
],
"repurchase_strategy": "<string>"
}
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}{
"error": "not_found",
"code": "not_found",
"type": "not_found",
"hint": "The requested order does not exist or does not belong to this entity.",
"param": "expand[0]",
"required": "accounts:read",
"request_id": "req_abc123"
}Authorizations
API key issued per entity via Settings > Developers > API Keys.
Each key carries scopes (e.g. orders:read, products:write).
Bearer token format: Authorization: Bearer ark_live_ent_Test keys use ark_test_ent_. Both are issued per entity
via Settings > Developers > API Keys.
Headers
Client-generated unique key for idempotent POST/PATCH/DELETE operations. Alias for the Idempotency parameter. Max 255 chars. On retry with the same key, the original response is returned without re-executing the operation. Keys expire after 24 hours.
255Path Parameters
UUID of the order to change ship-to for.
Body
REQUIRED. Two-key safety gate; must be true to authorize label void.
Existing account_addresses.id (mutually exclusive with new_address_payload).
Raw address payload; creates a new account_addresses row via the canonical addAddress helper.
Show child attributes
Show child attributes
Also copy the new address into billing_address_id.
REQUIRED unless repurchase_strategy=defer.
auto_cheapest = auto-buy cheapest new label per package; manual = return rates and let operator choose; defer = leave packages unlabeled for the warehouse.
auto_cheapest, manual, defer Optional Stripe payment_method to bill the rate delta.
Audit attribution; defaults to API key owner if omitted.
Operator note for the audit log.
Response
Ship-to changed successfully (may include partial purchase_failures with HTTP 200 when at least one new label posted).
Show child attributes
Show child attributes
Was this page helpful?

