curl --request POST \
--url https://api.returnshelper.com/uat/user/api/Resend/createResend \
--header 'Content-Type: application/json' \
--header 'x-rr-apikey: <api-key>' \
--header 'x-rr-apitoken: <api-key>' \
--data '
{
"returnInventoryIdList": [
123
],
"resendShipment": {
"warehouseId": 123,
"shipmentCountryCode": "<string>",
"shipmentName": "<string>",
"shipmentPhone": "<string>",
"shipmentStreet1": "<string>",
"shipmentStreet2": "<string>",
"shipmentState": "<string>",
"shipmentCity": "<string>",
"shipmentPostalCode": "<string>",
"shipmentServiceType": "<string>",
"shipmentFax": "<string>",
"shipmentEmail": "<string>",
"shipmentStreet3": "<string>"
},
"description": "<string>",
"remarks": "<string>",
"resendNumber": "INV-10042"
}
'import requests
url = "https://api.returnshelper.com/uat/user/api/Resend/createResend"
payload = {
"returnInventoryIdList": [123],
"resendShipment": {
"warehouseId": 123,
"shipmentCountryCode": "<string>",
"shipmentName": "<string>",
"shipmentPhone": "<string>",
"shipmentStreet1": "<string>",
"shipmentStreet2": "<string>",
"shipmentState": "<string>",
"shipmentCity": "<string>",
"shipmentPostalCode": "<string>",
"shipmentServiceType": "<string>",
"shipmentFax": "<string>",
"shipmentEmail": "<string>",
"shipmentStreet3": "<string>"
},
"description": "<string>",
"remarks": "<string>",
"resendNumber": "INV-10042"
}
headers = {
"x-rr-apikey": "<api-key>",
"x-rr-apitoken": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-rr-apikey': '<api-key>',
'x-rr-apitoken': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
returnInventoryIdList: [123],
resendShipment: {
warehouseId: 123,
shipmentCountryCode: '<string>',
shipmentName: '<string>',
shipmentPhone: '<string>',
shipmentStreet1: '<string>',
shipmentStreet2: '<string>',
shipmentState: '<string>',
shipmentCity: '<string>',
shipmentPostalCode: '<string>',
shipmentServiceType: '<string>',
shipmentFax: '<string>',
shipmentEmail: '<string>',
shipmentStreet3: '<string>'
},
description: '<string>',
remarks: '<string>',
resendNumber: 'INV-10042'
})
};
fetch('https://api.returnshelper.com/uat/user/api/Resend/createResend', 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.returnshelper.com/uat/user/api/Resend/createResend",
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([
'returnInventoryIdList' => [
123
],
'resendShipment' => [
'warehouseId' => 123,
'shipmentCountryCode' => '<string>',
'shipmentName' => '<string>',
'shipmentPhone' => '<string>',
'shipmentStreet1' => '<string>',
'shipmentStreet2' => '<string>',
'shipmentState' => '<string>',
'shipmentCity' => '<string>',
'shipmentPostalCode' => '<string>',
'shipmentServiceType' => '<string>',
'shipmentFax' => '<string>',
'shipmentEmail' => '<string>',
'shipmentStreet3' => '<string>'
],
'description' => '<string>',
'remarks' => '<string>',
'resendNumber' => 'INV-10042'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-rr-apikey: <api-key>",
"x-rr-apitoken: <api-key>"
],
]);
$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.returnshelper.com/uat/user/api/Resend/createResend"
payload := strings.NewReader("{\n \"returnInventoryIdList\": [\n 123\n ],\n \"resendShipment\": {\n \"warehouseId\": 123,\n \"shipmentCountryCode\": \"<string>\",\n \"shipmentName\": \"<string>\",\n \"shipmentPhone\": \"<string>\",\n \"shipmentStreet1\": \"<string>\",\n \"shipmentStreet2\": \"<string>\",\n \"shipmentState\": \"<string>\",\n \"shipmentCity\": \"<string>\",\n \"shipmentPostalCode\": \"<string>\",\n \"shipmentServiceType\": \"<string>\",\n \"shipmentFax\": \"<string>\",\n \"shipmentEmail\": \"<string>\",\n \"shipmentStreet3\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"remarks\": \"<string>\",\n \"resendNumber\": \"INV-10042\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-rr-apikey", "<api-key>")
req.Header.Add("x-rr-apitoken", "<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.returnshelper.com/uat/user/api/Resend/createResend")
.header("x-rr-apikey", "<api-key>")
.header("x-rr-apitoken", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"returnInventoryIdList\": [\n 123\n ],\n \"resendShipment\": {\n \"warehouseId\": 123,\n \"shipmentCountryCode\": \"<string>\",\n \"shipmentName\": \"<string>\",\n \"shipmentPhone\": \"<string>\",\n \"shipmentStreet1\": \"<string>\",\n \"shipmentStreet2\": \"<string>\",\n \"shipmentState\": \"<string>\",\n \"shipmentCity\": \"<string>\",\n \"shipmentPostalCode\": \"<string>\",\n \"shipmentServiceType\": \"<string>\",\n \"shipmentFax\": \"<string>\",\n \"shipmentEmail\": \"<string>\",\n \"shipmentStreet3\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"remarks\": \"<string>\",\n \"resendNumber\": \"INV-10042\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.returnshelper.com/uat/user/api/Resend/createResend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-rr-apikey"] = '<api-key>'
request["x-rr-apitoken"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"returnInventoryIdList\": [\n 123\n ],\n \"resendShipment\": {\n \"warehouseId\": 123,\n \"shipmentCountryCode\": \"<string>\",\n \"shipmentName\": \"<string>\",\n \"shipmentPhone\": \"<string>\",\n \"shipmentStreet1\": \"<string>\",\n \"shipmentStreet2\": \"<string>\",\n \"shipmentState\": \"<string>\",\n \"shipmentCity\": \"<string>\",\n \"shipmentPostalCode\": \"<string>\",\n \"shipmentServiceType\": \"<string>\",\n \"shipmentFax\": \"<string>\",\n \"shipmentEmail\": \"<string>\",\n \"shipmentStreet3\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"remarks\": \"<string>\",\n \"resendNumber\": \"INV-10042\"\n}"
response = http.request(request)
puts response.read_body{
"resendId": 123,
"resendNumber": "RSD221003-0000001"
}{
"correlationId": "<string>",
"meta": {
"status": 123,
"data": {},
"errorCode": "<string>",
"error": {}
}
}Create resend order
curl --request POST \
--url https://api.returnshelper.com/uat/user/api/Resend/createResend \
--header 'Content-Type: application/json' \
--header 'x-rr-apikey: <api-key>' \
--header 'x-rr-apitoken: <api-key>' \
--data '
{
"returnInventoryIdList": [
123
],
"resendShipment": {
"warehouseId": 123,
"shipmentCountryCode": "<string>",
"shipmentName": "<string>",
"shipmentPhone": "<string>",
"shipmentStreet1": "<string>",
"shipmentStreet2": "<string>",
"shipmentState": "<string>",
"shipmentCity": "<string>",
"shipmentPostalCode": "<string>",
"shipmentServiceType": "<string>",
"shipmentFax": "<string>",
"shipmentEmail": "<string>",
"shipmentStreet3": "<string>"
},
"description": "<string>",
"remarks": "<string>",
"resendNumber": "INV-10042"
}
'import requests
url = "https://api.returnshelper.com/uat/user/api/Resend/createResend"
payload = {
"returnInventoryIdList": [123],
"resendShipment": {
"warehouseId": 123,
"shipmentCountryCode": "<string>",
"shipmentName": "<string>",
"shipmentPhone": "<string>",
"shipmentStreet1": "<string>",
"shipmentStreet2": "<string>",
"shipmentState": "<string>",
"shipmentCity": "<string>",
"shipmentPostalCode": "<string>",
"shipmentServiceType": "<string>",
"shipmentFax": "<string>",
"shipmentEmail": "<string>",
"shipmentStreet3": "<string>"
},
"description": "<string>",
"remarks": "<string>",
"resendNumber": "INV-10042"
}
headers = {
"x-rr-apikey": "<api-key>",
"x-rr-apitoken": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {
'x-rr-apikey': '<api-key>',
'x-rr-apitoken': '<api-key>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
returnInventoryIdList: [123],
resendShipment: {
warehouseId: 123,
shipmentCountryCode: '<string>',
shipmentName: '<string>',
shipmentPhone: '<string>',
shipmentStreet1: '<string>',
shipmentStreet2: '<string>',
shipmentState: '<string>',
shipmentCity: '<string>',
shipmentPostalCode: '<string>',
shipmentServiceType: '<string>',
shipmentFax: '<string>',
shipmentEmail: '<string>',
shipmentStreet3: '<string>'
},
description: '<string>',
remarks: '<string>',
resendNumber: 'INV-10042'
})
};
fetch('https://api.returnshelper.com/uat/user/api/Resend/createResend', 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.returnshelper.com/uat/user/api/Resend/createResend",
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([
'returnInventoryIdList' => [
123
],
'resendShipment' => [
'warehouseId' => 123,
'shipmentCountryCode' => '<string>',
'shipmentName' => '<string>',
'shipmentPhone' => '<string>',
'shipmentStreet1' => '<string>',
'shipmentStreet2' => '<string>',
'shipmentState' => '<string>',
'shipmentCity' => '<string>',
'shipmentPostalCode' => '<string>',
'shipmentServiceType' => '<string>',
'shipmentFax' => '<string>',
'shipmentEmail' => '<string>',
'shipmentStreet3' => '<string>'
],
'description' => '<string>',
'remarks' => '<string>',
'resendNumber' => 'INV-10042'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"x-rr-apikey: <api-key>",
"x-rr-apitoken: <api-key>"
],
]);
$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.returnshelper.com/uat/user/api/Resend/createResend"
payload := strings.NewReader("{\n \"returnInventoryIdList\": [\n 123\n ],\n \"resendShipment\": {\n \"warehouseId\": 123,\n \"shipmentCountryCode\": \"<string>\",\n \"shipmentName\": \"<string>\",\n \"shipmentPhone\": \"<string>\",\n \"shipmentStreet1\": \"<string>\",\n \"shipmentStreet2\": \"<string>\",\n \"shipmentState\": \"<string>\",\n \"shipmentCity\": \"<string>\",\n \"shipmentPostalCode\": \"<string>\",\n \"shipmentServiceType\": \"<string>\",\n \"shipmentFax\": \"<string>\",\n \"shipmentEmail\": \"<string>\",\n \"shipmentStreet3\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"remarks\": \"<string>\",\n \"resendNumber\": \"INV-10042\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("x-rr-apikey", "<api-key>")
req.Header.Add("x-rr-apitoken", "<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.returnshelper.com/uat/user/api/Resend/createResend")
.header("x-rr-apikey", "<api-key>")
.header("x-rr-apitoken", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"returnInventoryIdList\": [\n 123\n ],\n \"resendShipment\": {\n \"warehouseId\": 123,\n \"shipmentCountryCode\": \"<string>\",\n \"shipmentName\": \"<string>\",\n \"shipmentPhone\": \"<string>\",\n \"shipmentStreet1\": \"<string>\",\n \"shipmentStreet2\": \"<string>\",\n \"shipmentState\": \"<string>\",\n \"shipmentCity\": \"<string>\",\n \"shipmentPostalCode\": \"<string>\",\n \"shipmentServiceType\": \"<string>\",\n \"shipmentFax\": \"<string>\",\n \"shipmentEmail\": \"<string>\",\n \"shipmentStreet3\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"remarks\": \"<string>\",\n \"resendNumber\": \"INV-10042\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.returnshelper.com/uat/user/api/Resend/createResend")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["x-rr-apikey"] = '<api-key>'
request["x-rr-apitoken"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"returnInventoryIdList\": [\n 123\n ],\n \"resendShipment\": {\n \"warehouseId\": 123,\n \"shipmentCountryCode\": \"<string>\",\n \"shipmentName\": \"<string>\",\n \"shipmentPhone\": \"<string>\",\n \"shipmentStreet1\": \"<string>\",\n \"shipmentStreet2\": \"<string>\",\n \"shipmentState\": \"<string>\",\n \"shipmentCity\": \"<string>\",\n \"shipmentPostalCode\": \"<string>\",\n \"shipmentServiceType\": \"<string>\",\n \"shipmentFax\": \"<string>\",\n \"shipmentEmail\": \"<string>\",\n \"shipmentStreet3\": \"<string>\"\n },\n \"description\": \"<string>\",\n \"remarks\": \"<string>\",\n \"resendNumber\": \"INV-10042\"\n}"
response = http.request(request)
puts response.read_body{
"resendId": 123,
"resendNumber": "RSD221003-0000001"
}{
"correlationId": "<string>",
"meta": {
"status": 123,
"data": {},
"errorCode": "<string>",
"error": {}
}
}Prerequisites
- The target inventory items exist in your account. The
returnInventoryIdvalues come from thenewInventoryCreatedwebhook event — cache them on your side as parcels are logged. - All inventories in a single resend must be in the same warehouse.
- Each inventory’s current
handlingStatusCodemust be eligible to advance torsd(resend) per the handling state machine — typically items inohd(on-hold) status. - None of the items’ line items can have pending VAS requests.
- Each inventory must be physically in stock (not in-transit, not under another active workflow).
- Have your destination address ready.
Required fields
resendShipment— full shipment payload (destination address, contact, dimensions, weight, service type). Country codes are ISO3.warehouseIdis required and must match the warehouse of the items inreturnInventoryIdList(all items in a single resend share one warehouse). Omitting it fails validation.shipmentServiceTypeinside the payload is a shipment service type (not a return service type) — fetch valid codes from Get available shipment service types for warehouse. Passing a return-service-type code here will fail validation.
returnInventoryIdList— non-emptyList<long>. Maximum size isResendConfig.groupResendMaxRmaCount(typically a single-digit cap; check via support if you need to bundle many items).
Optional fields
description— free-text description for the resend order (max 255 characters). Persisted against the order and returned by Get resend order details.remarks— merchant remarks/notes for the resend order (max 5000 characters). Persisted against the order and returned by Get resend order details.
resendNumber— your own reference for the resend: 1–50 characters, letters, digits,-and_only. It must be unique within your account: a value already used on another resend in your account, including a cancelled one, fails validation. Omit it and Return Helper generates one. The value is returned in the response and in the resend status update webhook.
resendNumber will become read-only. Return Helper will generate resendNumber for every resend, and your own reference will go in a new optional sellerReferenceNumber field. Unlike resendNumber, sellerReferenceNumber is not unique — Return Helper does not reject a repeated value. To avoid duplicate resends when retrying, send an x-returnhelper-idempotency-key header. If you set resendNumber today, see the migration plan.Side effects
- Each inventory’s
handlingCodeis set torsdand the matching status is applied. - The shipment is dispatched by the warehouse once the label is ready.
Label generation: auto vs manual service types
Whether a resend generates its shipping label automatically depends on the shipment service type you pass inresendShipment.shipmentServiceType. Each shipment service type carries an isEnableAutoCreateLabel flag — fetch it from Get available shipment service types for warehouse and read isEnableAutoCreateLabel for the code you intend to use.
Auto-label (isEnableAutoCreateLabel: true)
The label is generated asynchronously after creation. The resend status flow is:
queued → label-success → completed (or queued → failed if label generation fails)
The resend can be cancelled via Cancel resend order only while it is in label-success, and only before the cut-off. It cannot be cancelled while queued, because the label is still being generated.
Manual-label (isEnableAutoCreateLabel: false)
No label is auto-generated; the warehouse processes the resend. The resend status flow is:
pending → in-progress → completed
The resend can be cancelled via Cancel resend order while it is in pending, and only before the cut-off.
Cancellation cut-off
Every resend has a cancellation cut-off of 08:00 UTC on working days, set when the resend is created. You can cancel up to that cut-off, provided the resend is in its cancellable status (label-success for auto-label, pending for manual-label). Once the cut-off passes, the resend can no longer be cancelled through the API.
Idempotency
Thex-returnhelper-idempotency-key header is optional. A call without it runs normally, with no protection against duplicates. See Idempotency.
Related
- Get resend order details — only when a webhook event references a resend you haven’t cached.
- Cancel resend order — abort before the warehouse dispatches.
- Get all resend statuses — code-to-label mappings.
- Webhooks — resend-status-update event deliver lifecycle changes to your endpoint.
Authorizations
Your API key
Your API token — keep this private
Body
List of return inventory IDs for resend
Destination shipment address for the resend
Show child attributes
Show child attributes
Optional free-text description for the resend order. Stored against the order and returned by Get resend order details.
255Optional merchant remarks/notes for the resend order. Stored against the order and returned by Get resend order details.
5000Optional. Your own reference for this resend: 1-50 characters, letters, digits, - and _ only. A value already used on another resend in your account, including a cancelled one, fails validation. When omitted, Return Helper generates one. Planned change: this field will become read-only and generated by Return Helper; use sellerReferenceNumber instead once it is available. See the announcement.
50^[A-Za-z0-9_-]{1,50}$"INV-10042"