curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"quantity": 2,
"sell_rate": 123,
"unit_price": 123,
"list_price": 123,
"notes": "<string>",
"override": true,
"override_reason": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap"
payload = {
"product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"quantity": 2,
"sell_rate": 123,
"unit_price": 123,
"list_price": 123,
"notes": "<string>",
"override": True,
"override_reason": "<string>"
}
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({
product_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
variant_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
quantity: 2,
sell_rate: 123,
unit_price: 123,
list_price: 123,
notes: '<string>',
override: true,
override_reason: '<string>'
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap', 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}/items/{item_id}/swap",
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([
'product_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'variant_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'quantity' => 2,
'sell_rate' => 123,
'unit_price' => 123,
'list_price' => 123,
'notes' => '<string>',
'override' => true,
'override_reason' => '<string>'
]),
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}/items/{item_id}/swap"
payload := strings.NewReader("{\n \"product_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"variant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"quantity\": 2,\n \"sell_rate\": 123,\n \"unit_price\": 123,\n \"list_price\": 123,\n \"notes\": \"<string>\",\n \"override\": true,\n \"override_reason\": \"<string>\"\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}/items/{item_id}/swap")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"product_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"variant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"quantity\": 2,\n \"sell_rate\": 123,\n \"unit_price\": 123,\n \"list_price\": 123,\n \"notes\": \"<string>\",\n \"override\": true,\n \"override_reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap")
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 \"product_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"variant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"quantity\": 2,\n \"sell_rate\": 123,\n \"unit_price\": 123,\n \"list_price\": 123,\n \"notes\": \"<string>\",\n \"override\": true,\n \"override_reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"old_order_item_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_order_item_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"quantity": 123,
"sort_order": 123,
"channel_lineage_inherited": true,
"requires_overpayment_review": true,
"overpayment_amount": 123
}{
"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"
}{
"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"
}Swap a line item's product
Replaces the product on an existing order line while preserving the line’s position, quantity, and history. Any inventory already reserved or shipped against the original product is reconciled as part of the swap.
curl --request POST \
--url https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"quantity": 2,
"sell_rate": 123,
"unit_price": 123,
"list_price": 123,
"notes": "<string>",
"override": true,
"override_reason": "<string>"
}
'import requests
url = "https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap"
payload = {
"product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"variant_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"quantity": 2,
"sell_rate": 123,
"unit_price": 123,
"list_price": 123,
"notes": "<string>",
"override": True,
"override_reason": "<string>"
}
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({
product_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
variant_id: '3c90c3cc-0d44-4b50-8888-8dd25736052a',
quantity: 2,
sell_rate: 123,
unit_price: 123,
list_price: 123,
notes: '<string>',
override: true,
override_reason: '<string>'
})
};
fetch('https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap', 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}/items/{item_id}/swap",
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([
'product_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'variant_id' => '3c90c3cc-0d44-4b50-8888-8dd25736052a',
'quantity' => 2,
'sell_rate' => 123,
'unit_price' => 123,
'list_price' => 123,
'notes' => '<string>',
'override' => true,
'override_reason' => '<string>'
]),
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}/items/{item_id}/swap"
payload := strings.NewReader("{\n \"product_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"variant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"quantity\": 2,\n \"sell_rate\": 123,\n \"unit_price\": 123,\n \"list_price\": 123,\n \"notes\": \"<string>\",\n \"override\": true,\n \"override_reason\": \"<string>\"\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}/items/{item_id}/swap")
.header("Authorization", "Bearer <token>")
.header("Content-Type", "application/json")
.body("{\n \"product_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"variant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"quantity\": 2,\n \"sell_rate\": 123,\n \"unit_price\": 123,\n \"list_price\": 123,\n \"notes\": \"<string>\",\n \"override\": true,\n \"override_reason\": \"<string>\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.arcuserp.com/v1/orders/{id}/items/{item_id}/swap")
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 \"product_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"variant_id\": \"3c90c3cc-0d44-4b50-8888-8dd25736052a\",\n \"quantity\": 2,\n \"sell_rate\": 123,\n \"unit_price\": 123,\n \"list_price\": 123,\n \"notes\": \"<string>\",\n \"override\": true,\n \"override_reason\": \"<string>\"\n}"
response = http.request(request)
puts response.read_body{
"old_order_item_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_order_item_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"new_product_id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
"quantity": 123,
"sort_order": 123,
"channel_lineage_inherited": true,
"requires_overpayment_review": true,
"overpayment_amount": 123
}{
"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"
}{
"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.
Body
Replacement product.
Replacement variant (required if the product has variants).
Quantity for the replacement line. Defaults to the original line's quantity.
x >= 1Override unit price for the replacement (canonical Arcus field).
Alias of sell_rate (Stripe/Shopify convention).
Set true (with orders.revision_override) to swap a line on a paid/billed order. Without it a paid/billed order returns 422 edit_not_allowed (suggested_action revise_order).
Response
Line swapped. Returns old + new order_item ids, quantity, sort_order, and channel_lineage_inherited.
Was this page helpful?

