Claim product serials
curl --request POST \
--url https://api.shoppex.io/dev/v1/products/{id}/serials/claim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"amount": 2
}'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 2})
};
fetch('https://api.shoppex.io/dev/v1/products/{id}/serials/claim', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.shoppex.io/dev/v1/products/{id}/serials/claim"
payload = { "amount": 2 }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.shoppex.io/dev/v1/products/{id}/serials/claim",
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([
'amount' => 2
]),
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.shoppex.io/dev/v1/products/{id}/serials/claim"
payload := strings.NewReader("{\n \"amount\": 2\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))
}{
"data": {
"claimed_count": 2,
"remaining_stock": 7,
"serials": [
{
"id": "serial_1",
"serial": "ABC-123",
"variant_id": null,
"variant_title": null,
"created_at": "2026-03-16T10:00:00.000Z"
},
{
"id": "serial_2",
"serial": "XYZ-789",
"variant_id": null,
"variant_title": null,
"created_at": "2026-03-16T10:01:00.000Z"
}
]
}
}Products
Claim product serials
Requires products.write and licenses.read for API keys and OAuth. OAuth also requires the consenting member to retain license key permission. Atomically claims and removes the requested number of available serials from a serial product (from the keys of one variant with variant_id; without it, from a product without variants or its sole variant), then returns the claimed serial values plus the updated remaining stock. Use this endpoint when you want serial values directly and do not want to manually fetch serial IDs first.
POST
/
dev
/
v1
/
products
/
{id}
/
serials
/
claim
Claim product serials
curl --request POST \
--url https://api.shoppex.io/dev/v1/products/{id}/serials/claim \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '{
"amount": 2
}'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({amount: 2})
};
fetch('https://api.shoppex.io/dev/v1/products/{id}/serials/claim', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.shoppex.io/dev/v1/products/{id}/serials/claim"
payload = { "amount": 2 }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.shoppex.io/dev/v1/products/{id}/serials/claim",
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([
'amount' => 2
]),
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.shoppex.io/dev/v1/products/{id}/serials/claim"
payload := strings.NewReader("{\n \"amount\": 2\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))
}{
"data": {
"claimed_count": 2,
"remaining_stock": 7,
"serials": [
{
"id": "serial_1",
"serial": "ABC-123",
"variant_id": null,
"variant_title": null,
"created_at": "2026-03-16T10:00:00.000Z"
},
{
"id": "serial_2",
"serial": "XYZ-789",
"variant_id": null,
"variant_title": null,
"created_at": "2026-03-16T10:01:00.000Z"
}
]
}
}Authorizations
Use your Shoppex API key in the Authorization header.
Path Parameters
Body
application/jsonapplication/x-www-form-urlencodedmultipart/form-data
Response
200 - application/json
Successful response
The response is of type object.