Code Samples
Complete client implementations in Python, Java, and Node.js.
The following examples demonstrate full API client implementations with authentication, product creation, document creation, and stock queries. Adapt them to your language and framework of choice.
Python
Python (requests)
import requests
import time
class LogisticsWMSClient:
"""Complete Python client for the LogisticsWMS External API."""
def __init__(self, base_url, client_id, client_secret):
self.base_url = base_url.rstrip("/")
self.client_id = client_id
self.client_secret = client_secret
self.token = None
self.token_expires_at = 0
def authenticate(self):
"""Obtain or refresh the API client access token."""
if self.token and time.time() < self.token_expires_at:
return self.token
response = requests.post(
f"{self.base_url}/api/external/v1/auth/token",
data={
"client_id": self.client_id,
"client_secret": self.client_secret,
},
)
response.raise_for_status()
data = response.json()
self.token = data["access_token"]
self.token_expires_at = time.time() + data["expires_in"] - 300
return self.token
def _headers(self):
return {
"Authorization": f"Bearer {self.authenticate()}",
"Content-Type": "application/json",
}
def create_product(self, external_code, description, barcode=None, **kwargs):
"""Create a new product in the WMS."""
payload = {
"externalCode": external_code,
"description": description,
}
if barcode:
payload["barcode"] = barcode
payload.update(kwargs)
response = requests.post(
f"{self.base_url}/api/external/v1/product",
headers=self._headers(),
json=payload,
)
response.raise_for_status()
return response.json()
def create_document(self, external_code, document_type, lines, **kwargs):
"""Create a new warehouse document."""
payload = {
"externalCode": external_code,
"documentType": document_type,
"lines": lines,
}
payload.update(kwargs)
response = requests.post(
f"{self.base_url}/api/external/v1/document",
headers=self._headers(),
json=payload,
)
response.raise_for_status()
return response.json()
def get_stock(self, external_codes):
"""Query stock levels for one or more products."""
response = requests.post(
f"{self.base_url}/api/external/v1/product/stock",
headers=self._headers(),
json={"externalCodes": external_codes},
)
response.raise_for_status()
return response.json()
# Usage
client = LogisticsWMSClient(
base_url="https://app.logistics-wms.com",
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
)
# Create a product
product = client.create_product(
external_code="ERP-SKU-001",
description="Wireless Bluetooth Headphones",
barcode="5901234123457",
weight=0.35,
)
print(f"Product created: {product['externalCode']}")
# Create a purchase order
document = client.create_document(
external_code="PO-2026-0001",
document_type="PURCHASE_ORDER",
originCode="SUPPLIER-ACME",
lines=[{"externalCode": "ERP-SKU-001", "quantity": 500, "lineNumber": 1}],
)
print(f"Document created: {document['externalCode']} ({document['status']})")
# Query stock
stock = client.get_stock(["ERP-SKU-001"])
for item in stock:
print(f"{item['externalCode']}: {item['available']} available")
Java
Java (Spring RestTemplate)
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.*;
public class LogisticsWMSClient {
private final String baseUrl;
private final String clientId;
private final String clientSecret;
private final RestTemplate restTemplate = new RestTemplate();
private final ObjectMapper mapper = new ObjectMapper();
private String token;
private long tokenExpiresAt;
public LogisticsWMSClient(String baseUrl, String clientId,
String clientSecret) {
this.baseUrl = baseUrl;
this.clientId = clientId;
this.clientSecret = clientSecret;
}
public String authenticate() {
if (token != null && System.currentTimeMillis() / 1000 < tokenExpiresAt) {
return token;
}
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
String body = "client_id=" + clientId + "&client_secret=" + clientSecret;
HttpEntity<String> request = new HttpEntity<>(body, headers);
ResponseEntity<JsonNode> response = restTemplate.postForEntity(
baseUrl + "/api/external/v1/auth/token",
request, JsonNode.class);
JsonNode data = response.getBody();
token = data.get("access_token").asText();
tokenExpiresAt = System.currentTimeMillis() / 1000
+ data.get("expires_in").asLong() - 300;
return token;
}
private HttpHeaders authHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.setBearerAuth(authenticate());
return headers;
}
public JsonNode createProduct(Map<String, Object> product) {
HttpEntity<Map<String, Object>> request =
new HttpEntity<>(product, authHeaders());
ResponseEntity<JsonNode> response = restTemplate.postForEntity(
baseUrl + "/api/external/v1/product", request, JsonNode.class);
return response.getBody();
}
public JsonNode getStock(List<String> externalCodes) {
Map<String, Object> body = Map.of("externalCodes", externalCodes);
HttpEntity<Map<String, Object>> request =
new HttpEntity<>(body, authHeaders());
ResponseEntity<JsonNode> response = restTemplate.postForEntity(
baseUrl + "/api/external/v1/product/stock",
request, JsonNode.class);
return response.getBody();
}
}
// Usage
LogisticsWMSClient client = new LogisticsWMSClient(
"https://app.logistics-wms.com",
"YOUR_CLIENT_ID",
"YOUR_CLIENT_SECRET"
);
// Create a product
JsonNode product = client.createProduct(Map.of(
"externalCode", "ERP-SKU-001",
"description", "Wireless Bluetooth Headphones",
"barcode", "5901234123457",
"weight", 0.35
));
System.out.println("Product created: " + product.get("externalCode").asText());
// Query stock
JsonNode stock = client.getStock(List.of("ERP-SKU-001"));
System.out.println("Stock: " + stock.toPrettyString());
Node.js
JavaScript (Node.js / Axios)
const axios = require("axios");
class LogisticsWMSClient {
constructor(baseUrl, clientId, clientSecret) {
this.baseUrl = baseUrl.replace(/\/$/, "");
this.clientId = clientId;
this.clientSecret = clientSecret;
this.token = null;
this.tokenExpiresAt = 0;
}
async authenticate() {
if (this.token && Date.now() / 1000 < this.tokenExpiresAt) {
return this.token;
}
const response = await axios.post(
`${this.baseUrl}/api/external/v1/auth/token`,
`client_id=${this.clientId}&client_secret=${this.clientSecret}`,
{ headers: { "Content-Type": "application/x-www-form-urlencoded" } }
);
this.token = response.data.access_token;
this.tokenExpiresAt = Date.now() / 1000 + response.data.expires_in - 300;
return this.token;
}
async _headers() {
const token = await this.authenticate();
return {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
};
}
async createProduct(product) {
const headers = await this._headers();
const response = await axios.post(
`${this.baseUrl}/api/external/v1/product`,
product,
{ headers }
);
return response.data;
}
async getStock(externalCodes) {
const headers = await this._headers();
const response = await axios.post(
`${this.baseUrl}/api/external/v1/product/stock`,
{ externalCodes },
{ headers }
);
return response.data;
}
}
// Usage
(async () => {
const client = new LogisticsWMSClient(
"https://app.logistics-wms.com",
"YOUR_CLIENT_ID",
"YOUR_CLIENT_SECRET"
);
// Create a product
const product = await client.createProduct({
externalCode: "ERP-SKU-001",
description: "Wireless Bluetooth Headphones",
barcode: "5901234123457",
weight: 0.35,
});
console.log(`Product created: ${product.externalCode}`);
// Query stock
const stock = await client.getStock(["ERP-SKU-001"]);
stock.forEach((item) => {
console.log(`${item.externalCode}: ${item.available} available`);
});
})();
Postman collection
A Postman collection with pre-configured requests for all External API endpoints is available upon request. Contact help@logistics-wms.com to
receive it.