curl --request POST \
--url https://www.closient.com/epcis/api/2.0/verification/returns \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"biz_location": "urn:epc:id:sgln:0614141.00888.0",
"gtin": "00614524740108",
"return_reference": "RMA-55102",
"serial": "ABC123XYZ"
}
'import requests
url = "https://www.closient.com/epcis/api/2.0/verification/returns"
payload = {
"biz_location": "urn:epc:id:sgln:0614141.00888.0",
"gtin": "00614524740108",
"return_reference": "RMA-55102",
"serial": "ABC123XYZ"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
biz_location: 'urn:epc:id:sgln:0614141.00888.0',
gtin: '00614524740108',
return_reference: 'RMA-55102',
serial: 'ABC123XYZ'
})
};
fetch('https://www.closient.com/epcis/api/2.0/verification/returns', 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://www.closient.com/epcis/api/2.0/verification/returns",
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([
'biz_location' => 'urn:epc:id:sgln:0614141.00888.0',
'gtin' => '00614524740108',
'return_reference' => 'RMA-55102',
'serial' => 'ABC123XYZ'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <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://www.closient.com/epcis/api/2.0/verification/returns"
payload := strings.NewReader("{\n \"biz_location\": \"urn:epc:id:sgln:0614141.00888.0\",\n \"gtin\": \"00614524740108\",\n \"return_reference\": \"RMA-55102\",\n \"serial\": \"ABC123XYZ\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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://www.closient.com/epcis/api/2.0/verification/returns")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"biz_location\": \"urn:epc:id:sgln:0614141.00888.0\",\n \"gtin\": \"00614524740108\",\n \"return_reference\": \"RMA-55102\",\n \"serial\": \"ABC123XYZ\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/epcis/api/2.0/verification/returns")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"biz_location\": \"urn:epc:id:sgln:0614141.00888.0\",\n \"gtin\": \"00614524740108\",\n \"return_reference\": \"RMA-55102\",\n \"serial\": \"ABC123XYZ\"\n}"
response = http.request(request)
puts response.read_body{
"event_id": "urn:uuid:3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"gtin": "00614524740108",
"lot": "L2847",
"returned_at": "2026-07-20T09:12:00Z",
"sale_transaction_reference": "TXN-88213",
"serial": "ABC123XYZ",
"sold_at": "2026-07-15T14:32:00Z"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Record an accepted return of a serialized unit
Record that the return desk accepted a unit back. Writes a GS1 CBV 2.0 EPCIS ObjectEvent (action OBSERVE, bizStep receiving, disposition returned) through the same capture pipeline as /capture, so the event is retrievable from /events and the next /verification/serial call for the unit answers already_returned with this return’s time.
A unit is returned once. A second return of a unit whose latest state is returned is refused with 409 naming the earlier return’s time, and is counted as an already_returned attempt in the verification report. Two returns racing on one unit produce exactly one event. A unit that is sold again after a return can be returned again.
404 if this organization has no events for the GTIN + serial: a return is recorded against the unit’s own history, never another organization’s. Caller must hold an OWNER or MANAGER membership on the organization.
curl --request POST \
--url https://www.closient.com/epcis/api/2.0/verification/returns \
--header 'Content-Type: application/json' \
--header 'X-API-Key: <api-key>' \
--data '
{
"biz_location": "urn:epc:id:sgln:0614141.00888.0",
"gtin": "00614524740108",
"return_reference": "RMA-55102",
"serial": "ABC123XYZ"
}
'import requests
url = "https://www.closient.com/epcis/api/2.0/verification/returns"
payload = {
"biz_location": "urn:epc:id:sgln:0614141.00888.0",
"gtin": "00614524740108",
"return_reference": "RMA-55102",
"serial": "ABC123XYZ"
}
headers = {
"X-API-Key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'X-API-Key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
biz_location: 'urn:epc:id:sgln:0614141.00888.0',
gtin: '00614524740108',
return_reference: 'RMA-55102',
serial: 'ABC123XYZ'
})
};
fetch('https://www.closient.com/epcis/api/2.0/verification/returns', 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://www.closient.com/epcis/api/2.0/verification/returns",
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([
'biz_location' => 'urn:epc:id:sgln:0614141.00888.0',
'gtin' => '00614524740108',
'return_reference' => 'RMA-55102',
'serial' => 'ABC123XYZ'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"X-API-Key: <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://www.closient.com/epcis/api/2.0/verification/returns"
payload := strings.NewReader("{\n \"biz_location\": \"urn:epc:id:sgln:0614141.00888.0\",\n \"gtin\": \"00614524740108\",\n \"return_reference\": \"RMA-55102\",\n \"serial\": \"ABC123XYZ\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("X-API-Key", "<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://www.closient.com/epcis/api/2.0/verification/returns")
.header("X-API-Key", "<api-key>")
.header("Content-Type", "application/json")
.body("{\n \"biz_location\": \"urn:epc:id:sgln:0614141.00888.0\",\n \"gtin\": \"00614524740108\",\n \"return_reference\": \"RMA-55102\",\n \"serial\": \"ABC123XYZ\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://www.closient.com/epcis/api/2.0/verification/returns")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["X-API-Key"] = '<api-key>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"biz_location\": \"urn:epc:id:sgln:0614141.00888.0\",\n \"gtin\": \"00614524740108\",\n \"return_reference\": \"RMA-55102\",\n \"serial\": \"ABC123XYZ\"\n}"
response = http.request(request)
puts response.read_body{
"event_id": "urn:uuid:3f1c2d4e-5a6b-4c7d-8e9f-0a1b2c3d4e5f",
"gtin": "00614524740108",
"lot": "L2847",
"returned_at": "2026-07-20T09:12:00Z",
"sale_transaction_reference": "TXN-88213",
"serial": "ABC123XYZ",
"sold_at": "2026-07-15T14:32:00Z"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}{
"detail": "The requested resource was not found.",
"error_code": "not_found",
"retryable": false,
"status": 404,
"timestamp": "2026-03-31T12:00:00+00:00",
"title": "Not Found",
"type": "https://closient.com/docs/errors/not_found"
}Authorizations
Body
An accepted return of one serialized unit.
GTIN-8/12/13/14 of the returned unit. Normalized to GTIN-14; check digit is validated.
^[0-9]{8}$|^[0-9]{12,14}$GS1 AI(21) serial number of the returned unit.
1 - 255^[^\x00]{1,255}$When the return was accepted. Defaults to the time of the request; one earlier than the unit's latest recorded event is refused with 422.
EPCIS bizLocation of the return desk (an SGLN URN or Digital Link URI).
1 - 255^[^\x00]{1,255}$Return authorization identifier, recorded as an rma business transaction on the event.
1 - 255^[^\x00]{1,255}$Response
Created
The return event just recorded.
eventID of the EPCIS return event, retrievable from /events/{eventID}.
Normalized GTIN-14 of the returned unit.
GS1 AI(21) serial number of the returned unit.
Event time of the recorded return.
GS1 AI(10) lot identifier recorded for this unit, when known.
Event time of the sale this return reverses, when this organization recorded one.
bizTransaction identifier carried on the sale event, scoped to this organization.