Getting Started with Item Identifiers
This guide walks you through creating and managing Item Identifiers on the Hii Retail platform. By the end of this guide, you will understand how to add barcodes and other identifiers to your Items for scanning at POS terminals, mobile apps, and other touchpoints.
Overview
What is an Item Identifier?
An Item Identifier is an identification code associated with an Item. While GS1 standards typically use GTINs (8-14 digit barcodes), Hii Retail supports various identifier types including PLU codes, QR codes, SKUs, and more.
Item Identifiers enable:
- Barcode scanning at POS terminals
- Product lookup in mobile apps
- Inventory management
- Supply chain tracking
┌─────────────────┐
│ Item │
│ "Fanta Orange" │
└────────┬────────┘
│
│ has many
▼
┌─────────────────────────────────────────────────┐
│ Item Identifiers │
├─────────────────┬─────────────────┬─────────────┤
│ GTIN13 │ SKU │ PLU │
│ 5449000051578 │ FANTA-ORG-500 │ 4011 │
│ (primary) │ │ │
└─────────────────┴─────────────────┴─────────────┘
Identifier Types
| Type | Description | Example |
|---|---|---|
GTIN8 | 8-digit Global Trade Item Number | 96385074 |
GTIN12 | 12-digit Global Trade Item Number (UPC-A) | 049000051578 |
GTIN13 | 13-digit Global Trade Item Number (EAN-13) | 5449000051578 |
GTIN14 | 14-digit Global Trade Item Number | 15449000051575 |
GTIN | Generic GTIN (auto-mapped to correct type) | 5449000051578 |
PLU | Price Look-Up code (for produce) | 4011 |
SKU | Stock Keeping Unit (not for barcodes) | FANTA-ORG-500 |
QR | QR code (matrix barcode) | URL or identifier string |
ECC200 | DataMatrix-200 (2D barcode) | Up to 2,335 characters |
ECC140 | DataMatrix-140 (legacy 2D barcode) | Up to 1,556 bytes |
ISBN | International Standard Book Number | 9780201379624 |
ISSN | International Standard Serial Number | 03785955 |
RFID | Radio-frequency identification tag | Tag identifier |
UUID | Universally Unique Identifier | a935d02c-cc65-4bdd-b566-d09c546567cf |
NONSTANDARD | For unsupported identifier types | Custom codes |
All GTIN types are validated for correct length and check digit. Duplicate GTINs within your tenant are rejected (except for variable measure ranges with prefixes 02, 20-29). Invalid GTINs trigger a Customer Notification event.
The Generic GTIN Type
If your source system doesn't specify the exact GTIN length, use the GTIN type. Hii Retail will automatically map it to the correct type based on the value:
- A 13-digit value with leading zero →
GTIN13 - A 12-digit value without leading zero →
GTIN12 - And so on for other lengths
Identifier Statuses
| Status | Description |
|---|---|
ACTIVE | Identifier is active and available for use |
DELETED | Identifier is deleted and should not be used |
Prerequisites
Before you begin, ensure you have:
- Items created: At least one Item to associate identifiers with (see Items guide)
- Business Units created: At least one Business Unit or Business Unit Group (see Business Units guide)
- Authentication Token: A valid JWT bearer token with the
pnp.item-identifier.createpermission
For details on obtaining an access token, see the OAuth2 Authentication documentation.
API Base URL
All Item Identifier Input API requests should be sent to:
https://item-identifier-input.retailsvc.com/api/v2
Step 1: Create a GTIN Identifier
Create a standard GTIN-13 barcode identifier for an Item at the Business Unit Group level.
Required Fields
| Field | Type | Description |
|---|---|---|
id | string | Unique identifier (max 250 characters) |
value | string | The barcode value |
type | string | Identifier type (e.g., GTIN13) |
itemId | string | The Item this identifier belongs to |
status | string | ACTIVE or DELETED |
isPrimary | boolean | Whether this is the primary identifier for the Item |
businessUnitGroupId | string | The Business Unit Group where this identifier applies |
Code Examples
- cURL
- Python
- Node.js
- Java
- .NET
curl -X POST 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "5449000051578",
"value": "5449000051578",
"type": "GTIN13",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitGroupId": "acme-retail-group"
}'
response = requests.post(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers",
headers={"Authorization": f"Bearer {access_token}"},
json={
"id": "5449000051578",
"value": "5449000051578",
"type": "GTIN13",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": True,
"businessUnitGroupId": "acme-retail-group"
}
)
const response = await fetch('https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: '5449000051578',
value: '5449000051578',
type: 'GTIN13',
itemId: 'fanta-orange-500ml',
status: 'ACTIVE',
isPrimary: true,
businessUnitGroupId: 'acme-retail-group'
})
});
var payload = """
{
"id": "5449000051578",
"value": "5449000051578",
"type": "GTIN13",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitGroupId": "acme-retail-group"
}
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers"))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
var payload = new {
id = "5449000051578",
value = "5449000051578",
type = "GTIN13",
itemId = "fanta-orange-500ml",
status = "ACTIVE",
isPrimary = true,
businessUnitGroupId = "acme-retail-group"
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers", content);
Response
A successful request returns 202 Accepted.
The Item Identifier Input API processes requests asynchronously. A 202 Accepted response means your request has been queued for processing, not that the identifier has been created yet.
Step 2: Add Multiple Identifiers to an Item
Items often need multiple identifiers. For example, a product might have both a GTIN barcode and an internal SKU.
- cURL
- Python
- Node.js
- Java
- .NET
# Add primary GTIN-13 barcode
curl -X POST 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "5449000051578",
"value": "5449000051578",
"type": "GTIN13",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitGroupId": "acme-retail-group"
}'
# Add secondary SKU identifier
curl -X POST 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "SKU-FANTA-ORG-500",
"value": "FANTA-ORG-500",
"type": "SKU",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": false,
"businessUnitGroupId": "acme-retail-group"
}'
# Add primary GTIN-13 barcode
requests.post(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers",
headers={"Authorization": f"Bearer {access_token}"},
json={
"id": "5449000051578",
"value": "5449000051578",
"type": "GTIN13",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": True,
"businessUnitGroupId": "acme-retail-group"
}
)
# Add secondary SKU identifier
requests.post(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers",
headers={"Authorization": f"Bearer {access_token}"},
json={
"id": "SKU-FANTA-ORG-500",
"value": "FANTA-ORG-500",
"type": "SKU",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": False,
"businessUnitGroupId": "acme-retail-group"
}
)
// Add primary GTIN-13 barcode
await fetch('https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers', {
method: 'POST',
headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
id: '5449000051578',
value: '5449000051578',
type: 'GTIN13',
itemId: 'fanta-orange-500ml',
status: 'ACTIVE',
isPrimary: true,
businessUnitGroupId: 'acme-retail-group'
})
});
// Add secondary SKU identifier
await fetch('https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers', {
method: 'POST',
headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
id: 'SKU-FANTA-ORG-500',
value: 'FANTA-ORG-500',
type: 'SKU',
itemId: 'fanta-orange-500ml',
status: 'ACTIVE',
isPrimary: false,
businessUnitGroupId: 'acme-retail-group'
})
});
// Helper method to create identifier
void createIdentifier(String id, String value, String type, boolean isPrimary) throws Exception {
var payload = String.format("""
{
"id": "%s",
"value": "%s",
"type": "%s",
"itemId": "fanta-orange-500ml",
"status": "ACTIVE",
"isPrimary": %s,
"businessUnitGroupId": "acme-retail-group"
}
""", id, value, type, isPrimary);
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers"))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
httpClient.send(request, HttpResponse.BodyHandlers.ofString());
}
// Add primary GTIN-13 and secondary SKU
createIdentifier("5449000051578", "5449000051578", "GTIN13", true);
createIdentifier("SKU-FANTA-ORG-500", "FANTA-ORG-500", "SKU", false);
async Task CreateIdentifierAsync(string id, string value, string type, bool isPrimary)
{
var payload = new {
id,
value,
type,
itemId = "fanta-orange-500ml",
status = "ACTIVE",
isPrimary,
businessUnitGroupId = "acme-retail-group"
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
await httpClient.PostAsync("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers", content);
}
// Add primary GTIN-13 and secondary SKU
await CreateIdentifierAsync("5449000051578", "5449000051578", "GTIN13", true);
await CreateIdentifierAsync("SKU-FANTA-ORG-500", "FANTA-ORG-500", "SKU", false);
Each Item should have exactly one primary identifier (isPrimary: true). The primary identifier is used as the default barcode for the Item.
Step 3: Create a PLU Identifier for Produce
Price Look-Up (PLU) codes are commonly used for produce items sold by weight.
- cURL
- Python
- Node.js
- Java
- .NET
curl -X POST 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "PLU-4011",
"value": "4011",
"type": "PLU",
"itemId": "bananas",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitGroupId": "acme-retail-group",
"description": "PLU code for bananas - used at cashier keyboard"
}'
response = requests.post(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers",
headers={"Authorization": f"Bearer {access_token}"},
json={
"id": "PLU-4011",
"value": "4011",
"type": "PLU",
"itemId": "bananas",
"status": "ACTIVE",
"isPrimary": True,
"businessUnitGroupId": "acme-retail-group",
"description": "PLU code for bananas - used at cashier keyboard"
}
)
const response = await fetch('https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers', {
method: 'POST',
headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
id: 'PLU-4011',
value: '4011',
type: 'PLU',
itemId: 'bananas',
status: 'ACTIVE',
isPrimary: true,
businessUnitGroupId: 'acme-retail-group',
description: 'PLU code for bananas - used at cashier keyboard'
})
});
var payload = """
{
"id": "PLU-4011",
"value": "4011",
"type": "PLU",
"itemId": "bananas",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitGroupId": "acme-retail-group",
"description": "PLU code for bananas - used at cashier keyboard"
}
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers"))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
var payload = new {
id = "PLU-4011",
value = "4011",
type = "PLU",
itemId = "bananas",
status = "ACTIVE",
isPrimary = true,
businessUnitGroupId = "acme-retail-group",
description = "PLU code for bananas - used at cashier keyboard"
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers", content);
Step 4: Create a Store-Specific Identifier
To create an identifier that only applies to a specific Business Unit (not inherited from a group), use the Business Unit endpoint.
- cURL
- Python
- Node.js
- Java
- .NET
curl -X POST 'https://item-identifier-input.retailsvc.com/api/v2/bu-item-identifiers' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "LOCAL-BREAD-001",
"value": "2099999000001",
"type": "GTIN13",
"itemId": "store-baked-bread",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitId": "store-123"
}'
response = requests.post(
"https://item-identifier-input.retailsvc.com/api/v2/bu-item-identifiers",
headers={"Authorization": f"Bearer {access_token}"},
json={
"id": "LOCAL-BREAD-001",
"value": "2099999000001",
"type": "GTIN13",
"itemId": "store-baked-bread",
"status": "ACTIVE",
"isPrimary": True,
"businessUnitId": "store-123"
}
)
const response = await fetch('https://item-identifier-input.retailsvc.com/api/v2/bu-item-identifiers', {
method: 'POST',
headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json' },
body: JSON.stringify({
id: 'LOCAL-BREAD-001',
value: '2099999000001',
type: 'GTIN13',
itemId: 'store-baked-bread',
status: 'ACTIVE',
isPrimary: true,
businessUnitId: 'store-123'
})
});
var payload = """
{
"id": "LOCAL-BREAD-001",
"value": "2099999000001",
"type": "GTIN13",
"itemId": "store-baked-bread",
"status": "ACTIVE",
"isPrimary": true,
"businessUnitId": "store-123"
}
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-item-identifiers"))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
var payload = new {
id = "LOCAL-BREAD-001",
value = "2099999000001",
type = "GTIN13",
itemId = "store-baked-bread",
status = "ACTIVE",
isPrimary = true,
businessUnitId = "store-123"
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://item-identifier-input.retailsvc.com/api/v2/bu-item-identifiers", content);
- Use
POST /api/v2/bu-g-item-identifierswithbusinessUnitGroupIdto create identifiers that inherit to all Business Units in the group - Use
POST /api/v2/bu-item-identifierswithbusinessUnitIdto create identifiers specific to a single Business Unit
Step 5: Update an Identifier
Use PATCH for partial updates to an identifier. Note that id, value, itemId, and businessUnitGroupId are immutable.
- cURL
- Python
- Node.js
- Java
- .NET
curl -X PATCH 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json-patch+json' \
-d '[
{"op": "replace", "path": "/description", "value": "Updated barcode description"},
{"op": "replace", "path": "/isPrimary", "value": false}
]'
response = requests.patch(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578",
params={"businessUnitGroupId": "acme-retail-group"},
headers={"Authorization": f"Bearer {access_token}", "Content-Type": "application/json-patch+json"},
json=[
{"op": "replace", "path": "/description", "value": "Updated barcode description"},
{"op": "replace", "path": "/isPrimary", "value": False}
]
)
const response = await fetch(
'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group',
{
method: 'PATCH',
headers: { 'Authorization': `Bearer ${accessToken}`, 'Content-Type': 'application/json-patch+json' },
body: JSON.stringify([
{ op: 'replace', path: '/description', value: 'Updated barcode description' },
{ op: 'replace', path: '/isPrimary', value: false }
])
}
);
var operations = """
[{"op": "replace", "path": "/description", "value": "Updated barcode description"},
{"op": "replace", "path": "/isPrimary", "value": false}]
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group"))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json-patch+json")
.method("PATCH", HttpRequest.BodyPublishers.ofString(operations))
.build();
var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
var operations = new[] {
new { op = "replace", path = "/description", value = "Updated barcode description" },
new { op = "replace", path = "/isPrimary", value = false }
};
var content = new StringContent(JsonSerializer.Serialize(operations), Encoding.UTF8, "application/json-patch+json");
var request = new HttpRequestMessage(HttpMethod.Patch,
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group") { Content = content };
var response = await httpClient.SendAsync(request);
The id, businessUnitGroupId, revision, itemId, and value properties cannot be updated via PATCH. To change these, delete the identifier and create a new one.
Step 6: Delete an Identifier
Delete an identifier when it's no longer needed. By default, this performs a soft-delete (sets status to DELETED).
- cURL
- Python
- Node.js
- Java
- .NET
# Soft delete (default)
curl -X DELETE 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group' \
-H 'Authorization: Bearer <your-access-token>'
# Hard delete (permanent)
curl -X DELETE 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group&permanent=true' \
-H 'Authorization: Bearer <your-access-token>'
# Soft delete (default)
response = requests.delete(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578",
params={"businessUnitGroupId": "acme-retail-group"},
headers={"Authorization": f"Bearer {access_token}"}
)
# Hard delete (permanent)
response = requests.delete(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578",
params={"businessUnitGroupId": "acme-retail-group", "permanent": True},
headers={"Authorization": f"Bearer {access_token}"}
)
// Soft delete (default)
await fetch(
'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group',
{ method: 'DELETE', headers: { 'Authorization': `Bearer ${accessToken}` } }
);
// Hard delete (permanent)
await fetch(
'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group&permanent=true',
{ method: 'DELETE', headers: { 'Authorization': `Bearer ${accessToken}` } }
);
// Soft delete (default)
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group"))
.header("Authorization", "Bearer " + accessToken)
.DELETE()
.build();
var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
// Hard delete (permanent) - add &permanent=true to the URL
// Soft delete (default)
var response = await httpClient.DeleteAsync(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group");
// Hard delete (permanent)
var permanentResponse = await httpClient.DeleteAsync(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers/5449000051578?businessUnitGroupId=acme-retail-group&permanent=true");
Working with 2D Barcodes
For QR codes and DataMatrix barcodes, the value can be longer than traditional barcodes. When the value exceeds 250 characters, you must use a different id (not the value itself).
- cURL
- Python
- Node.js
- Java
- .NET
curl -X POST 'https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers' \
-H 'Authorization: Bearer <your-access-token>' \
-H 'Content-Type: application/json' \
-d '{
"id": "QR-PRODUCT-12345",
"value": "https://example.com/products/12345?utm_source=qr&data=extended",
"type": "QR",
"itemId": "product-12345",
"status": "ACTIVE",
"isPrimary": false,
"businessUnitGroupId": "acme-retail-group"
}'
response = requests.post(
"https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers",
headers={"Authorization": f"Bearer {access_token}"},
json={
"id": "QR-PRODUCT-12345",
"value": "https://example.com/products/12345?utm_source=qr&data=extended",
"type": "QR",
"itemId": "product-12345",
"status": "ACTIVE",
"isPrimary": False,
"businessUnitGroupId": "acme-retail-group"
}
)
const response = await fetch('https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers', {
method: 'POST',
headers: {
'Authorization': `Bearer ${accessToken}`,
'Content-Type': 'application/json'
},
body: JSON.stringify({
id: 'QR-PRODUCT-12345',
value: 'https://example.com/products/12345?utm_source=qr&data=extended',
type: 'QR',
itemId: 'product-12345',
status: 'ACTIVE',
isPrimary: false,
businessUnitGroupId: 'acme-retail-group'
})
});
var payload = """
{
"id": "QR-PRODUCT-12345",
"value": "https://example.com/products/12345?utm_source=qr&data=extended",
"type": "QR",
"itemId": "product-12345",
"status": "ACTIVE",
"isPrimary": false,
"businessUnitGroupId": "acme-retail-group"
}
""";
var request = HttpRequest.newBuilder()
.uri(URI.create("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers"))
.header("Authorization", "Bearer " + accessToken)
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(payload))
.build();
var response = httpClient.send(request, HttpResponse.BodyHandlers.ofString());
var payload = new {
id = "QR-PRODUCT-12345",
value = "https://example.com/products/12345?utm_source=qr&data=extended",
type = "QR",
itemId = "product-12345",
status = "ACTIVE",
isPrimary = false,
businessUnitGroupId = "acme-retail-group"
};
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var response = await httpClient.PostAsync("https://item-identifier-input.retailsvc.com/api/v2/bu-g-item-identifiers", content);
Next Steps
Now that you can create Item Identifiers, you can:
- Add prices: Configure pricing for your items using the Price Input API
- Set up scanning: Configure your POS terminals to recognize the identifiers
- Monitor duplicates: Subscribe to External Events for duplicate GTIN notifications
Related Resources
- Item Identifier Input API Reference
- Item Identifier Concepts
- Item Identifier Use Cases
- Items Guide
- Business Units Guide
Next: Prices - Learn how to create and manage price specifications for your items.