REST API Reference v3.0
Complete reference for the Senitron RFID Inventory & Tracking Cloud API — 404 endpoints, verified against the server code.
Getting Started
The Senitron REST API connects handhelds, readers and business systems to the Senitron RFID Inventory & Tracking Cloud. All requests and responses use JSON.
Base URL
Add the endpoint path to the base URL, e.g. GET /api/v1/epcs/statuses → https://app.senitron.net/api/v1/epcs/statuses. Send Content-Type: application/json and put POST/PUT data in the JSON body. GET parameters go in the query string. Always use HTTPS: HTTP requests are redirected (301), and redirected POSTs can lose their body.
Authentication
- Register Device returns the tenant
api_keyonce the device is assigned to a tenant. - Login with the
Api-Keyheader returns a sessiontoken. - Send
Authorization: <token>on every call. - Call Session Ping regularly to keep the session active.
- Get the key from Senitron support, or in the web app under Tenant Admin → Integrations (Super Admin).
- General mode: call
/{tenant-code}/{location}/api/v1/…withapi_key=<key>. - Handheld paths marked Token or API key also accept the key in the
Api-Keyheader orapi_keyparameter.
Each endpoint shows its authentication: Token Token or API key API key Token + API key Web session CRM PIN No auth.
Web session endpoints (Web App chapter) are called by the Senitron web app and need the browser’s signed-in session cookie; CRM PIN endpoints also need the operator’s PIN in a pin cookie.
Testing with curl
Every endpoint below has a Try it with curl command you can paste into a terminal (macOS/Linux, or Git Bash/WSL on Windows). Set these variables once:
export TENANT="your-tenant-code"
export LOCATION="001"
export SENITRON_API_KEY="your-tenant-api-key"
# Handheld endpoints: log in once and keep the token
export SENITRON_TOKEN=$(curl -s -X POST "https://app.senitron.net/api/v1/handhelds/login" \
-H "Api-Key: $SENITRON_API_KEY" -H "Content-Type: application/json" \
-d '{"email": "you@example.com", "password": "…", "serial_number": "…"}' \
| python3 -c 'import sys, json; print(json.load(sys.stdin)["token"])')
# Web App endpoints only
export SENITRON_SESSION="_smartadmin_session=…"
export CRM_PIN="1234"- Replace placeholders in angle brackets, e.g.
<id>, with real values. Only required parameters are included — add optional ones as needed. - General-mode commands send the key as
api_key=$SENITRON_API_KEY; handheld commands sendAuthorization: $SENITRON_TOKEN. - Web App commands need
SENITRON_SESSION: copy the_smartadmin_session=…cookie from your browser after signing in to the web app. - Add
-ito see the HTTP status and headers. Commands run against your live data — use a test location for write operations.
Locations
Most endpoints work on one location (store). In Handheld mode send its code as location (some endpoints also accept store_code); in General mode it is part of the URL. Dates in responses use that location’s time zone.
Errors
Successful calls return HTTP 200. Errors normally return a 4xx status and this body:
{
"error": {
"type": "LOCATION_NOT_FOUND",
"message": "The location 001 not found"
}
}Some endpoint families differ, and each endpoint’s Errors table shows its exact format:
- Transfer Order (NTO) endpoints return most errors without the wrapper:
{"type": "…", "message": "…"}(marked flat). - Several General-mode endpoints use
{"status": "error", "message": "Invalid API key"}. - Picking/Packing return business errors with HTTP 200 — always check for an
errorkey. - Some endpoints return unexpected failures as HTTP 404 with the exception class as
type.
Conventions
| Pagination | page (default 1) and per_page (default varies, usually 10). Lists return {"pagination": {"current_page", "per_page", "total_entries"}}. Some endpoints accept per_page=0 for all rows — noted per endpoint. |
| Booleans | Query-string flags must be the text true; any other value counts as false. |
| Dates | Most responses use MM/DD/YYYY hh:mm AM/PM; asset fields often use a two-digit year. The format is shown in each sample. |
| Duplicates | Endpoints that support it accept a Request-Id header; a repeated id returns 409 DUPLICATE_REQUEST. |
| Async work | Uploads and imports are queued; a 200 means accepted, not processed. Check the related list endpoint for the result. |
| Handheld names | Several endpoints need device_name as HH-<device id> (from Register Device). |
How to read this reference
Each endpoint lists its method and path, authentication, headers, parameters (required/optional), a request sample, the success response, all known errors and notes. Sample values are illustrative.
Authentication
Register a handheld, log in to get a session token, and keep the session alive.
Device & Session
Register Device
/api/v1/handhelds/registerPOST /{tenant-code}/api/v1/handhelds/registerRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"name": "UHF Handheld Terminal",
"serial_number": "K3A01A0819070037",
"mac_address": "6C:EC:A1:FF:0B:8E",
"brand": "chainway",
"version": "1.0.0",
"build": "1003",
"model_number": "CL7206D2 (SNHN01)",
"public_ip": "104.51.32.179",
"local_ip": "192.168.22.43",
"hardware_metrics": {
"temperature": 38.5,
"battery_temperature": 31.0,
"battery": 87,
"cpu": {
"used": 22.5,
"app_used": 6.1
},
"memory": {
"total": 3.6,
"used": 2.1,
"app_used": 0.4
},
"storage": {
"total": 26.4,
"used": 11.8
},
"android_version": "11"
}
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/handhelds/register" \
-H "Content-Type: application/json" \
-d '{
"name": "UHF Handheld Terminal",
"serial_number": "K3A01A0819070037",
"mac_address": "6C:EC:A1:FF:0B:8E",
"brand": "chainway",
"version": "1.0.0",
"build": "1003",
"model_number": "CL7206D2 (SNHN01)",
"public_ip": "104.51.32.179",
"local_ip": "192.168.22.43",
"hardware_metrics": {
"temperature": 38.5,
"battery_temperature": 31.0,
"battery": 87,
"cpu": {
"used": 22.5,
"app_used": 6.1
},
"memory": {
"total": 3.6,
"used": 2.1,
"app_used": 0.4
},
"storage": {
"total": 26.4,
"used": 11.8
},
"android_version": "11"
}
}'Success response
{
"id": 51,
"device_alias_name": "UHF Handheld Terminal",
"device_name": "HH-51",
"api_key": "<tenant api key>",
"expiration_date": "07-13-2027",
"license_type": "Demo",
"company_code": "acme",
"company_name": "Acme Corp",
"api_url": "https://app.senitron.net/api/v1",
"brand": "chainway"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | STATUS_PENDING | Error in user authentication |
The device is identified by serial_number: registering an existing serial number updates that device instead of creating a new one.
api_key is returned only after the device has been assigned to a tenant in Senitron; until then the call returns
401 STATUS_PENDING.hardware_metrics is optional; when sent, the values are stored on the device record (temperatures in °C, memory/storage in GB).
Login
/api/v1/handhelds/loginPOST /{tenant-code}/api/v1/handhelds/loginRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Api-Key | <api key from Register Device> |
Request body
{
"email": "user@example.com",
"password": "********",
"mac_address": "6C:EC:A1:FF:0B:8E",
"serial_number": "K3A01A0819070037"
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/handhelds/login" \
-H "Api-Key: $SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "user@example.com",
"password": "********",
"mac_address": "6C:EC:A1:FF:0B:8E",
"serial_number": "K3A01A0819070037"
}'Success response
{
"name": "Jane Doe",
"token": "<JWT session token>",
"avatar": "",
"permissions": {
"inventory": true,
"geiger": true,
"find": true,
"rfid_lookup": true,
"transfer": false,
"change_status": true,
"search_catalog": true,
"encode": false,
"scan_and_print": false,
"scan_to_device": false,
"pick_list": false,
"pallet_build": false,
"audit_shipment": true,
"upload": false,
"shipping": false,
"custom_modules": false,
"mfg_modules": false
},
"extra_permissions": {
"inventory": true,
"inventory_lookup": true,
"transfer_out": true,
"transfer_in": true,
"encode": false,
"scan_print": false,
"purchase_order_receiving": false,
"wave_order_picking": false,
"inbound_receiving_order": false,
"merge_transfers": false
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Your serial number does not registered. |
| 401 | UNAUTHORIZED | Your mac address does not registered. |
| 401 | UNAUTHORIZED | Your username or password is invalid. |
| 401 | UNAUTHORIZED | The user is not active. |
Send the
Api-Keyheader returned by Register Device.The device is looked up by serial_number when present, otherwise by mac_address.
Store the returned token and send it as the
Authorizationheader on all other handheld calls. The token does not expire on a timer; keep the session active with Session Ping.extra_permissions contains about 100 per-feature flags (shortened here); each is
truewhen the user's role grants that handheld feature.
Session Ping
/api/v1/sessions/pingPOST /api/v1/sessions/pingRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
device_id | integer | optional | Device id from Register Device; used to choose the app build (brand) for current_version. |
total_ram_mb, free_ram_mb, app_ram_mb, total_disk_mb, free_disk_mb | number | optional | Optional device metrics (MB). |
reader_temp_c, battery_temp_c | number | optional | Optional temperatures (°C). |
cpu_percent, app_cpu_percent | number | optional | Optional CPU usage (%). |
android_version | string | optional | Optional Android version. |
Try it with curl
curl "https://app.senitron.net/api/v1/sessions/ping" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"settings": {
"auto_login": false,
"remember_username": true,
"remember_password": true,
"api_url": "https://app.senitron.net/api/v1",
"check_version": true,
"current_version": "1.24.0",
"current_version_url": "https://senitroncloud.s3.amazonaws.com/uploads/handheld_apk/SenitronRFID-v1.24.0.apk",
"timezone": "America/Los_Angeles",
"check_timezone": true,
"default_location": {
"code": "001",
"name": "Floor-1"
},
"locations": [
{
"name": "Floor-1",
"code": "001"
}
]
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Also accepted as
POST /api/v1/sessions/ping; a POST body may carry the same metrics as a nestedhardware_metricsobject (see Register Device).locations lists only the locations assigned to the calling handheld; default_location is the user's default location, or the tenant's first location.
Handheld Mode APIs
Endpoints used by Senitron handhelds and mobile apps. Paths are relative to https://app.senitron.net. Authenticate with the Authorization: <token> header from Login; endpoints marked Token or API key also accept the tenant API key.
- Assets5
- Audits3
- Bills of Lading (BOLs)12
- Catalog3
- Check-Out / Check-In (COCI)6
- EOS1
- EPCs & Tags14
- Geiger4
- Inventory27
- Items9
- NetSuite1
- Transfers12
- Packing2
- Picking5
- Purchase Orders3
- Sales2
- Shipping6
- Temp Transfers1
- Transfer Orders8
- Wave Orders & Picking (WOP)6
- Settings4
- Users1
- External System Quantities4
- Pallet Build12
- Scan & Print4
Assets
Get Assets
/api/v1/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code. Falls back to the tenant's first location when missing or unknown. |
query | string | optional | Exact match on asset id (serial), record id, item number, EPC or alt serial. |
serial_numbers | string | optional | Comma-separated asset ids (serial numbers). |
status | string | optional | Status name, e.g. Live. |
zone_ids | string | optional | Comma-separated sub-zone ids; matches the last-seen antenna or static zone. |
include_in_inventory | boolean | optional | true = only assets whose status counts toward inventory. |
items_details | boolean | optional | true adds an item_details object to each asset. |
item_parts | boolean | optional | With items_details, lists item parts (COCI tenants only). |
main_attributes | boolean | optional | true returns only id, serial_number, item_number, alt_serial, epc, text3 and status. |
summary | boolean | optional | true adds a summary object. |
assets | boolean | optional | false omits the asset list (returns "assets": []). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/assets" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"summary": {
"skus": 1,
"epcs_count": 1,
"qty": 1,
"total_qty": 1
},
"assets": [
{
"id": 32503,
"serial_number": "1024",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/24 07:13 PM",
"last_seen": "01/25/24 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"static_zone": 0,
"static_zone_last_update": "",
"handheld_reader": "HH-53",
"handheld_last_seen": "01/25/2024 07:13 PM",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/24 07:13 PM",
"updated_at": "01/25/24 07:13 PM",
"epc": "CF19930E4FA6BD4000000432",
"text3": "01/25/2024 06:39 PM, 1001",
"uom": "",
"status": {
"id": 1000,
"name": "Live",
"include_inventory": true
},
"audited_by": "",
"audited_at": "",
"item_details": {
"id": 48696466,
"number": "210000047060",
"name": "Classic Tee - Black / M",
"upc": 123456789012,
"alu": "CT-BLK-M",
"description": "Classic Tee - Black / M",
"style": "CT",
"colour": "Black",
"size": "M",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "19.99",
"picture_url": "",
"item_type_name": "Regular",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"categories": [
{
"id": 381199,
"name": "Tops"
}
],
"text1": "210000047060 Classic Tee",
"text2": "Black M,19.99",
"in_stock": 3,
"uoms": [],
"parts": []
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
Dates use the location's time zone.
first_seen,last_seen,created_atandupdated_atuseMM/DD/YY hh:mm AM/PM;handheld_last_seenuses a four-digit year.
Merge Assets
/api/v1/assets/mergeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"assets": [
{
"epc": "CF19930E4FA6BD4000000432"
},
{
"epc": "CF19930E4FA6BD4000000433"
},
{
"epc": "CF19930E4FA6BD4000000434"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/assets/merge" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"assets": [
{
"epc": "CF19930E4FA6BD4000000432"
},
{
"epc": "CF19930E4FA6BD4000000433"
},
{
"epc": "CF19930E4FA6BD4000000434"
}
]
}'Success response
{
"asset": {
"id": 32503,
"serial_number": "1024",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/24 07:13 PM",
"last_seen": "01/25/24 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"handheld_reader": "HH-53",
"handheld_last_seen": "01/25/2024 07:13 PM",
"current_units": 10.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/24 07:13 PM",
"updated_at": "01/25/24 07:13 PM",
"epc": "CF19930E4FA6BD4000000432",
"text3": "01/25/2024 06:39 PM, 1001",
"status": {
"id": 1000,
"name": "Live"
}
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
The first EPC in assets is kept; the quantities of all other listed tags are added to it, and those tags are set to Tag Killed with 0 units.
If the kept tag is Stolen, it and the merged tags are set back to Live first.
Unexpected failures (for example an unknown EPC) return HTTP 404 with the exception class as
typeand the exception text asmessage.
New Asset
/api/v1/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-178",
"module_name": "",
"asset": {
"item_number": "210000047060",
"epc": "",
"serial_number": "",
"asset_id": "",
"current_units": 1,
"storage_unit": 1,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"first_seen": "",
"last_seen": "",
"handheld_last_seen": "",
"update_external_system": false,
"status": {
"id": 0
}
}
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/assets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-178",
"module_name": "",
"asset": {
"item_number": "210000047060",
"epc": "",
"serial_number": "",
"asset_id": "",
"current_units": 1,
"storage_unit": 1,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"first_seen": "",
"last_seen": "",
"handheld_last_seen": "",
"update_external_system": false,
"status": {
"id": 0
}
}
}'Success response
{
"message": "The asset info saved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 400 | INVALID_ASSET | The asset payload is required |
| 400 | ERROR | <Lightspeed push result> |
| 404 | <exception class> | <exception message> |
If asset.epc is empty, an EPC is generated from item_number and the tenant's EPC settings. asset.serial_number is used as the serial for that EPC; when empty, the next serial is used.
asset.status is required;
status.id0 means Live.The EPC must be 24 hex characters and match the tenant's allowed prefix; otherwise the call fails with an EPC error.
module_name: "inventory_adjustment"also writes a handheld inventory-adjustment log.update_external_system: truewith a non-zeroadjust_qtypushes the quantity change to Lightspeed (Lightspeed tenants only).
Split Asset
/api/v1/assets/splitRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"asset": {
"epc": "CF19930E4FA6BD4000000432"
},
"adjustment": -4,
"new_tags": 2,
"printer_id": 2
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/assets/split" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"asset": {
"epc": "CF19930E4FA6BD4000000432"
},
"adjustment": -4,
"new_tags": 2,
"printer_id": 2
}'Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 3
},
"assets": [
{
"id": 32503,
"serial_number": "441",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/24 07:13 PM",
"last_seen": "01/25/24 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"static_zone": 0,
"static_zone_last_update": "",
"handheld_reader": "HH-53",
"handheld_last_seen": "01/25/2024 07:13 PM",
"current_units": 2.0,
"storage_unit": 2.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/24 07:13 PM",
"updated_at": "01/25/24 07:13 PM",
"epc": "CF19930E4FA6BD4000000439",
"text3": "01/25/2024 06:39 PM, 1001",
"uom": "",
"status": {
"id": 1000,
"name": "Live",
"include_inventory": true
},
"audited_by": "",
"audited_at": ""
},
{
"id": 32503,
"serial_number": "442",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/24 07:13 PM",
"last_seen": "01/25/24 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"static_zone": 0,
"static_zone_last_update": "",
"handheld_reader": "HH-53",
"handheld_last_seen": "01/25/2024 07:13 PM",
"current_units": 2.0,
"storage_unit": 2.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/24 07:13 PM",
"updated_at": "01/25/24 07:13 PM",
"epc": "CF19930E4FA6BD400000043A",
"text3": "01/25/2024 06:39 PM, 1001",
"uom": "",
"status": {
"id": 1000,
"name": "Live",
"include_inventory": true
},
"audited_by": "",
"audited_at": ""
},
{
"id": 32503,
"serial_number": "1024",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/24 07:13 PM",
"last_seen": "01/25/24 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"static_zone": 0,
"static_zone_last_update": "",
"handheld_reader": "HH-53",
"handheld_last_seen": "01/25/2024 07:13 PM",
"current_units": 6.0,
"storage_unit": 10.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/24 07:13 PM",
"updated_at": "01/25/24 07:13 PM",
"epc": "CF19930E4FA6BD4000000432",
"text3": "01/25/2024 06:39 PM, 1001",
"uom": "",
"status": {
"id": 1000,
"name": "Live",
"include_inventory": true
},
"audited_by": "",
"audited_at": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_CORRECT | There should be correct divide for the each tag quantity for split to work. |
| 404 | <exception class> | <exception message> |
Creates new_tags new tags, each holding |adjustment| ÷ new_tags units, and sends them to printer_id. |adjustment| must divide evenly by new_tags.
The original tag keeps the remaining units and is listed last; if no units remain it is set to Tag Killed.
The printer must not use self-serialization.
Optional
page/per_pagepaginate the returned list.
Update Asset
/api/v1/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-178",
"module_name": "",
"update_fields": [
"alt_serial",
"current_units",
"status_id"
],
"asset": {
"id": 32503,
"alt_serial": "A-1001",
"current_units": 3,
"status_id": 1000,
"adjust_qty": 2,
"update_external_system": false
}
}Try it with curl
curl -X PUT "https://app.senitron.net/api/v1/assets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-178",
"module_name": "",
"update_fields": [
"alt_serial",
"current_units",
"status_id"
],
"asset": {
"id": 32503,
"alt_serial": "A-1001",
"current_units": 3,
"status_id": 1000,
"adjust_qty": 2,
"update_external_system": false
}
}'Success response
{
"message": "The asset info saved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 400 | ERROR | <Lightspeed push result> |
| 404 | ActiveRecord::RecordNotFound | Couldn't find EpcTag with 'id'=32503 |
asset.id (the asset record id) is required.
update_fields lists the asset columns to change, using database column names:
alt_serial,current_units,storage_unit,adjust_qty,item_number,asset_id,status_id,attr1–attr10,first_seen,last_seen,handheld_reader,handheld_last_seen. Sendepcto change the EPC.If update_fields is empty, every key in asset is written, so asset must then contain only valid column names.
module_name: "inventory_adjustment"writes a handheld inventory-adjustment log;update_external_system: truepushes a non-zeroadjust_qtyto Lightspeed.
Audits
Audit Zone Upload
/api/v1/audits/inventory_zonesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-453",
"zone": {
"id": 3,
"name": "Inside",
"sub_zone": [
{
"id": 4,
"name": "101"
},
{
"id": 5,
"name": "102"
}
]
},
"epcs": [
{
"epc": "FF199CEC01A61620000003D3"
},
{
"epc": "FF199CEC01A6162000000B91"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/audits/inventory_zones" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-453",
"zone": {
"id": 3,
"name": "Inside",
"sub_zone": [
{
"id": 4,
"name": "101"
},
{
"id": 5,
"name": "102"
}
]
},
"epcs": [
{
"epc": "FF199CEC01A61620000003D3"
},
{
"epc": "FF199CEC01A6162000000B91"
}
]
}'Success response
{
"message": "Audit information received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | ZONE_NOT_FOUND | The zone Inside not found |
| 422 | SUB_ZONE_NOT_FOUND | The following sub zone ids are not found: 5 |
The audited area is the zone plus the listed sub-zones; tags are matched by their last-seen antenna in that area.
Listed EPCs found in the area get
last_seen/handheld_last_seen= now,handheld_reader= device_name, and status Live.Tags in the area that were not scanned are set to the handheld setting Audit zone missed status (skipped when that setting is empty).
Get Audit Orders
/api/v1/audits/ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
order_id | string | optional | Exact sales document id. |
query | string | optional | Partial match on document id or date. |
items | boolean | optional | Include the items array (default: empty array). |
items_details | boolean | optional | With items, add item_details to each item. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/audits/orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"allow_override": true,
"orders": [
{
"id": "12345",
"customer_name": "",
"created_at": "01/01/2026 12:00 AM",
"assets_count": 1,
"items": [
{
"item_number": "000492",
"qty": 1,
"epcs": [
{
"epc": "CF00000000001FC00000000B"
}
],
"item_details": {
"id": 3243221,
"number": "000492",
"alu": "BOX87",
"name": "ROY ROYAL X",
"upc": 0,
"description": "ROY ROYAL X",
"style": "",
"colour": "",
"size": "MS",
"dcs": "",
"dnc": "",
"total_qty": 0,
"price": "84.00",
"cost_price": 84.0,
"picture_url": "",
"item_type_name": "Regular",
"sku": "0350295",
"custom_sku": "0350295",
"msrp": 45.66,
"retail_price": 84.99,
"epcs_count": 4,
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "000492 ROY ROYAL X",
"text2": "84.00",
"in_stock": 2
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
Orders are sales transactions that have a document id, newest first.
customer_nameis always empty. Each item'sepcslists all EPCs recorded on the order.
Post Audit Data
/api/v1/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"order_id": "1000",
"user": "api@senitron.net",
"user_name": "API User",
"audit_date": "09/21/2019 10:30",
"zone": {
"id": 4
},
"total_assets": 1,
"read_assets": 1,
"items": [
{
"item_number": "7630040511889",
"item_name": "On Cloud V2",
"expected_count": 1,
"read_count": 1,
"override": true,
"epcs": [
{
"epc": "FED1BC2076AD6600000002E1"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/audits" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"order_id": "1000",
"user": "api@senitron.net",
"user_name": "API User",
"audit_date": "09/21/2019 10:30",
"zone": {
"id": 4
},
"total_assets": 1,
"read_assets": 1,
"items": [
{
"item_number": "7630040511889",
"item_name": "On Cloud V2",
"expected_count": 1,
"read_count": 1,
"override": true,
"epcs": [
{
"epc": "FED1BC2076AD6600000002E1"
}
]
}
]
}'Success response
{
"message": "Received assets audit data are saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 400 | INVALID_DATE | Your audit date is invalid |
zone.id (a sub-zone id) is required; an unknown id causes a server error.
audit_date format:
MM/DD/YYYY HH:MM(24-hour) or ISO 8601.Every listed EPC is set to Sold (unknown EPCs are created first) and linked to the matching line of sales order order_id.
Validation failures return HTTP 400 as
{"errors": ["..."]}.If the tenant has a Post Audit Logs integration, the audit is also pushed to it.
Bills of Lading (BOLs)
Audit Bols Pallets
/api/v1/bols/pallets/auditRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
Request body
{
"location": "001",
"bol_number": "67566",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"datetime": "07/10/2026 02:30 PM",
"comment": "",
"pallets": [
{
"pallet_number": "1",
"items": [
{
"item_number": "26795",
"epcs": [
{
"epc": "9FE64000041A2AC000000915",
"last_seen": "07/10/2026 02:31 PM",
"rssi": "-48",
"carton_number": "00008879860015802314"
}
]
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/bols/pallets/audit" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"bol_number": "67566",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"datetime": "07/10/2026 02:30 PM",
"comment": "",
"pallets": [
{
"pallet_number": "1",
"items": [
{
"item_number": "26795",
"epcs": [
{
"epc": "9FE64000041A2AC000000915",
"last_seen": "07/10/2026 02:31 PM",
"rssi": "-48",
"carton_number": "00008879860015802314"
}
]
}
]
}
]
}'Success response
{
"message": "BOL pallets audit-data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Not Found | Could not find Bol with that number |
Replaces any previous audit of the same BOL.
epcs[].last_seen is required, in
MM/DD/YYYY hh:mm AM/PMformat.
Get Bols
/api/v1/bolsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
query | string | optional | Partial match on BOL number. |
carton | string | optional | Carton number; returns only the BOL that contains it (overrides query). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/bols?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"bols": [
{
"number": 11521,
"status": "Incomplete",
"last_updated": "10/13/2020 02:56 PM",
"pallets_count": 1,
"expected": {
"items": 3,
"assets": 60
},
"recorded": {
"items": 1,
"assets": 12
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Sorted by status, then number.
Get Bols Cartons
/api/v1/bols/cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
bol_number | string | required | BOL number. |
query | string | optional | Partial match on carton number. |
items | boolean | optional | Include each carton's items. |
items_details | boolean | optional | With items, add item_details to each item. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/bols/cartons?location=$LOCATION&bol_number=<bol_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"total_items_count": 1,
"total_assets_count": 1,
"cartons": [
{
"number": "00008879860012617423",
"expected_count": 1,
"items": [
{
"item_number": "176987",
"item_name": "Shirt",
"expected_count": 1,
"recorded_count": 1,
"item_details": {
"id": 103422154,
"number": "176987",
"name": "Shirt",
"upc": 0,
"alu": "",
"description": "Shirt",
"style": "C200",
"colour": "blue",
"size": "L",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 661249,
"name": "Nike"
}
],
"text1": "",
"text2": "",
"in_stock": 2
},
"epcs": [],
"pallets": [],
"cartons": []
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Not Found | Could not find Bol with that number |
In this endpoint each item's
epcs,palletsandcartonsarrays are always empty; use Get Bols Items for those.
Get Bols Item Pallets
/api/v1/bols/items/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
bol_number | string | required | BOL number. |
item_number | string | optional | Only pallets containing this item; also switches the response to item totals. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/bols/items/pallets?location=$LOCATION&bol_number=<bol_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"total_items_count": 10,
"total_assets_count": 54,
"pallets": [
{
"number": 1,
"build_date": "03/09/2026 11:18 PM",
"items_count": 10,
"assets_count": 54
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Not Found | Could not find Bol with that number |
GET /api/v1/bols/palletsandGET /api/v1/bols/items/palletsare the same endpoint.With item_number,
total_items_count/total_assets_countare replaced by that item'sexpected_countandrecorded_count:{"pagination": {…}, "expected_count": 8, "recorded_count": 32, "pallets": [ … ]}
Get Bols Items
/api/v1/bols/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
bol_number | string | required | BOL number. |
filter | string | optional | none (default), recorded, missing or over. |
pallet_number | string | optional | Only items on this pallet (0 = all). |
carton_number | string | optional | Only items in this carton. |
query | string | optional | Partial match on item number or description. |
items_details | boolean | optional | Add item_details. |
epcs | boolean | optional | Add recorded EPCs. |
pallets | boolean | optional | Add pallets. |
cartons | boolean | optional | Add cartons. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/bols/items?location=$LOCATION&bol_number=<bol_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"filter": "over",
"items": [
{
"item_number": "176987",
"item_name": "Shirt",
"expected_count": 1,
"recorded_count": 1,
"item_details": {
"id": 103422154,
"number": "176987",
"name": "Shirt",
"upc": 0,
"alu": "",
"description": "Shirt",
"style": "C200",
"colour": "blue",
"size": "L",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 661249,
"name": "Nike"
}
],
"text1": "",
"text2": "",
"in_stock": 2
},
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"last_seen": "03/09/2026 11:18 PM",
"rssi": 100,
"carton_number": "00008879860012617423",
"sent": true,
"audit": false
}
],
"pallets": [
{
"number": 1,
"build_date": "03/09/2026 11:18 PM",
"items_count": 10,
"assets_count": 54
}
],
"cartons": [
{
"number": "00008879860012617423",
"items_count": 1,
"assets_count": 1
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Not Found | Could not find Bol with that number |
item_detailsisnullunless items_details is true.epcs[].rssiis always 100.
Get Bols Masters
/api/v1/bols/mastersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
query | string | optional | Partial match on master BOL number. |
bols | boolean | optional | Include the BOLs of each master BOL. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/bols/masters?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"master_bols": [
{
"number": 4177,
"last_updated": "11/12/2020 05:05 PM",
"bols_count": 1,
"pallets_count": 0,
"expected": {
"items": 1,
"assets": 58
},
"recorded": {
"items": 0,
"assets": 0
},
"bols": [
{
"number": 11521,
"status": "Incomplete",
"last_updated": "10/13/2020 02:56 PM",
"pallets_count": 1,
"expected": {
"items": 3,
"assets": 60
},
"recorded": {
"items": 1,
"assets": 12
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Get Bols Pallets
/api/v1/bols/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
bol_number | string | required | BOL number. |
item_number | string | optional | Only pallets containing this item; also switches the response to item totals. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/bols/pallets?location=$LOCATION&bol_number=<bol_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"total_items_count": 10,
"total_assets_count": 54,
"pallets": [
{
"number": 1,
"build_date": "03/09/2026 11:18 PM",
"items_count": 10,
"assets_count": 54
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Not Found | Could not find Bol with that number |
GET /api/v1/bols/palletsandGET /api/v1/bols/items/palletsare the same endpoint.With item_number,
total_items_count/total_assets_countare replaced by that item'sexpected_countandrecorded_count:{"pagination": {…}, "expected_count": 8, "recorded_count": 32, "pallets": [ … ]}
Post Bols Pallets
/api/v1/bols/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
Request body
{
"location": "001",
"bol_number": "67566",
"pallet_number": "1",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"items": [
{
"item_number": "26795",
"epcs": [
{
"epc": "9FE64000041A2AC000000915",
"carton_number": "00008879860015802314",
"last_seen": "07/10/2026 02:30 PM"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/bols/pallets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"bol_number": "67566",
"pallet_number": "1",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"items": [
{
"item_number": "26795",
"epcs": [
{
"epc": "9FE64000041A2AC000000915",
"carton_number": "00008879860015802314",
"last_seen": "07/10/2026 02:30 PM"
}
]
}
]
}'Success response
{
"message": "BOL pallet data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Exceptions::BolNotFound | Bol with the number not found |
| 404 | Exceptions::PalletNotFound | Pallet with the number not found |
| 404 | Exceptions::BolItemNotFound | You should provide items to collect in a pallet |
| 404 | Exceptions::BolCartonNotFound | Bol Carton with the number not found |
| 404 | Exceptions::BolItemNotFound | Bol Item in the Carton not found |
Creates the pallet if it doesn't exist and assigns each EPC (and its carton) to it.
Without carton_number, the carton of the item's first BOL line is used.
Unknown EPCs are created with status Sold. The BOL status is recalculated (
completed/incomplete).Failures return HTTP 404 with the exception class (e.g.
Exceptions::BolNotFound) astype.
Post Master Bols
/api/v1/bols/masters/bolsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
Request body
{
"location": "001",
"master_bol_number": "4177",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"datetime": "07/10/2026 02:30 PM",
"bols": [
{
"bol_number": "67566"
},
{
"bol_number": "67567"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/bols/masters/bols" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"master_bol_number": "4177",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"datetime": "07/10/2026 02:30 PM",
"bols": [
{
"bol_number": "67566"
},
{
"bol_number": "67567"
}
]
}'Success response
{
"message": "The received BOL(s) added to the master BOL"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Exceptions::MasterBolNotFound | Master Bol not found |
| 404 | Exceptions::BolNotFound | Provide bols for adding to the master bol |
| 404 | Exceptions::BolNotFound | Bol not found |
Adds the listed BOLs to master BOL master_bol_number. Changes are all-or-nothing.
Failures return HTTP 404 with the exception class (e.g.
Exceptions::BolNotFound) astype.
Print Bols Pallets
/api/v1/bols/pallets/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
Request body
{
"location": "001",
"bol_number": "67566",
"pallet_number": "1",
"printer_id": 1,
"count": 2
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/bols/pallets/print" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"bol_number": "67566",
"pallet_number": "1",
"printer_id": 1,
"count": 2
}'Success response
{
"message": "BOL pallet label print in progress"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Exceptions::BolNotFound | Bol with the number not found |
| 404 | Exceptions::PalletNotFound | Pallet with the number not found |
count (default 1) is the number of label copies. Printing runs in the background.
Remove Bol
/api/v1/bols/masters/bolsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
master_bol_number | string | required | Master BOL number. |
bol_number | string | required | BOL to remove from it. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/bols/masters/bols?location=$LOCATION&master_bol_number=<master_bol_number>&bol_number=<bol_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "The received BOL removed from the master BOL"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Exceptions::MasterBolNotFound | Master Bol not found |
| 404 | Exceptions::BolNotFound | Bol not found |
Remove Pallet
/api/v1/bols/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (selects the tenant data set). |
bol_number | string | required | BOL number. |
pallet_number | string | required | Pallet to delete. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/bols/pallets?location=$LOCATION&bol_number=<bol_number>&pallet_number=<pallet_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "BOL pallet deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | Could not find Bol with that number |
| 404 | NOT_FOUND | Could not find Pallet with that number |
Unlinks all EPCs on the pallet from the BOL, deletes the pallet and recalculates the BOL status.
Catalog
Get Catalog Attributes
/api/v1/catalogs/attributesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
attribute | string | required | Catalog column title as configured in UI settings (case-insensitive), e.g. Size or Item Type. |
query | string | optional | Partial match on the value. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/catalogs/attributes?attribute=<attribute>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 3
},
"values": [
{
"value": "S"
},
{
"value": "M"
},
{
"value": "L"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | ERROR | The chosen field is not a good match |
Returns the distinct non-empty values of that catalog column, sorted.
Get Catalog Items Mappings
/api/v1/catalog/items/mappingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/catalog/items/mappings" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"items_mappings": [
{
"old_item_number": "210000047198",
"new_item_number": "310000047198",
"epc": "C000C30E4FA6C5E000000637",
"location_code": "001",
"location_name": "Floor-1"
},
{
"old_item_number": "210000000002",
"new_item_number": "9360905869838",
"epc": "",
"location_code": "",
"location_name": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns all item-number mappings for the tenant. The
locationparameter is not applied.
Get Catalogs Location Filtered Items
/api/v1/catalogs/location_filtered_itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Try it with curl
curl "https://app.senitron.net/api/v1/catalogs/location_filtered_items?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"exclude": false,
"catalog_items_count": 235384,
"items": [
"000000006630",
"000000006638"
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
Returns the catalog items allowed at the location, as whichever list is shorter:
exclude: false– items are the item numbers available at this location.exclude: true– items are the item numbers to hide; all others are available.When the handheld setting Enable catalog item location filter is off, returns
{"exclude": true, "catalog_items_count": 0, "items": []}(nothing filtered).
Check-Out / Check-In (COCI)
COCI: Delete a Transaction
/api/v1/coci/transactionsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
transaction_id | integer | required | Transaction id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/coci/transactions?location=$LOCATION&transaction_id=<transaction_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "Transaction deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TRANSACTION_NOT_FOUND | The transaction information does not exist in the system |
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Deletes the transaction and all of its items.
COCI: Get CheckIn Data
/api/v1/coci/checkinsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
customer_id | integer | optional | Only this customer's check-ins. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/api/v1/coci/checkins?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 1
},
"items": [
{
"item_number": "210000052983",
"serial_number": "345",
"item_name": "Sleeping Bag Mesh Sacks",
"epc": "FED0000000067A40000002F2",
"text1": "1243 - Sleeping Bag - A980",
"text2": "$120 - B45 - S",
"text3": "12 - A9",
"transaction_number": "23",
"transaction_datetime": "04/10/2024 10:48:10 AM",
"issue_type": "",
"note": "",
"parts": [
{
"name": "Cover",
"count": 2
},
{
"name": "Bag",
"count": 1
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
COCI: Get CheckOut Data
/api/v1/coci/checkoutsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
customer_id | integer | optional | Only this customer's check-outs. |
active_checkouts | boolean | optional | true = only items that are still checked out. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/api/v1/coci/checkouts?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 1
},
"items": [
{
"item_number": "210000052983",
"serial_number": "345",
"item_name": "Sleeping Bag Mesh Sacks",
"epc": "FED0000000067A40000002F2",
"text1": "1243 - Sleeping Bag - A980",
"text2": "$120 - B45 - S",
"text3": "12 - A9",
"transaction_number": "23",
"transaction_datetime": "04/10/2024 10:48:10 AM",
"issue_type": "",
"note": "",
"parts": [
{
"name": "Cover",
"count": 2
},
{
"name": "Bag",
"count": 1
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
COCI: Get List of Transactions
/api/v1/coci/transactionsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Search text (transaction id, customer, etc.). |
items | boolean | optional | true includes each transaction's items. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/coci/transactions?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transactions": [
{
"id": 1010,
"datetime": "04/29/24 11:44 AM",
"transaction_type": "checkout",
"customer_id": 1,
"customer_name": "Mary Garsia",
"items_count": 1,
"device_name": "HH-276",
"user": "API User",
"updated_at": "04/29/2024 11:45:22 AM",
"items": [
{
"item_number": "210000052983",
"serial_number": "345",
"item_name": "Sleeping Bag Mesh Sacks",
"epc": "FED0000000067A40000002F2",
"text1": "1243 - Sleeping Bag - A980",
"text2": "$120 - B45 - S",
"text3": "12 - A9",
"issue_type": "",
"note": "",
"parts": [
{
"name": "Cover",
"count": 2
},
{
"name": "Bag",
"count": 1
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Newest first.
datetimeusesMM/DD/YY hh:mm AM/PM;updated_atincludes seconds and a four-digit year.
COCI: Get List of Users&Customers
/api/v1/coci/customersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Exact match on id, first name, last name, company number, email or mobile. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/coci/customers?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"customers": [
{
"id": 206,
"company_number": "45006",
"first_name": "Mary",
"last_name": "Garsia",
"email": "mary.g@example.com",
"mobile": "+17474049801",
"rfid_number": "",
"enable": true,
"user": "API User",
"created_at": "03/04/2024 12:11:10 AM",
"updated_at": "03/04/2024 12:11:10 AM"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Newest first.
querymust match a field exactly.
COCI: Upload Transactions Data
/api/v1/coci/transactionsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"id": 6504190,
"location": "001",
"device_name": "HH-444",
"transaction_type": "checkout",
"customer_id": 43,
"items": [
{
"item_number": "210000052983",
"serial_number": "345",
"epc": "321AB45009E66F00236700FA",
"issue_type": "",
"note": ""
},
{
"item_number": "210000051477",
"serial_number": "346",
"epc": "321AB45009E66F00236700FB",
"issue_type": "",
"note": ""
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/coci/transactions" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": 6504190,
"location": "001",
"device_name": "HH-444",
"transaction_type": "checkout",
"customer_id": 43,
"items": [
{
"item_number": "210000052983",
"serial_number": "345",
"epc": "321AB45009E66F00236700FA",
"issue_type": "",
"note": ""
},
{
"item_number": "210000051477",
"serial_number": "346",
"epc": "321AB45009E66F00236700FB",
"issue_type": "",
"note": ""
}
]
}'Success response
{
"message": "CheckOut data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | CUSTOMER_NOT_FOUND | The customer information does not exist in the system |
| 422 | REQUEST_EXISTS | The information for this request has already been saved and is duplicate |
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
id is your request id, used to detect duplicates. transaction_type is
checkoutorcheckin.A notification email is sent for each saved transaction.
The duplicate check runs after saving, so a repeated id is still stored before
422 REQUEST_EXISTSis returned. Don't retry with the same id after a success.
EOS
Get EOS Transfer Order Data
/api/v1/eos/transfers/ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Source location code (also accepted as source_location or store_code). |
query | string | optional | Partial match on id, document number, reference number, or item fulfillment number (NetSuite item-fulfillment tenants). |
order_type | string | optional | TO or RTV. |
items | boolean | optional | Default true; false returns empty items arrays. |
items_details | boolean | optional | Add item_details to each item. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/eos/transfers/orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"transfers": [
{
"id": 185,
"order_type": "TO",
"document_number": "964801",
"reference_number": "TO0028815",
"eos_item_fulfillment_number": "",
"shipped_date": "26/2024 08:00 AM",
"source_location": "w1001",
"source_location_name": "Bullring Centre",
"destination_location": "s1005",
"destination_location_name": "UK Online Store",
"status": "Received",
"expected": {
"items_count": 400,
"assets_count": 1176
},
"sent": {
"items_count": 1,
"assets_count": 1
},
"received": {
"items_count": 1,
"assets_count": 1
},
"items": [
{
"item_number": "793275",
"expected_qty": 1,
"sent_qty": 0,
"received_qty": 0,
"line_number": 0,
"non_rfid_item": false,
"item_details": {
"id": 3240,
"number": "793275",
"name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"upc": 0,
"alu": "ROY-BOX87",
"description": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ P007104",
"style": "No",
"colour": "0.15",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "0",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"categories": [
{
"id": 1183550,
"name": "W1w"
},
{
"id": 1183552,
"name": "W2w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN, 814.99",
"in_stock": 3
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | the location 001 not found |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns transfers whose source is location, ordered by status, then newest first.
item_details.priceis the item's retail price formatted with two decimals;in_stockcounts the item's EPCs whose status is included in inventory.
EPCs & Tags
Assign EPC List to an Item
/api/v1/epcs/assignRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"item_number": "000000006638",
"epcs": [
{
"epc_id": "321AB45009E66F00236700FA",
"asset_id": "6633",
"alt_serial": "",
"first_seen": "02/21/2024 08:36 PM",
"last_seen": "02/21/2024 08:36 PM",
"handheld_reader": "HH-67",
"handheld_last_seen": "02/21/2024 08:36 PM",
"zone_id": 0
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/assign" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-444",
"item_number": "000000006638",
"epcs": [
{
"epc_id": "321AB45009E66F00236700FA",
"asset_id": "6633",
"alt_serial": "",
"first_seen": "02/21/2024 08:36 PM",
"last_seen": "02/21/2024 08:36 PM",
"handheld_reader": "HH-67",
"handheld_last_seen": "02/21/2024 08:36 PM",
"zone_id": 0
}
]
}'Success response
{
"message": "The tags received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_EXISTS | This item does not exist in the catalog |
| 404 | <exception class> | <exception message> |
Each EPC is created if new, assigned to item_number, and set to the handheld setting Inventory assign status (default Live).
epcs[].zone_id (optional sub-zone id) sets the tag's static zone and last-seen antenna.
Per-EPC fields read:
epc_id,asset_id,alt_serial,first_seen,last_seen,handheld_reader,handheld_last_seen,zone_id. Other asset fields are ignored.
Collect Assets by Tags Attributes
/api/v1/epcs/collect_tagsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-444",
"epcs": [
{
"epc": "FF199CEC01A61620000003D3",
"last_seen": "11/19/2021 10:54 AM",
"rssi": 80
},
{
"epc": "FF199CEC01A6162000000B91",
"last_seen": "11/20/2021 11:24 AM",
"rssi": 83
},
{
"epc": "FF199CEDD1A619B000000AAA",
"last_seen": "11/20/2021 08:09 AM",
"rssi": 72
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/collect_tags" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-444",
"epcs": [
{
"epc": "FF199CEC01A61620000003D3",
"last_seen": "11/19/2021 10:54 AM",
"rssi": 80
},
{
"epc": "FF199CEC01A6162000000B91",
"last_seen": "11/20/2021 11:24 AM",
"rssi": 83
},
{
"epc": "FF199CEDD1A619B000000AAA",
"last_seen": "11/20/2021 08:09 AM",
"rssi": 72
}
]
}'Success response
{
"labels": {
"attr1": "Room#",
"attr2": "Harvest Date",
"attr3": "Belongs To",
"attr4": "Tag Attribute 4",
"attr5": "Tag Attribute 5",
"attr6": "Tag Attribute 6",
"attr7": "Tag Attribute 7",
"attr8": "Tag Attribute 8",
"attr9": "Tag Attribute 9",
"attr10": "Tag Attribute 10"
},
"assets": [
{
"attr1": "100",
"attr2": "01/26/2022",
"attr3": "X",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"epcs": [
{
"epc": "FF199CEC01A61620000003D3",
"last_seen": "11/19/2021 10:54 AM",
"rssi": 80
},
{
"epc": "FF199CEC01A6162000000B91",
"last_seen": "11/20/2021 11:24 AM",
"rssi": 83
}
]
},
{
"attr1": "200",
"attr2": "01/26/2022",
"attr3": "Y",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"epcs": [
{
"epc": "FF199CEDD1A619B000000AAA",
"last_seen": "11/20/2021 08:09 AM",
"rssi": 72
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
Groups the scanned EPCs by their tag attributes (attr1–attr10). labels are the attribute titles from UI settings. EPCs not in Senitron are left out.
Collect Tags
/api/v1/epcs/collectRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-444",
"items_details": true,
"epcs": [
{
"epc": "FED0000000067980000002EF",
"last_seen": "11/19/2021 10:54 AM",
"rssi": 80
},
{
"epc": "FED0000000067A40000002F1",
"last_seen": "11/20/2021 11:24 AM",
"rssi": 83
},
{
"epc": "FFFF00000000000000000001",
"last_seen": "11/20/2021 11:25 AM",
"rssi": 60
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/collect" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-444",
"items_details": true,
"epcs": [
{
"epc": "FED0000000067980000002EF",
"last_seen": "11/19/2021 10:54 AM",
"rssi": 80
},
{
"epc": "FED0000000067A40000002F1",
"last_seen": "11/20/2021 11:24 AM",
"rssi": 83
},
{
"epc": "FFFF00000000000000000001",
"last_seen": "11/20/2021 11:25 AM",
"rssi": 60
}
]
}'Success response
{
"items": [
{
"item_number": "000000006630",
"item_name": "Pep & BB Imagination Run Wild Shortsleeve",
"item_details": {
"id": 597295804,
"number": "000000006630",
"name": "Pep & BB Imagination Run Wild Shortsleeve",
"upc": 0,
"alu": "",
"description": "Pep & BB Imagination Run Wild Shortsleeve",
"style": "C200",
"colour": "Blue",
"size": "Large",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "34.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"text1": "Pep & BB Imagination Run Wild Shortsleeve",
"text2": "Blue,Large,34.99",
"in_stock": 1
},
"epcs": [
{
"epc": "FED0000000067980000002EF",
"last_seen": "11/19/2021 10:54 AM",
"rssi": 80
},
{
"epc": "FED0000000067A40000002F1",
"last_seen": "11/20/2021 11:24 AM",
"rssi": 83
}
]
},
{
"item_number": "-1",
"item_name": "No Name",
"item_details": null,
"epcs": [
{
"epc": "FFFF00000000000000000001",
"last_seen": "11/20/2021 11:25 AM",
"rssi": 60
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
Groups the scanned EPCs by item. EPCs that are unknown or have no catalog item are returned under
item_number: "-1",item_name: "No Name".items_details must be the JSON boolean
trueto includeitem_details(otherwisenull).An unknown location falls back to the tenant's first location.
Create Marker Tags
/api/v1/epcs/markertagsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-444",
"marker_tags": [
{
"name": "101",
"epc": "FF1FF00003D08FC000000065",
"antenna": "10101",
"zone": {
"id": 10
}
},
{
"name": "102",
"epc": "FF1FF00003D08FC000000066",
"antenna": "10102",
"zone": {
"id": 11
}
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/markertags" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-444",
"marker_tags": [
{
"name": "101",
"epc": "FF1FF00003D08FC000000065",
"antenna": "10101",
"zone": {
"id": 10
}
},
{
"name": "102",
"epc": "FF1FF00003D08FC000000066",
"antenna": "10102",
"zone": {
"id": 11
}
}
]
}'Success response
{
"message": "The markers tags received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | INVALID | The marker tags is not present |
| 404 | INVALID | The Epc is not valid |
Creates or updates a marker tag per EPC. zone.id is the sub-zone id. EPCs must be 24 hex characters.
An unknown location falls back to the tenant's first location.
Encode EPC
/api/v1/epcs/encodeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"item_number": "000000006638",
"preserve_serial_number": false,
"epcs": [
{
"epc": "FED0000000067B80000002F2",
"tid": "FED0000000067B80000002F2"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/encode" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"item_number": "000000006638",
"preserve_serial_number": false,
"epcs": [
{
"epc": "FED0000000067B80000002F2",
"tid": "FED0000000067B80000002F2"
}
]
}'Success response
{
"epcs": [
{
"old_epc": "FED0000000067B80000002F2",
"new_epc": "FED0000000067B80000002F4",
"tid": "FED0000000067B80000002F2"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Item# is not found, in the Catalog. Please add to catalog and retry |
| 404 | NOT_FOUND | Your location is not found |
Returns a new EPC for each tag, built from the tenant's EPC settings (prefix, item number and next serial; SGTIN when configured). Write new_epc to the tag, then call Import EPC.
preserve_serial_number: truekeeps the serial number decoded from the old EPC instead of assigning the next one.
EPC Information
/api/v1/epcs/infoRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
epc | string | required | EPC. |
items_details | boolean | optional | true adds item_details. |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/info?location=$LOCATION&epc=<epc>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"item_number": "00492",
"serial_number": "342",
"epc": "FF1FFC393EA368B8C0E4755E",
"last_seen": "12/29/20 - 09:10 AM",
"last_zone": "Floor-1",
"last_antenna": "1",
"status": "Live",
"position_on_map": "https://app.senitron.net/<tenant-code>/001/epc_position/FF1FFC393EA368B8C0E4755E",
"item_details": {
"id": 48696466,
"number": "210000047060",
"name": "Classic Tee - Black / M",
"upc": 123456789012,
"alu": "CT-BLK-M",
"description": "Classic Tee - Black / M",
"style": "CT",
"colour": "Black",
"size": "M",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "19.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "Tops"
}
],
"text1": "210000047060 Classic Tee",
"text2": "Black M,19.99",
"in_stock": 0
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | The requested location not found. Please try again |
| 404 | EPC_NOT_FOUND | The requested EPC not found. Please try again |
last_seenuses the formatMM/DD/YY - hh:mm AM/PM.item_detailsisnullunless items_details is true.item_details.in_stockis currently always 0 in this endpoint.
Get EPC Categories
/api/v1/epcs/categoriesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
query | string | optional | Partial match on the category name or any parent category name. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 300. |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/categories" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 300,
"total_entries": 2
},
"categories": [
{
"id": -1,
"name": "All Categories"
},
{
"id": -2,
"name": "Un Assigned"
},
{
"id": 1408187,
"name": "Men's / Bikes / Adventure"
},
{
"id": 1408188,
"name": "Men's / Bikes"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
nameis the full category path. On page 1, the pseudo-categories All Categories (id -1) and Un Assigned (id -2) are added first when the user's role enables them.
Get EPC Statuses
/api/v1/epcs/statusesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/statuses" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"statuses": [
{
"id": 7582,
"name": "Live",
"include_inventory": true,
"system": true,
"activate_in_universal_permanent_status_registry": false,
"auto_add_to_universal_permanent_status_registry": false,
"auto_remove_from_universal_permanent_status_registry": false
},
{
"id": 7586,
"name": "Sold",
"include_inventory": false,
"system": true,
"activate_in_universal_permanent_status_registry": false,
"auto_add_to_universal_permanent_status_registry": false,
"auto_remove_from_universal_permanent_status_registry": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Returns the tenant's statuses sorted by name, excluding statuses hidden from asset details.
nameis the display name.
Get Whitelist EPC
/api/v1/epcs/whitelistRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
status | string | optional | Status name; default Sold. |
date | date | optional | Only tags updated on or after this date; default 6 months ago. |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/whitelist?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
[ "FED0000000067A40000002F1", "FED0000000067980000002EF", "FED0000000067B80000002F4" ]
Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
Returns a plain array of EPCs with the given status (default Sold) updated since date. Used by theft-detection readers to ignore sold items.
Import EPC
/api/v1/epcs/importRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"item_number": "000000006638",
"alt_serial": "",
"epcs": [
{
"old_epc": "FED0000000067B80000002F2",
"new_epc": "FED0000000067B80000002F4",
"tid": "FED0000000067B80000002F2"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/import" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"item_number": "000000006638",
"alt_serial": "",
"epcs": [
{
"old_epc": "FED0000000067B80000002F2",
"new_epc": "FED0000000067B80000002F4",
"tid": "FED0000000067B80000002F2"
}
]
}'Success response
{
"message": "Items are imported successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Item# is not found, in the Catalog. Please add to catalog and retry |
| 404 | NOT_FOUND | Your location is not found |
Adds each new_epc to inventory for item_number with status Live (call after writing the EPCs returned by Encode EPC).
When the location setting Re-encode kills old EPC tags is on, the tag with old_epc is set to Tag Killed.
Optional alt_serial is applied to every new tag.
Item Data
/api/v1/epcs/itemRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: taken from the URL). |
item_number | string | optional | Item number. Also matches ALU or SKU when the handheld setting item search using main catalog attributes is on. |
epc | string | optional | EPC or alt serial (used when item_number is not sent). |
show_epc | boolean | optional | Include the EPC list (epcs). |
show_all_epcs | boolean | optional | With epc: include all in-inventory EPCs of the same item. |
include_in_inventory | boolean | optional | With item_number: only EPCs whose status counts toward inventory. |
status | string | optional | With item_number: only EPCs with this status name. |
detail | boolean | optional | Add extra EPC fields and a ui_settings object. |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/item?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"item": {
"id": 6819981,
"number": "0000000000000127",
"name": "Arabian Cordura Saddle",
"upc": 0,
"alu": "000127",
"sku": "12794849",
"ean": "",
"description": "Arabian Cordura Saddle",
"style": "",
"colour": "BLACK 15.5 ARABIAN",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "814.9900",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN,814.99",
"in_stock": 1,
"epcs_count": 1,
"epcs": [
{
"id": 14131,
"epc_id": "CF00000000001FC00000000B",
"asset_id": "11",
"text3": "11/01/2019 01:56 PM,1000",
"first_seen": "11/01/2019 01:56 PM",
"last_seen": "11/01/2019 01:56 PM",
"last_seen_antenna": "1001",
"last_zone": "Floor-1",
"handheld_reader": "",
"alt_serial": "",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"handheld_last_seen": "",
"status": {
"id": 1045,
"name": "Pending Visibility"
},
"created_at": "11/01/2019 01:56 PM",
"updated_at": "11/01/2019 01:56 PM"
}
]
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Send item_number or epc.
If the item is not in the catalog,
item.idis-1anditem.nameisNot in Catalog(other text fields contain placeholder values).in_stockis the sum ofcurrent_unitsof the returned EPCs.
Items List
/api/v1/epcs/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code; falls back to the first location. |
query | string | optional | Space-separated words; each must partially match number, description, UPC, ALU, SKU, style, size, colour or manufacturer. |
item_number | string | optional | Exact item number. |
related_items | boolean | optional | With item_number: also return items whose SKU shares the same prefix (before -). |
show_epcs | boolean | optional | Include each item's in-inventory EPCs. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/items" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"items": [
{
"id": 6819981,
"number": "210000001433",
"name": "Arabian Cordura Saddle",
"upc": 0,
"alu": "000127",
"sku": "12794849",
"ean": "",
"description": "Arabian Cordura Saddle",
"style": "",
"colour": "BLACK 15.5 ARABIAN",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "814.9900",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN,814.99",
"in_stock": 1,
"epcs_count": 1,
"epcs": [
{
"id": 8,
"epc_id": "C000C30E4F9B999000000400",
"asset_id": "1024",
"item_number": "210000001433",
"last_seen": "08/20/25 01:51 PM",
"style": "",
"handheld_last_seen": "07/04/2025 03:08 PM",
"pallet_number": 0,
"case_number": 0,
"expiration_date": "",
"lot_number": "",
"attr1": "",
"attr2": "",
"attr3": "",
"text3": "Last Seen 08/20/2025 01:51 PM,HH-937 (HH)",
"first_seen": "11/18/24 05:40 PM",
"last_seen_antenna": "999901",
"last_zone": "Inside 101",
"handheld_reader": "HH-937",
"alt_serial": "",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"status": {
"id": 1000,
"name": "Live"
},
"created_at": "11/18/24 05:40 PM",
"updated_at": "08/20/25 01:51 PM"
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Sorted by item number. Without
queryanditem_number, all catalog items are returned (paginated).epcs_countandepcsinclude only EPCs whose status counts toward inventory.
Marker Tags EPCs
/api/v1/epcs/markertagsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code; falls back to the first location. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/epcs/markertags" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 45
},
"item_number": "2000002312240",
"tags": [
{
"id": 1,
"epc": "FF1FF0B7E15E748000000059",
"name": "3",
"antenna": "301",
"zone": {
"id": 10,
"name": "Zone1"
}
},
{
"id": 2,
"epc": "FF1FF0B7E15E7480000000BB",
"name": "4",
"antenna": "401",
"zone": {
"id": 11,
"name": "Zone2"
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Sorted by the numeric part of the marker name. item_number is the catalog item whose description is "marker tag" (empty if none).
Update EPC Status
/api/v1/epcs/status_updateRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request-Id | Optional idempotency key; a repeated value within 10 seconds returns 409 DUPLICATE_REQUEST. |
Request body
{
"location": "001",
"status_id": 7582,
"comment": "Changing status from handheld",
"device_name": "HH-444",
"zone": {
"id": 15
},
"add_to_universal_permanent_status_registry": false,
"remove_from_universal_permanent_status_registry": false,
"epcs": [
{
"epc": "FED0000000067B80000002F2"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/epcs/status_update" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Request-Id: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"status_id": 7582,
"comment": "Changing status from handheld",
"device_name": "HH-444",
"zone": {
"id": 15
},
"add_to_universal_permanent_status_registry": false,
"remove_from_universal_permanent_status_registry": false,
"epcs": [
{
"epc": "FED0000000067B80000002F2"
}
]
}'Success response
{
"epc_tags": [
{
"id": 3339,
"epc_id": "FED0000000067B80000002F2",
"asset_id": "754",
"status": {
"id": 7582,
"name": "Live"
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | STATUS_NOT_FOUND | The Status is not found |
| 404 | LOCATION_NOT_FOUND | The Store is not found. Please enter store code |
| 409 | DUPLICATE_REQUEST | A record with this request_id has already been processed |
Unknown EPCs are added to inventory first. zone.id (optional sub-zone) updates each tag's last-seen antenna, location and
handheld_reader.On theft-detection locations, the EPCs are added to or removed from the CDM whitelist depending on whether the new status counts toward inventory.
When enabled for the tenant, status changes are synced to NetSuite/Shopify inventory and to the Universal Permanent Status Registry (the two
*_universal_permanent_status_registryflags request this for statuses that allow it).
Geiger
Get Handheld Geiger Records
/api/v1/geigersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
uploaded | boolean | optional | true = only lists created by upload; false = only lists created on the handheld. |
assets | boolean | optional | false returns empty assets arrays. |
items_details | boolean | optional | true fills item_details (otherwise {}). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/geigers?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"geigers": [
{
"id": 3,
"name": "Geiger-List-1784658152",
"created_at": "07/21/2026 11:22 am",
"created_by_upload": true,
"summary": {
"skus": 1,
"assets": 1
},
"assets": [
{
"asset": {
"id": 3,
"item_number": "000000006638",
"serial_number": "756",
"epc": "FED0000000067B80000002F4",
"last_seen": "07/21/2026 10:39 am",
"last_zone": "",
"last_antenna": "1001",
"text3": "07/21/2026 10:39 AM,1001"
},
"item_details": {
"id": 597295847,
"number": "000000006638",
"name": "Pep & BB Miles and Mimosas Muscle",
"upc": 0,
"description": "Pep & BB Miles and Mimosas Muscle",
"style": "8803",
"colour": "Orange",
"size": "Large",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "34.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "Acc"
}
],
"text1": "Pep & BB Miles and Mimosas Muscle",
"text2": "Orange,Large,34.99",
"in_stock": 2,
"epcs_count": 3
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
Returns the open Geiger lists (no
geiger_dateyet) of the calling handheld, newest first. Times use lowercase am/pm.
Upload Geiger Inventory Data
/api/v1/geigersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"geiger_id": 54,
"geiger_name": "Geiger-List-1572453621",
"geiger_date": "09/21/2019 10:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-67",
"total_assets": 1,
"assets": [
{
"item_name": "RH TUBE NUTS 72/1oz MACS SEA SALT",
"item_number": "210000000002",
"serial_number": "5244",
"epc": "C000C30E4F9B402000001480",
"last_seen": "07/07/2026 07:15 AM",
"rssi": 90
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/geigers" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"geiger_id": 54,
"geiger_name": "Geiger-List-1572453621",
"geiger_date": "09/21/2019 10:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-67",
"total_assets": 1,
"assets": [
{
"item_name": "RH TUBE NUTS 72/1oz MACS SEA SALT",
"item_number": "210000000002",
"serial_number": "5244",
"epc": "C000C30E4F9B402000001480",
"last_seen": "07/07/2026 07:15 AM",
"rssi": 90
}
]
}'Success response
{
"message": "Received Geiger data are saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 404 | NOT_FOUND | The Geiger is not found. Please enter store code |
geiger_id: 0creates a new list; otherwise the existing list is updated (assets are matched by EPC).geiger_datedefaults to now.Each known tag's
last_seenis set to now.When the handheld setting Enable Geiger inventory update is on, unknown EPCs are added to inventory and tags whose status is not included in inventory are set back to Live.
Delete Geiger List
/api/v1/geigersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
geiger_id | integer | required | Geiger list id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/geigers?location=$LOCATION&geiger_id=<geiger_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"error": {
"message": "The Geiger list removed"
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Geiger list not found. |
| 400 | NOT_FOUND | Something went wrong, please try again later |
On success the confirmation is returned inside an
errorobject with HTTP 200 (as shown).
Get Geiger List Items
/api/v1/geigers/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
geiger_id | integer | required | Open Geiger list id of the calling handheld. |
items_details | boolean | optional | Fill item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/geigers/items?location=$LOCATION&geiger_id=<geiger_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"assets": [
{
"id": 3,
"item_number": "000000006638",
"serial_number": "756",
"epc": "FED0000000067B80000002F4",
"last_seen": "07/21/2026 10:39 am",
"last_zone": "",
"last_antenna": "1001",
"text3": "07/21/2026 10:39 AM,1001",
"item_details": {}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 404 | NOT_FOUND | The Geiger list not found. |
Pages through the assets of one open Geiger list of the calling handheld.
Inventory
Audit Inventory Requests
/api/v1/inventories/requests/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"request_number": "866375",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"start_scan_time": "07/29/2025 06:12 PM",
"end_scan_time": "07/29/2025 06:12 PM",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"override_user": "api@senitron.net",
"override_reason": "",
"items": [
{
"item_number": "210000000001",
"override": false,
"unwanted_new_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"serial_number": "",
"last_seen": "03/17/2025 07:15 AM",
"rssi": "90",
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"serial_number": "",
"last_seen": "03/17/2025 07:16 AM",
"rssi": "80",
"qty": 1
}
]
},
{
"item_number": "210000000002",
"override": false,
"unwanted_new_item": true,
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"serial_number": "",
"last_seen": "03/17/2025 07:14 AM",
"rssi": "86",
"qty": 1
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/requests/audits" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"request_number": "866375",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"start_scan_time": "07/29/2025 06:12 PM",
"end_scan_time": "07/29/2025 06:12 PM",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"override_user": "api@senitron.net",
"override_reason": "",
"items": [
{
"item_number": "210000000001",
"override": false,
"unwanted_new_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"serial_number": "",
"last_seen": "03/17/2025 07:15 AM",
"rssi": "90",
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"serial_number": "",
"last_seen": "03/17/2025 07:16 AM",
"rssi": "80",
"qty": 1
}
]
},
{
"item_number": "210000000002",
"override": false,
"unwanted_new_item": true,
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"serial_number": "",
"last_seen": "03/17/2025 07:14 AM",
"rssi": "86",
"qty": 1
}
]
}
]
}'Success response
{
"messages": "Inventory request audit information received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | REQUEST_NOT_FOUND | The request #866375 not found |
| 404 | HANDHELD_NOT_FOUND | Handheld not found |
| 404 | ITEMS_BLANK | The array of items is blank |
| 400 | ITEMS_NOT_MATCHED | None of the items were matched |
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
device_name must be the handheld name in the form
HH-<device id>(as returned by Register Device); the handheld is looked up by that id.Items not yet on the request are added. Each EPC is marked audited; its quantity is the tag's current units (or 1).
epcs[].last_seenusesMM/DD/YYYY hh:mm AM/PM.EPCs whose status is in the location's exception statuses are skipped.
override: true(request level) clears all previous audit results first;items[].overridedoes the same for one item.user(email) is recorded as the auditor;override_userandoverride_reasonare stored with a request-level override.The request becomes
completedwhen every item is complete, otherwisepending. Notification emails are sent, plus an exception email when configured thresholds are exceeded.
Create Inventory Request by Zone Filtering
/api/v1/inventories/requests/create_by_zonesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"request_number": "1000",
"request_name": "Zone Inside-5 sub-zone(s)",
"document_number": "",
"reference_number": "",
"note": "",
"device_name": "HH-53",
"zone_ids": "4,5,16"
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/requests/create_by_zones" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"request_number": "1000",
"request_name": "Zone Inside-5 sub-zone(s)",
"document_number": "",
"reference_number": "",
"note": "",
"device_name": "HH-53",
"zone_ids": "4,5,16"
}'Success response
{
"message": "Inventory request created and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | ZONES_BLANK | The array of zones is blank |
| 400 | PARENT_ZONE_NOT_FOUND | The parent zone for sub zone ID 4 not found |
| 400 | SUB_ZONES_NOT_FOUND | The sub zones 4, 5, 16 not found |
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
zone_ids is a comma-separated list of sub-zone ids; the first one determines the parent zone.
Expected items are the in-inventory tags last seen on the antennas of those sub-zones (exception statuses excluded).
request_number is optional (default: last request number + 1); an existing number is updated and items no longer in the zones are removed.
request_name defaults to
Zone <zone name> - <n> sub-zone(s). A notification email is sent.
Fix Invalid EPCs
/api/v1/inventories/fix_invalid_epcsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-435",
"epcs": [
{
"old_epc": "C000C30E4F9BA290000005B9",
"new_epc": "C000C30E4F9BA290000015B9"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/fix_invalid_epcs" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-435",
"epcs": [
{
"old_epc": "C000C30E4F9BA290000005B9",
"new_epc": "C000C30E4F9BA290000015B9"
}
]
}'Success response
{
"message": "The invalid tag(s) have been fixed in the inventory"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | INVALID_EPC | The invalid tag(s) C000C30E4F9BA290000015B are invalid |
| 404 | NOT_FOUND | The invalid tag(s) C000C30E4F9BA290000005B9 not found in the inventory |
| 400 | ERROR | <exception message> |
Replaces each old_epc with new_epc (must be 24 characters) and clears the pending fix stored in
attr10. Valid pairs are applied even when others fail; the error lists the EPCs that were skipped.Use with Get Invalid EPCs, which returns the pairs to fix.
Get Categories List
/api/v1/inventories/categoriesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Partial match on category name. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 30. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/categories?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 30,
"total_entries": 2
},
"categories": [
{
"id": 1,
"name": "Categories-1",
"senitron_total_qty": 1200,
"external_total_qty": 1200,
"last_validation": "06/25/2020 3:00 PM"
},
{
"id": 2,
"name": "Categories-2",
"senitron_total_qty": 490,
"external_total_qty": 500,
"last_validation": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
Sorted by name.
senitron_total_qtyis the in-inventory quantity in Senitron;external_total_qtyis the quantity imported from the external system (Lightspeed import);last_validationis the last Upload Inventory Validation Data time (hour without a leading zero).
Get Category Items
/api/v1/inventories/categories/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
category | string | required | Category name (exact). |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 30. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/categories/items?location=$LOCATION&category=<category>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 30,
"total_entries": 1
},
"items": [
{
"item_number": "210000052983",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"senitron_count": 2,
"external_count": 6,
"item_details": {
"id": 3243281,
"number": "210000052983",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"style": "",
"colour": "Hunter Green",
"size": "34",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "84.00",
"picture_url": "",
"item_type_name": "Regular",
"text1": "210000052983 Day 2.05 Cargo",
"text2": "Hunter Green 34",
"in_stock": 2,
"categories": [
{
"id": 381199,
"name": "E2"
}
]
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 404 | CATEGORY_NOT_FOUND | Category not found! |
external_countis the quantity read from the customer's external system;senitron_countis the in-inventory quantity in Senitron.
Get Filtered Inventory Assets
/api/v1/inventories/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (query string or body). |
items | boolean | optional | Default true; false returns an empty items array. |
items_details | boolean | optional | Add item_details. |
order | string | optional | item_number (default), name or epc (by last seen). |
order_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Request body
{
"location": "001",
"device_name": "HH-53",
"filters": [
{
"name": "Asset ID",
"values": [
{
"value": "2100000003243"
}
]
},
{
"name": "UPC",
"values": [
{
"value": 34300000434
},
{
"value": 77569000219
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/assets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-53",
"filters": [
{
"name": "Asset ID",
"values": [
{
"value": "2100000003243"
}
]
},
{
"name": "UPC",
"values": [
{
"value": 34300000434
},
{
"value": 77569000219
}
]
}
]
}'Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"summary": {
"skus": 1,
"assets": 1
},
"items": [
{
"item_number": "210000340543",
"item_name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"total_qty": 1,
"current_units": 1,
"storage_unit": 1,
"adjust_qty": 0,
"item_details": {
"id": 3243281,
"number": "210000340543",
"name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"upc": 0,
"alu": "ROY-BOX87",
"description": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"style": "-",
"colour": "-",
"size": "-",
"dcs": "-",
"dnc": false,
"total_qty": 0,
"price": "814.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"current_units": 1,
"storage_unit": 1.0,
"adjust_qty": 0,
"text1": "210000340543 ROY ROYAL",
"text2": "814.99",
"in_stock": 3
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
Returns one entry per matching in-inventory asset (tag), not per item.
filters[].name must match a catalog column title from UI settings (case-insensitive, e.g.
Asset ID,UPC,ALU,SKU,Color,Size); unmatched names are ignored. Values match exactly (case-insensitive); multiple values in one filter are OR-ed and filters are AND-ed.total_qtyin each entry is the total number of matching assets (same assummary.assets).
Get Filtered Inventory Items
/api/v1/inventories/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (query string or body). |
items | boolean | optional | Default true; false returns an empty items array. |
items_details | boolean | optional | Add item_details with quantities. |
in_stock | boolean | optional | Only items that have in-inventory tags. |
include_in_inventory | boolean | optional | Default true; which statuses count (statuses marked display in group always count). |
virtual_tag | boolean | optional | Count only virtual tags (alt serial virtual tag). |
zone_grouping | boolean | optional | Add a zones array with quantities per zone. |
operator | string | optional | or = match the first filter's first value against UPC/ALU/SKU/number. |
external_system | boolean | optional | Add the external system's (EOS) quantity to item_details. |
integration_type | string | optional | With external_system: lightspeed, shopify, netsuite, acumatica or vend (default: the tenant's integration). |
async_mode | boolean | optional | With external_system: run the quantity download in the background and return a job (see notes). |
job_id | string | optional | With async_mode: your own job id (generated if empty). |
device_id | string | optional | With async_mode: device id stored with the job. |
order | string | optional | item_number (default), name or epc (by last seen). |
order_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Request body
{
"location": "001",
"device_name": "HH-53",
"filters": [
{
"name": "Color",
"values": [
{
"value": "Red"
},
{
"value": "Green"
}
]
},
{
"name": "Size",
"values": [
{
"value": "XL"
},
{
"value": "M"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-53",
"filters": [
{
"name": "Color",
"values": [
{
"value": "Red"
},
{
"value": "Green"
}
]
},
{
"name": "Size",
"values": [
{
"value": "XL"
},
{
"value": "M"
}
]
}
]
}'Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"summary": {
"skus": 1,
"assets": 3,
"rfid_assets": 3,
"virtual_assets": 0
},
"items": [
{
"item_number": "210000340543",
"item_name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"item_details": {
"id": 3243281,
"number": "210000340543",
"name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"upc": 0,
"alu": "ROY-BOX87",
"description": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"style": "-",
"colour": "-",
"size": "-",
"dcs": "-",
"dnc": false,
"total_qty": 0,
"price": "814.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"current_units": 3,
"storage_unit": 3.0,
"adjust_qty": 0,
"text1": "210000340543 ROY ROYAL",
"text2": "814.99",
"in_stock": 3,
"epcs_count": 3,
"rfid_qty": 3,
"rfid_epcs_count": 3,
"virtual_qty": 0,
"virtual_epcs_count": 0,
"external_system_qty": 2,
"external_system_qty_last_update": "11/19/2021 02:45 PM",
"external_system_zone": null
},
"zones": [
{
"id": 5,
"name": "Events Shipping",
"in_stock": 3,
"epcs_count": 3
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
filters[].name must match a catalog column title from UI settings (case-insensitive, e.g.
Asset ID,UPC,ALU,SKU,Color,Size); unmatched names are ignored. Values match exactly (case-insensitive); multiple values in one filter are OR-ed and filters are AND-ed.The
external_system_*fields appear only withexternal_system=true;external_system_zoneis{"id", "name"}for Acumatica, otherwisenull.zonesappears only withzone_grouping=true.With
async_mode=true(andexternal_system=true) the call returns immediately with a job envelope and pushes progress over theEOS::Integration::EventChannelwebsocket:{"command": "message", "identifier": {"channel": "EOS::Integration::EventChannel", "tenant": "acme", "location": "acme_001", "job_id": "..."}, "data": {"type": "response", "eos": "lightspeed", "action": "download_quantity", "status": "initiated", "job_id": "...", "body": {"progress": 0, "total": 120, …}, "error": {}}}
Get Invalid EPCs
/api/v1/inventories/invalid_epcsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (or store_code). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/invalid_epcs?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"epcs": [
{
"item_number": "000000006633",
"old_epc": "FFFFFFFFFFAD6F490000020F",
"new_epc": "FFFFFFFFFFAD6F490000020F"
},
{
"item_number": "000000006633",
"old_epc": "FED0000000067A40000002F1",
"new_epc": "FED0000000067A40000002F1"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
Lists tags that have a pending replacement EPC (a 24-character value stored in
attr10); new_epc is the value to write to the tag before calling Fix Invalid EPCs.
Get Inventory Adjustments
/api/v1/inventories/reports/adjustmentsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
query | string | optional | Partial match on item number, reason, reason details or reference number. |
date_from | string | optional | MM/DD/YYYY or YYYY-MM-DD, in the location's time zone. |
date_to | string | optional | MM/DD/YYYY or YYYY-MM-DD (inclusive). |
items_details | boolean | optional | Add item_details. |
assets | boolean | optional | Add the affected assets. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/reports/adjustments?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"adjustments": [
{
"datetime": "06/10/2026 11:40 AM",
"item_number": "006039",
"qty": 21,
"new_qty": 646,
"uom": "EA",
"reason": "Web",
"reason_details": "Print Tag",
"reference_number": "ADJ-2026-06-10-0001",
"user": "API User",
"item_details": {
"id": 195969321,
"number": "006039",
"upc": 0,
"alu": "PRP-124800",
"sku": "SPH-100400",
"ean": "",
"custom_sku": "491-800-005",
"description": "Water purification Cartridge - Red (empty units)",
"short_description": "Water purification Cartridge - Red (empty units)",
"style": "",
"color": "",
"size": "",
"type": "Regular",
"manufacturer": "",
"vendor_id": "V-1279",
"vendor_name": "Las Water Company, Ltd",
"price": 84.0,
"retail_price": 84.99,
"msrp": 45.66,
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"uom": "EA",
"buom": "EA",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"attr11": "",
"attr12": "",
"attr13": "",
"attr14": "",
"attr15": "",
"attr16": "",
"attr17": "",
"attr18": "",
"attr19": "",
"attr20": "",
"attr21": "",
"attr22": "",
"created_at": "12/18/2024 20:20 PM",
"updated_at": "05/07/2026 15:20 PM"
},
"assets": [
{
"serial_number": "86799",
"alt_serial": "",
"epc": "C60001E0000000000001530F",
"qty": 21,
"status": {
"id": 6940,
"name": "Live"
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Newest first.
datetimeis in the location's time zone.item_details.created_at/updated_atuseMM/DD/YYYY hh:mm AM/PM.
Get Inventory Discrepancies
/api/v1/inventories/discrepanciesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/discrepancies?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 7
},
"discrepancies": [
{
"identifier": "MATCH",
"name": "[Not Implemented] Matching with RFID",
"total_qty": 0,
"sku_count": 0,
"price": 0
},
{
"identifier": "DISCREPANCY",
"name": "Discrepancy between RFID & Ext.",
"total_qty": 10,
"sku_count": 1,
"price": 0
},
{
"identifier": "IMPORT",
"name": "RFID has, are not in Import",
"total_qty": 0,
"sku_count": 1106,
"price": 0
},
{
"identifier": "MORE_DISCREPANCY",
"name": "RFID has more than Ext.",
"total_qty": 10,
"sku_count": 1,
"price": 0
},
{
"identifier": "LESS_DISCREPANCY",
"name": "RFID has less than Ext.",
"total_qty": 0,
"sku_count": 0,
"price": 0
},
{
"identifier": "THEFT_DETECTION",
"name": "[Not Implemented] RFID is Correct on due to Theft Reader Detection",
"total_qty": 0,
"sku_count": 0,
"price": 0
},
{
"identifier": "NOT_TAGGED",
"name": "[Not Implemented] Not Tagged (ignored)",
"total_qty": 0,
"sku_count": 0,
"price": 0
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown location (HTTP 404, no error body) |
Compares Senitron quantities with the last external-system import (Compare page) and always returns these seven groups;
paginationis fixed. Use anidentifierwith Get Inventory Discrepancy Details.Each call recalculates the differences first.
Get Inventory Discrepancy Details
/api/v1/inventories/discrepancyRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
identifier | string | required | DISCREPANCY, IMPORT, MORE_DISCREPANCY or LESS_DISCREPANCY. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 30. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/discrepancy?location=$LOCATION&identifier=<identifier>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 30,
"total_entries": 1
},
"items": [
{
"item_number": "210000010155",
"name": "Makobi Ferrari Sequins Tee White/Gold XL",
"external_count": 30,
"senitron_count": 0,
"price": 0.0,
"retail_price": 39.99,
"msrp": 69.0,
"item_details": {
"id": 219710155,
"number": "210000010155",
"name": "Makobi Ferrari Sequins Tee White/Gold XL",
"upc": 0,
"alu": "",
"description": "Makobi Ferrari Sequins Tee White/Gold XL",
"style": "",
"colour": "White/Gold",
"size": "XL",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "0.0",
"retail_price": "39.99",
"msrp": "69.0",
"picture_url": "",
"item_type_name": "Regular",
"categories": [],
"text1": "",
"text2": "",
"in_stock": 0
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | IDENTIFIER_NOT_FOUND | Discrepancy Identifier not found. Please try again |
| 404 | — | Unknown location (HTTP 404, no error body) |
For
IMPORT, items are catalog items with RFID tags that are missing from the import (external_countis 0).
Get Inventory Settings
/api/v1/inventories/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (or store_code). |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/settings?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"standard": "SENITRON",
"filter_by_prefix": true,
"unique_epcs": true,
"item_number_padding": 12,
"stack_epcs": true,
"item_upc_barcode_type": "GTIN-12",
"last_encoded_serial": 761,
"epc_length": 24,
"prefixes": [
{
"default": true,
"enabled": true,
"standard": "SENITRON",
"profile_name": "None GS1",
"prefix": "FED",
"item_start_bit": 12,
"item_number_bit": 46,
"item_prefix_start_bit": 0,
"item_prefix_number_bit": 0,
"item_number_padding": 12,
"item_number_middle_padding": 0,
"item_prefix_status": false,
"serial_number_start_bit": 58,
"serial_number_no_of_bits": 38,
"epc_write_prefix": "111111101101",
"discover_item_number_directly_as_hex": false,
"location_restriction": []
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
Returns the tenant's EPC encoding settings: one entry in prefixes per prefix of each enabled EPC profile.
stack_epcsis returned inverted from the web setting (true when stacking is disabled there).location_restrictionlists the locations (code,name) the profile is limited to; empty means all locations.
Get Inventory Types
/api/v1/inventories/typesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Partial match on the type name (sorts by name). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/types?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 2
},
"item_types": [
{
"id": 1201,
"name": "Regular",
"item_count": 235383
},
{
"id": 1202,
"name": "Accessories",
"item_count": 23453
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
Get Inventory Uploads List
/api/v1/inventories/reports/uploadsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
status | string | optional | pending, scheduled, completed or canceled. |
created_at | date | optional | MM/DD/YYYY; uploads created on that day. |
user_name | string | optional | Partial match on user name. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/reports/uploads?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"summary": {
"skus": 1,
"assets": 2,
"total_qty": 17
},
"uploads": [
{
"id": 1,
"datetime": "11/20/2020 01:10 PM",
"start_time": "01:14 PM",
"end_time": "01:16 PM",
"user": "api@senitron.net",
"user_name": "API User",
"type": "inventory",
"status": "completed",
"progress": 100,
"override_by_zone": false,
"override_by_category": false,
"manufacturer": "",
"override_quantity_by_manufacturer": false,
"total_read": 20,
"total_added": 15,
"total_updated": 5,
"total_removed": 0,
"reader": "HH-53"
},
{
"id": 2,
"datetime": "11/22/2020 08:10 AM",
"start_time": "08:14 AM",
"end_time": "08:20 AM",
"user": "api@senitron.net",
"user_name": "API User",
"type": "inventory",
"status": "scheduled",
"progress": 35,
"override_by_zone": false,
"override_by_category": false,
"manufacturer": "",
"override_quantity_by_manufacturer": false,
"total_read": 200,
"total_added": 110,
"total_updated": 80,
"total_removed": 5,
"reader": "HH-53"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
Newest first, times in the location's time zone. summary counts the location's current inventory (statuses included in inventory or displayed in group);
total_qtysums units when storage units are enabled.Use the upload
idasprocess_idin Request an Action on Inventory Upload Files.
Get List of inventory requests
/api/v1/inventories/requestsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
request_number | string | optional | Exact request number. |
query | string | optional | Partial match on id, request number, title, note, document number or reference number. |
items | boolean | optional | Default true; false returns empty items arrays. |
show_epc | boolean | optional | Include each item's EPCs. |
items_details | boolean | optional | Add item_details to each item. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/requests?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 1,
"total_entries": 1
},
"requests": [
{
"id": 9,
"number": "2003",
"name": "Sample Request 2003",
"status": "created",
"note": "",
"document_number": "",
"reference_number": "",
"user_name": "API User",
"created_at": "12/04/2023 10:20 AM",
"updated_at": "12/04/2023 01:34 PM",
"override_user": "API User",
"override_reason": "",
"overrided_at": "",
"discarded_at": "",
"expected": {
"skus": 2,
"assets": 10
},
"read": {
"skus": 1,
"assets": 1
},
"audited": {
"skus": 0,
"assets": 0
},
"items": [
{
"item_number": "210000000042",
"unwanted_new_item": true,
"expected_qty": 5,
"read_qty": 0,
"audited_qty": 0,
"epcs": [
{
"epc": "CF19930E4F9B8B900000041E",
"serial_number": "1054",
"qty": 1,
"audited": false,
"handheld": "HH-305",
"user_name": "API User",
"last_seen": "03/14/2023 10:45 PM"
}
],
"item_details": {
"id": 219715723,
"number": "210000000042",
"name": "CUTTER BUCK M OUTER-LS 135 - S -",
"upc": 0,
"alu": "",
"sku": "",
"custom_sku": "07FLCB135",
"description": "CUTTER BUCK M OUTER-LS 135 - S -",
"style": "",
"color": "",
"retail_price": "135.00",
"cost_price": "46.84",
"msrp": "0",
"size": "",
"dcs": "",
"dnc": false,
"epcs_count": 0,
"price": "46.840",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "CUTTER AND BUCK",
"manufacturer": "CUTTER AND BUCK",
"categories": [
{
"id": 1183550,
"name": "07 Mens Outerwear"
},
{
"id": 1183552,
"name": "Mens Fashion Outer Ls"
}
],
"text1": "210000000042 CUTTER BUCK M OUTER-LS 135 - S-",
"text2": "",
"in_stock": 0,
"total_qty": 0,
"uom": [],
"uoms": []
}
},
{
"item_number": "210000000112",
"unwanted_new_item": false,
"expected_qty": 5,
"read_qty": 0,
"audited_qty": 0,
"epcs": [],
"item_details": {
"id": 219715793,
"number": "210000000112",
"name": "POLO M OUTER-VEST 170 - M -",
"upc": 0,
"alu": "",
"sku": "",
"custom_sku": "07FVPO170",
"description": "POLO M OUTER-VEST 170 - M -",
"style": "",
"color": "",
"retail_price": "170.00",
"cost_price": "62.10",
"msrp": "0",
"size": "",
"dcs": "",
"dnc": false,
"epcs_count": 0,
"price": "62.10",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/2.jpg",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "POLO RL",
"manufacturer": "POLO RL",
"categories": [
{
"id": 1183550,
"name": "07 Mens Outerwear"
},
{
"id": 1183551,
"name": "Mens Fashion Outer Vest"
}
],
"text1": "210000000112 POLO M OUTER-VEST 170 - M -",
"text2": "",
"in_stock": 0,
"total_qty": 0,
"uom": [],
"uoms": []
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Newest first.
Inventory Items Assets by Filter
/api/v1/inventories/items/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
include_in_inventory | boolean | optional | true = only tags whose status counts toward inventory. |
in_stock | boolean | optional | true = only items that have in-inventory tags. |
order | string | optional | item_number (default) or name. |
order_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1 (pages of items). |
per_page | integer | optional | Default 10. |
Request body
{
"location": "001",
"filters": [
{
"name": "Asset ID",
"values": [
{
"value": "210000045065"
},
{
"value": "210000027611"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/items/assets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"filters": [
{
"name": "Asset ID",
"values": [
{
"value": "210000045065"
},
{
"value": "210000027611"
}
]
}
]
}'Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"summary": {
"skus": 2,
"tags_count": 2,
"assets": 16
},
"items": [
{
"item_number": "210000045065",
"assets": [
{
"serial_number": "123",
"epc": "CF19930E4FA6BD4000000432",
"qty": 6,
"status": {
"id": 1000,
"name": "Live"
}
},
{
"serial_number": "234",
"epc": "CF19930E4FA6BD4000000432",
"qty": 10,
"status": {
"id": 1000,
"name": "Live"
}
}
]
},
{
"item_number": "210000027611",
"assets": []
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Filters select catalog items; each item lists its tags. Filter names are catalog column titles from UI settings plus the built-in
Asset ID(item number, padding added automatically),ALU,UPCandSKU. Values match exactly (case-insensitive).summary:
skus= matching items,tags_count= their tags,assets= sum of tag units.
Post Inventory Requests Items Scans
/api/v1/inventories/requests/scansRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-444",
"request_number": "6504190",
"override_quantity": true,
"update_eos": true,
"items": [
{
"item_number": "210000052983",
"epcs": [
{
"epc": "FED1BC2076AD6440000002DE",
"serial_number": "734",
"last_seen": "12/22/2023 09:10 AM",
"rssi": 44
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/requests/scans" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-444",
"request_number": "6504190",
"override_quantity": true,
"update_eos": true,
"items": [
{
"item_number": "210000052983",
"epcs": [
{
"epc": "FED1BC2076AD6440000002DE",
"serial_number": "734",
"last_seen": "12/22/2023 09:10 AM",
"rssi": 44
}
]
}
]
}'Success response
{
"messages": "The request scan data received successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | REQUEST_NOT_FOUND | The request #6504190 not found |
| 404 | HANDHELD_NOT_FOUND | Handheld not found |
| 404 | ITEMS_BLANK | The array of items is blank |
| 400 | ITEMS_NOT_MATCHED | None of the items were matched |
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
device_name must be the handheld name in the form
HH-<device id>(as returned by Register Device); the handheld is looked up by that id.Only items already on the request are updated;
read_qtybecomes the number of scanned EPCs.override_quantity: when present (any value), previous scans of each item are replaced. Omit it to append.
update_eos: sends the request's quantities to the configured external system (EOS) and marks the request
completed.
Request a action on inventory upload files
/api/v1/inventories/reports/uploads/actionRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"process_id": 10,
"action_type": "cancel",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/reports/uploads/action" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"process_id": 10,
"action_type": "cancel",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}'Success response
{
"message": "The requested action accepted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 404 | — | Unknown process_id (HTTP 404, no error body) |
action_type:
cancel– cancels a pending upload.undo– restores the tags changed by the upload and deletes tags it created.reprocess– queues the same upload data again as a new upload.
Any other value is accepted but does nothing.
Return The Inventory Uploads
/api/v1/inventories/uploadsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/uploads?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 2,
"total_entries": 143
},
"today_cyclecount_count": 1,
"today_full_cyclecount_count": 1,
"uploads": [
{
"type": "full-cyclecount",
"module": "",
"datetime": "03/23/2026 10:02:15 AM",
"user": "API User",
"device_name": "HH-777",
"read_tags": 45,
"read_unique_tags": 10,
"processing_time": 12,
"status": "Imported"
},
{
"type": "cyclecount",
"module": "",
"datetime": "03/22/2026 05:02:40 PM",
"user": "API User",
"device_name": "HH-564",
"read_tags": 39,
"read_unique_tags": 11,
"processing_time": 5,
"status": "Imported"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
Lists V2-processed inventory uploads, newest first.
typeisfull-cyclecountwhen the upload overrode quantities by category, zone and manufacturer; otherwisecyclecount.processing_timeis in seconds.statusisImportedonce processed, otherwise the upload status (e.g.Pending).datetimeincludes seconds.
Save Inventory Settings
/api/v1/inventories/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"last_encoded_serial": 1029
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/settings" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"last_encoded_serial": 1029
}'Success response
{
"message": "Inventory settings received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
Only last_encoded_serial is saved (tenant-wide). The change is recorded in the event log with
useranddevice_name.
Sync Inventory Items to External System
/api/v1/inventories/items/sync_esRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"device_name": "HH-53",
"integration_type": "lightspeed",
"sync_field_name": "Asset ID",
"email_notification": true,
"zone": {
"id": 45,
"name": "HH-367"
},
"items": [
{
"item_number": "210000340543",
"senitron_qty": 4,
"external_system_qty": 2,
"discrepancy_qty": 2
},
{
"item_number": "210000000001",
"senitron_qty": 3,
"external_system_qty": 4,
"discrepancy_qty": 1
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/items/sync_es" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-53",
"integration_type": "lightspeed",
"sync_field_name": "Asset ID",
"email_notification": true,
"zone": {
"id": 45,
"name": "HH-367"
},
"items": [
{
"item_number": "210000340543",
"senitron_qty": 4,
"external_system_qty": 2,
"discrepancy_qty": 2
},
{
"item_number": "210000000001",
"senitron_qty": 3,
"external_system_qty": 4,
"discrepancy_qty": 1
}
]
}'Success response
{
"message": "The item(s) will sync to the external system."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 404 | ITEM_NOT_FOUND | The items not set |
| 404 | ITEM_NOT_FOUND | The item(s) not found. [210000002301] |
| 404 | INTEGRATION_NOT_FOUND | The integration not found |
| 404 | INTEGRATION_NOT_FOUND | The integration type xyz not found |
| 404 | INTEGRATION_FAILED | Another sync is in progress |
| 422 | SYNC_NOT_ENABLED | Sync to NetSuite is not enabled |
Pushes the Senitron quantities (
senitron_qty) of the listed items to the external system in the background.integration_type (case-insensitive):
lightspeed,shopify,vend,netsuite,heartland,odoo,quickbookoracumatica. The integration must be enabled for the tenant.sync_field_name:
Asset ID(item number, default) orUPC— which catalog fielditems[].item_numbercontains. Every item must exist.zone.name is used by Acumatica only.
email_notification: truesends a summary email to the user.When the handheld setting Override sync EOS is on, nothing is pushed: the Compare-page import table is replaced with these items and the response is
{"message": "The item(s) were added"}. Items flagged non-RFID are skipped when the location excludes them from sync.
Upload Inventory Validation Data
/api/v1/inventories/validationRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"datetime": "06/26/2020 8:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"category": "E2",
"reason_code": "01",
"comment": "This is a test comment",
"override_quantity_by_category": true,
"zone": {
"id": 1,
"name": "Building 1 Staging"
},
"items": [
{
"item_number": "210000052983",
"item_name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"external_count": 6,
"senitron_count": 2,
"read_count": 6,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "02/26/2019 07:56 AM",
"rssi": 85
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "02/26/2019 08:16 AM",
"rssi": 90
}
]
},
{
"item_number": "210000051477",
"item_name": "Savannah Long Leather Tunic in Stone 42",
"external_count": 1,
"senitron_count": 0,
"read_count": 1,
"epcs": [
{
"epc": "321AB45009E66F00236700FA",
"last_seen": "02/26/2020 09:56 AM",
"rssi": 82
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/validation" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 8:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"category": "E2",
"reason_code": "01",
"comment": "This is a test comment",
"override_quantity_by_category": true,
"zone": {
"id": 1,
"name": "Building 1 Staging"
},
"items": [
{
"item_number": "210000052983",
"item_name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"external_count": 6,
"senitron_count": 2,
"read_count": 6,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "02/26/2019 07:56 AM",
"rssi": 85
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "02/26/2019 08:16 AM",
"rssi": 90
}
]
},
{
"item_number": "210000051477",
"item_name": "Savannah Long Leather Tunic in Stone 42",
"external_count": 1,
"senitron_count": 0,
"read_count": 1,
"epcs": [
{
"epc": "321AB45009E66F00236700FA",
"last_seen": "02/26/2020 09:56 AM",
"rssi": 82
}
]
}
]
}'Success response
{
"message": "Inventory validation data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 422 | EMPTY | The list of items is empty! |
category must be an existing category name; an unknown name returns HTTP 404 without an error body.
Saves a validation record (shown as
last_validationin Get Categories List) and queues an inventory upload of the scanned EPCs, processed in the background.override_quantity_by_categorydefaults to true: tags of the category that were not scanned are treated as missing.datetimeformat:MM/DD/YYYY hh:mm AM/PM(ISO 8601 also accepted).
Upload Shelf-Tags
/api/v1/inventories/containertagsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"datetime": "09/26/2021 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-78",
"tags": [
{
"item_number": "230005343",
"serial_number": "",
"alt_serial": "",
"epc": "",
"qty": 12,
"adjust_qty": 3,
"update_external_system": true
},
{
"item_number": "230009820",
"serial_number": "102",
"alt_serial": "virtual tag",
"epc": "FF1FF00003D08FC0055000F3",
"qty": 5,
"adjust_qty": -2,
"update_external_system": false
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/containertags" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "09/26/2021 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-78",
"tags": [
{
"item_number": "230005343",
"serial_number": "",
"alt_serial": "",
"epc": "",
"qty": 12,
"adjust_qty": 3,
"update_external_system": true
},
{
"item_number": "230009820",
"serial_number": "102",
"alt_serial": "virtual tag",
"epc": "FF1FF00003D08FC0055000F3",
"qty": 5,
"adjust_qty": -2,
"update_external_system": false
}
]
}'Success response
{
"message": "The container tags received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message or Lightspeed/NetSuite push results> |
Each tag is matched (and created if missing) by epc, else serial_number, else alt_serial — always together with item_number — and set to Live with
current_units/storage_unit= qty. A missing EPC is generated from the item number and serial.Any non-empty alt_serial is stored as
virtual tag. Always sendalt_serial(use""when none); omitting it causes an error.When
user(email) is a known user and bothqtyandadjust_qtyare sent, an external-system inventory adjustment is recorded.update_external_system: truepushes qty to Lightspeed, or adjust_qty to NetSuite; push errors return HTTP 400 with the push results.
Upload The Inventory Data
/api/v1/inventories/uploadRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"id": 86877,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-67",
"module_name": "Inventory",
"comment": "Cycle count sales floor",
"zone": {
"id": 1,
"name": "Building 1 Staging"
},
"categories": [
{
"id": 376519,
"name": "cat1"
}
],
"manufacturer": "",
"unique_epc": true,
"append_to_last_session": true,
"override_quantity": false,
"override_quantity_by_zone": false,
"override_quantity_by_category": true,
"override_quantity_by_manufacturer": true,
"segment_count": 0,
"segment_number": 0,
"items": [
{
"epc": "CF00000216C84C400000000D",
"datetime": "2020-01-16T20:06:18-08:00",
"zone_name": "Building 1 Staging"
},
{
"epc": "CF00000216C84C800000000D",
"datetime": "2020-01-16T20:06:18-08:00",
"zone_name": "Building 1 Staging"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/inventories/upload" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"id": 86877,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-67",
"module_name": "Inventory",
"comment": "Cycle count sales floor",
"zone": {
"id": 1,
"name": "Building 1 Staging"
},
"categories": [
{
"id": 376519,
"name": "cat1"
}
],
"manufacturer": "",
"unique_epc": true,
"append_to_last_session": true,
"override_quantity": false,
"override_quantity_by_zone": false,
"override_quantity_by_category": true,
"override_quantity_by_manufacturer": true,
"segment_count": 0,
"segment_number": 0,
"items": [
{
"epc": "CF00000216C84C400000000D",
"datetime": "2020-01-16T20:06:18-08:00",
"zone_name": "Building 1 Staging"
},
{
"epc": "CF00000216C84C800000000D",
"datetime": "2020-01-16T20:06:18-08:00",
"zone_name": "Building 1 Staging"
}
]
}'Success response
{
"message": "All EPCs are saved in inventory",
"inventory_log_id": 123
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 403 | NOT_ACCESS | The handheld doesn't access to the store |
| 400 | ERROR | <exception message> |
The upload is stored and processed in the background (V2 processor); follow it with Return the Inventory Uploads or Get Inventory Uploads List. inventory_log_id identifies the upload.
The calling handheld must be assigned to location.
override_quantity_by_zone / _by_category / _by_manufacturer: tags in that zone / category / manufacturer that were not scanned are treated as missing. Sending all four
override_*flags as true is a full cycle count.Large uploads can be split: send the same id with
segment_count= total parts andsegment_number= 1…n. Parts are combined and processed after the last one arrives. Omitsegment_count(or send 0) for a single upload.When the tenant does not use unique EPCs and the first EPC is not a marker tag, the first marker tag is inserted automatically one second before the first read.
Zones List
/api/v1/inventories/zonesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
query | string | optional | Partial match on zone or sub-zone name. |
nested | boolean | optional | true returns zones with their sub_zones (see notes). |
filtered_zone_ids | string | optional | Comma-separated parent zone ids. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default: all rows. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/zones?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"total_entities": 5,
"pagination": {
"current_page": 1,
"per_page": 5,
"total_entries": 5
},
"zones": [
{
"id": 3,
"name": "Annex Back Stock",
"order": 1
},
{
"id": 1,
"name": "Inside 1st Floor",
"order": 2
},
{
"id": 2,
"name": "Inside 2nd Floor",
"order": 3
},
{
"id": 4,
"name": "Inside Front Doors",
"order": 3
},
{
"id": 5,
"name": "Temp April Booth",
"order": 4
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns sub-zones visible on handhelds, sorted by display name (
<zone> <sub-zone>). When Display zones with physical readers is on, only sub-zones that have non-POS reader antennas are listed.With
nested=true:{"total_entities": 2, "pagination": {…}, "zones": [{"id": 1, "name": "Inside", "order": 1, "sub_zones": [{"id": 4, "name": "101", "order": 1}]}]}
Get Brands (Manufacturers)
/api/v1/inventories/brandsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Partial match on manufacturer. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/brands?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"brands": [
{
"name": "Adidas"
},
{
"name": "Hoka"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
Distinct non-empty catalog manufacturers, sorted.
Get Item Type Items
/api/v1/inventories/types/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
id | integer | required | Item type id (from Get Inventory Types). |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/api/v1/inventories/types/items?location=$LOCATION&id=<id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 1
},
"items": [
{
"item_number": "210000047060",
"type_id": 1201,
"name": "Classic Tee",
"senitron_count": 3,
"external_count": 4,
"item_details": {
"id": 48696466,
"number": "210000047060",
"name": "Classic Tee",
"upc": 0,
"alu": "CT-BLK-M",
"description": "Classic Tee",
"style": "CT",
"colour": "Black",
"size": "M",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "19.99",
"picture_url": "",
"item_type_name": "Regular",
"text1": "210000047060 Classic Tee",
"text2": "Black M",
"in_stock": 3
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 404 | NOT_FOUND | Item Type with ID not found |
senitron_countis the in-inventory quantity;external_countis the last imported external-system quantity.
Items
Create New Item
/api/v1/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"item": {
"number": "197634439105",
"name": "Hoka Bondi 8",
"description": "Hoka Bondi 8 running shoe",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"style": "1127952",
"color": "White - Pink",
"size": "9",
"retail_price": 87.5,
"cost_price": 64.95,
"msrp": 0.0,
"vendor_id": "",
"vendor_name": "Bondi 8",
"manufacturer": "Hoka",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"picture": "",
"attr3": "",
"attr4": "",
"attr22": "",
"preferred_unit_of_measure": "EA",
"non_rfid_item": false
}
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"item": {
"number": "197634439105",
"name": "Hoka Bondi 8",
"description": "Hoka Bondi 8 running shoe",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"style": "1127952",
"color": "White - Pink",
"size": "9",
"retail_price": 87.5,
"cost_price": 64.95,
"msrp": 0.0,
"vendor_id": "",
"vendor_name": "Bondi 8",
"manufacturer": "Hoka",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"picture": "",
"attr3": "",
"attr4": "",
"attr22": "",
"preferred_unit_of_measure": "EA",
"non_rfid_item": false
}
}'Success response
{
"message": "The item received and saved in catalog"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 409 | ITEM_IS_EXISTS | This item already exists with this number! |
If item.number is empty, the next numeric item number is generated (padded to the tenant's item-number length).
Field mapping: name → catalog description, description → short description, cost_price (or price) → cost, color → colour. Other accepted fields:
upc,alu,sku,custom_sku,style,size,retail_price,msrp,vendor_id,vendor_name,manufacturer,attr3–attr22,preferred_unit_of_measure,non_rfid_item. item_type_name defaults toRegular.categories:
id: 0creates (or reuses) a category by name; otherwise the id must exist.picture: Base64-encoded JPEG; on update,
"0"removes the picture.An unknown location falls back to the tenant's first location.
Get Item Number
/api/v1/items/numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code (default: first location). |
Try it with curl
curl "https://app.senitron.net/api/v1/items/number" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"item_number": "10857335004993"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
Returns the next free numeric item number (current maximum + 1), padded to the tenant's item-number length. The number is not reserved.
Get Items Bin List
/api/v1/items/binsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
bin_number_field | string | optional | Catalog column holding the bin number (e.g. attr3); default: the handheld setting Bin number catalog field. |
bin_number | string | optional | Exact bin number. |
query | string | optional | Partial match on bin number or item number. |
sort_type | string | optional | asc or desc (default desc). |
items | boolean | optional | Include the items in each bin. |
items_details | boolean | optional | With items, add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/items/bins" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"bins": [
{
"bin_number": "AB-1-2",
"summary": {
"items": 1,
"assets": 0
},
"items": [
{
"item_number": "000787909829",
"item_name": "Hoka Bondi",
"item_details": {
"id": 597402096,
"number": "000787909829",
"name": "Hoka Bondi",
"upc": 197634439115,
"alu": "",
"sku": "",
"custom_sku": "",
"description": "Hoka Bondi",
"style": "C200",
"color": "White",
"retail_price": 102.95,
"cost_price": 103.95,
"msrp": 0.0,
"size": "9",
"dcs": "",
"dnc": false,
"epcs_count": 0,
"price": "164.95",
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "",
"vendor_name": "Bondi 8",
"manufacturer": "Hoka",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"text1": "1127952FTRS9B - - Hoka Bondi 8",
"text2": "White - Pink,9,164.95",
"in_stock": 0,
"total_qty": 0,
"uom": [],
"uoms": []
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | BIN_NUMBER_NOT_FOUND | Bin number field or default column not found |
| 404 | BIN_NUMBER_NOT_FOUND | Bin number field is NOT valid |
Lists distinct bin numbers from the bin field.
summary.assetscounts all tags of the bin's items.item_detailsisnullunless items_details is true.
Get Items List
/api/v1/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code (default: first location). |
item_number | string | optional | Partial match on item number. |
query | string | optional | Space-separated words; each must partially match number, UPC, ALU, SKU or description. |
main_attributes | boolean | optional | true returns only number, upc, alu, sku and non_rfid_item. |
sort_field | string | optional | Catalog column to sort by (e.g. number, description). |
sort_type | string | optional | asc or desc (default desc). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 100. |
Try it with curl
curl "https://app.senitron.net/api/v1/items" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"items": [
{
"id": 597116103,
"number": "197634439105",
"name": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"description": "Hoka Bondi 8",
"style": "1127952",
"color": "White - Pink",
"retail_price": 87.5,
"cost_price": 164.95,
"msrp": 0.0,
"size": "9",
"dcs": "",
"dnc": false,
"epcs_count": 0,
"price": "164.95",
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "",
"vendor_name": "Bondi 8",
"manufacturer": "Hoka",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"text1": "1127952FTRS9B - - Hoka Bondi 8",
"text2": "White - Pink,9,164.95",
"in_stock": 0,
"total_qty": 0,
"uom": [],
"uoms": [],
"non_rfid_item": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
priceandcost_priceare both the item cost;total_qtysums tag units when storage units are enabled.uom/uomslist the item's storage units (manufacturing tenants only).
Remove Item
/api/v1/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code (default: first location). |
item_number | string | required | Item number to delete. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/items?item_number=<item_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "The item deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | Item not found! |
| 200 | NOT_DELETED | The item has an issue in deleting, please try again later! |
NOT_DELETEDis returned with HTTP 200; check for theerrorkey.
Set Bin For Item
/api/v1/items/binsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"bin_number_field": "attr3",
"bin_number_value": "AB-1-3",
"override": true,
"items": [
{
"item_number": "000787909829"
},
{
"item_number": "000787909830"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/items/bins" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"bin_number_field": "attr3",
"bin_number_value": "AB-1-3",
"override": true,
"items": [
{
"item_number": "000787909829"
},
{
"item_number": "000787909830"
}
]
}'Success response
{
"message": "The item(s) assigned to bin# successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | The items are empty! |
| 404 | ITEM_NOT_FOUND | These item(s) do not exist in catalog [X, Y] |
| 404 | BIN_NUMBER_NOT_FOUND | Bin number field or default column not found |
| 404 | BIN_NUMBER_NOT_FOUND | Bin number field is NOT valid |
| 409 | CATALOG_UNIQUE_VIOLATION | Assigning this bin would duplicate a catalog number for this client (unique number per client). |
Sets bin_number_value on the listed items.
override: true(JSON boolean) first clears that bin from all other items.If bin_number_field is omitted, the handheld setting Bin number catalog field is used.
Update Item
/api/v1/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"update_only": true,
"item": {
"number": "197634439105",
"name": "Hoka Bondi 8",
"description": "Hoka Bondi 8 running shoe",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"style": "1127952",
"color": "White - Pink",
"size": "9",
"retail_price": 87.5,
"cost_price": 64.95,
"msrp": 0.0,
"vendor_id": "",
"vendor_name": "Bondi 8",
"manufacturer": "Hoka",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"picture": "",
"attr3": "",
"attr4": "",
"attr22": "",
"preferred_unit_of_measure": "EA",
"non_rfid_item": false
}
}Try it with curl
curl -X PUT "https://app.senitron.net/api/v1/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"update_only": true,
"item": {
"number": "197634439105",
"name": "Hoka Bondi 8",
"description": "Hoka Bondi 8 running shoe",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"style": "1127952",
"color": "White - Pink",
"size": "9",
"retail_price": 87.5,
"cost_price": 64.95,
"msrp": 0.0,
"vendor_id": "",
"vendor_name": "Bondi 8",
"manufacturer": "Hoka",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"picture": "",
"attr3": "",
"attr4": "",
"attr22": "",
"preferred_unit_of_measure": "EA",
"non_rfid_item": false
}
}'Success response
{
"message": "The item updated and saved in catalog"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | Could not find Item with that number |
| 404 | <exception class> | <exception message> |
Matches the item by item.number. With
update_only: truean unknown number returnsNOT_FOUND; otherwise the item is created.When categories is sent, it replaces the item's categories.
Field mapping: name → catalog description, description → short description, cost_price (or price) → cost, color → colour. Other accepted fields:
upc,alu,sku,custom_sku,style,size,retail_price,msrp,vendor_id,vendor_name,manufacturer,attr3–attr22,preferred_unit_of_measure,non_rfid_item. item_type_name defaults toRegular.categories:
id: 0creates (or reuses) a category by name; otherwise the id must exist.picture: Base64-encoded JPEG; on update,
"0"removes the picture.
Delete Bin
/api/v1/items/binsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
bin_number_field | string | optional | Catalog column holding the bin number (e.g. attr3); default: the handheld setting Bin number catalog field. |
bin_number | string | required | Bin number to clear. |
location | string | optional | Location code (default: first location). |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/items/bins?bin_number=<bin_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "The bin# deleted successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | BIN_NUMBER_NOT_FOUND | Bin number field or default column not found |
| 404 | BIN_NUMBER_NOT_FOUND | Bin number field is NOT valid |
Clears bin_number from every item that has it in the bin field.
Get Warehouse Item Bins
/api/v1/items/warehouse/binsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
item_number | string | optional | Catalog search (number, ALU, SKU, …). |
bin_number | string | optional | Bin number (% wildcard allowed). |
items_details | boolean | optional | Add item_details. |
sort_field | string | optional | Bin field to sort bins by (default bin_number). |
sort_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 100. |
Try it with curl
curl "https://app.senitron.net/api/v1/items/warehouse/bins?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 100,
"total_entries": 1
},
"items": [
{
"item_number": "210000047060",
"item_name": "Classic Tee",
"item_details": null,
"bins": [
{
"name": "A-01-02",
"zone": "Warehouse",
"order": 1
},
{
"name": "B-03-01",
"zone": "Warehouse",
"order": 2
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | The location 001 not found |
Lists warehouse bin assignments (multiple bins per item, with pick order), grouped by item.
NetSuite
Get Netsuite Transfer-In Data
/api/v1/netsuite/transfers/inRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Destination location code. |
transfer_number | string | optional | Senitron transfer id (exact). |
query | string | optional | Partial match on id, document number, reference number or item fulfillment number. |
items | boolean | optional | Default true; false returns empty items arrays. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/netsuite/transfers/in?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transfers": [
{
"id": 10576,
"document_number": "17925589",
"reference_number": "TO0010344",
"eos_item_fulfillment_number": "",
"shipped_date": "05/18/2026 03:00 AM",
"source_location": "011",
"source_location_name": "Ellenton Outlets",
"destination_location": "001",
"destination_location_name": "UTC Sarasota",
"status": "Pending",
"sent": {
"items_count": 1,
"assets_count": 1
},
"received": {
"items_count": 0,
"assets_count": 0
},
"items": [
{
"item_number": "0840295405810",
"sent_qty": 1,
"received_qty": 0,
"item_details": {
"id": 214821233,
"number": "0840295405810",
"name": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"description": "Hoka Bondi 8",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "164.95",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 1408190,
"name": "ACC"
}
],
"text1": "1127952FTRS9B - - Hoka Bondi 8",
"text2": "White - Pink,9,164.95",
"in_stock": 1
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | the location 001 not found |
Returns NetSuite transfers coming into the location, newest shipped first.
statusis alwaysPending.item_details.priceis the retail price formatted with two decimals;in_stockcounts in-inventory EPCs of the item.
Transfers
Post Audit Transfer Data
/api/v1/transfers/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"transfer_number": "866375",
"transfer_datetime": "03/17/2024 07:15 AM",
"source_location": "001",
"destination_location": "002",
"note": "",
"user": "api@senitron.net",
"device_name": "HH-53",
"items": [
{
"item_number": "000493",
"sent": 3,
"received": 2,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2024 07:15 AM",
"rssi": 90
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2024 07:16 AM",
"rssi": 80
}
]
},
{
"item_number": "000494",
"sent": 1,
"received": 1,
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"last_seen": "03/17/2024 07:14 AM",
"rssi": 86
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/audits" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"transfer_number": "866375",
"transfer_datetime": "03/17/2024 07:15 AM",
"source_location": "001",
"destination_location": "002",
"note": "",
"user": "api@senitron.net",
"device_name": "HH-53",
"items": [
{
"item_number": "000493",
"sent": 3,
"received": 2,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2024 07:15 AM",
"rssi": 90
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2024 07:16 AM",
"rssi": 80
}
]
},
{
"item_number": "000494",
"sent": 1,
"received": 1,
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"last_seen": "03/17/2024 07:14 AM",
"rssi": 86
}
]
}
]
}'Success response
{
"id": 3424,
"message": "Transfer audit information received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | INVALID_ITEM_NUMBER | <validation message> |
| 422 | LOCATION_NOT_FOUND | <validation message> |
| 404 | — | Unknown user email (HTTP 404, no error body) |
location is required (the location that performs the audit). user must be the email of an existing user.
transfer_datetime must use
MM/DD/YYYY hh:mm AM/PM.Each item's audited quantity is its number of unique EPCs; sent is stored as the expected quantity (received is not stored). The audit status (e.g.
matched) is then calculated and an email notification is sent.
Get a Specific Audit Transfer Data
/api/v1/transfers/audits/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Audit id or transfer number. |
location | string | required | Location code. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 100. |
Try it with curl
curl "https://app.senitron.net/api/v1/transfers/audits/<id>?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"audits": [
{
"id": 10043,
"transfer_number": "866375",
"transfer_datetime": "03/12/2024 10:34 PM",
"source_location": "001",
"destination_location": "002",
"status": "matched",
"items": [
{
"item_number": "000492",
"sent": 1,
"received": 1,
"item_details": {
"id": 3243221,
"number": "000492",
"name": "ROY ROYAL X",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "ROY ROYAL X",
"style": "No",
"color": "0.15",
"retail_price": 84.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"epcs_count": 4,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"total_qty": 0,
"uom": [],
"uoms": []
},
"epcs": [
{
"epc_id": "CF00000000001FC00000000B",
"asset_id": "11",
"last_seen": "",
"rssi": 90,
"status": {
"id": 1054,
"name": "Live"
}
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Returns every audit whose id or transfer number equals id, in the same shape as Get Audit Transfer Data.
In
epcs,asset_idis the Senitron asset record id (a number, empty when the EPC is unknown), not the serial number.
Get Audit Transfer Data
/api/v1/transfers/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Search on id or transfer number. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 100; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/api/v1/transfers/audits?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"audits": [
{
"id": 10043,
"transfer_number": "866375",
"transfer_datetime": "03/12/2024 10:34 PM",
"source_location": "001",
"destination_location": "002",
"status": "matched",
"items": [
{
"item_number": "000492",
"sent": 2,
"received": 2,
"item_details": {
"id": 3243221,
"number": "000492",
"name": "ROY ROYAL X",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "ROY ROYAL X",
"style": "No",
"color": "0.15",
"retail_price": 84.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"epcs_count": 4,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"total_qty": 0,
"uom": [],
"uoms": []
},
"epcs": [
{
"epc_id": "CF00000000001FC00000000B",
"asset_id": "11",
"last_seen": "",
"rssi": 90,
"status": {
"id": 1054,
"name": "Live"
}
},
{
"epc_id": "CF00000000001FC0000000FB",
"asset_id": "110",
"last_seen": "",
"rssi": 90,
"status": {
"id": 1054,
"name": "Live"
}
}
]
},
{
"item_number": "000493",
"sent": 1,
"received": 1,
"item_details": {
"id": 3249921,
"number": "000493",
"name": "ROY ROYAL X",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "ROY ROYAL X",
"style": "No",
"color": "0.15",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"epcs_count": 3,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 3,
"total_qty": 0,
"uom": [],
"uoms": []
},
"epcs": [
{
"epc_id": "CF00000000001FC00000FFFB",
"asset_id": "15",
"last_seen": "",
"rssi": 90,
"status": {
"id": 1054,
"name": "Live"
}
}
]
}
]
},
{
"id": 20043,
"transfer_number": "961170",
"transfer_datetime": "03/18/2024 09:10 AM",
"source_location": "003",
"destination_location": "001",
"status": "matched",
"items": [
{
"item_number": "000491",
"sent": 1,
"received": 0,
"item_details": {
"id": 3923224,
"number": "000491",
"name": "ROY ROYAL AAA",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "ROY ROYAL AAA",
"style": "No",
"color": "0.15",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"epcs_count": 8,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 ROY ROYAL AAA in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 5,
"total_qty": 0,
"uom": [],
"uoms": []
},
"epcs": []
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
In
epcs,asset_idis the Senitron asset record id (a number, empty when the EPC is unknown), not the serial number.statusis the calculated audit result (e.g.matched).
Get LightSpeed Transfer Data
/api/v1/transfers/eosRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (or source_location). |
transfer_number | string | required | Lightspeed transfer id (digits). |
items_details | boolean | optional | Add item_details (catalog fields). |
clear | boolean | optional | Clear the cached scan state for this transfer. |
Try it with curl
curl "https://app.senitron.net/api/v1/transfers/eos?location=$LOCATION&transfer_number=<transfer_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"transfer_number": "979",
"transfer_datetime": "05/19/2026 07:16 PM",
"source_location": "Los Angeles - 001",
"destination_location": "New York - 002",
"status": "sent",
"items": [
{
"item_number": "210000047194",
"sent": 2,
"received": 0,
"item_details": {
"id": 548649048,
"number": "210000047194",
"name": "ROY ROYAL X",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "ROY ROYAL X",
"style": "No",
"color": "0.15",
"retail_price": 84.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"epcs_count": 4,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"total_qty": 0,
"uom": [],
"uoms": [],
"non_rfid_item": false
}
},
{
"item_number": "210000047197",
"sent": 2,
"received": 0,
"item_details": {
"id": 621024861,
"number": "210000047197",
"name": "ROY ROYAL Y",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "ROY ROYAL Y",
"style": "No",
"color": "0.15",
"retail_price": 84.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"epcs_count": 4,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"total_qty": 0,
"uom": [],
"uoms": [],
"non_rfid_item": false
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"message": "No transfer found!"} (HTTP 200) |
| 404 | <exception class> | <exception message> |
Reads the transfer live from Lightspeed (the tenant must have a Lightspeed integration).
sent/receivedinclude counts already recorded in Senitron.When the transfer is not found, has no items or Lightspeed can't be reached, the response is HTTP 200 with
{"message": "No transfer found!"}.
Get Transfer-Out Data
/api/v1/transfers/outRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL; also accepted as source_location or store_code). |
query | string | optional | Partial match on id, document number or reference. |
status | string | optional | Comma-separated: pending, partially_received, received, undo. |
sn_id | integer | optional | Senitron transfer id. |
items_details | boolean | optional | Add item_details to each asset group. |
assets | boolean | optional | false returns empty assets arrays. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/transfers/out?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transfers": [
{
"id": 68855,
"external_id": 0,
"document_number": "",
"reference_number": "",
"transfer_date": "2026-02-13T09:16:27.107-08:00",
"received_date": "",
"status": "pending",
"api_status": "",
"source_location": "001",
"source_location_name": "Location A",
"destination_location": "002",
"destination_location_name": "Location B",
"device_name": "HH-973",
"user": "API User",
"assets": [
{
"item_number": "00000000001",
"line_number": 0,
"non_rfid_item": false,
"item_details": {
"id": 221005322,
"number": "00000000001",
"name": "BOYS SUITBOYSUIFAS",
"upc": 87578876,
"alu": "52534764764",
"description": "BOYS SUITBOYSUIFAS",
"style": "",
"colour": "Blue",
"size": "Large",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "80.0",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 1185255,
"name": "Child Category"
}
],
"text1": "",
"text2": "",
"in_stock": 0
},
"epcs": [
{
"id": 120,
"epc_id": "EF9C30000000004000000253",
"asset_id": "595",
"sent_qty": 1,
"received_qty": 0,
"text3": "",
"status": {
"id": 7855,
"name": ""
},
"received": false
}
]
}
],
"sent": {
"items_count": 1,
"assets_count": 1
},
"received": {
"items_count": 0,
"assets_count": 0
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Lists transfers whose source is location.
Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither
querynorstatusis sent, fully received transfers are left out.statusis the display status;api_statusis the raw transfer status.transfer_dateandreceived_dateare returned as stored (format may vary by source).
Get Transfer-In Data
/api/v1/transfers/inRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL; also accepted as source_location or store_code). |
query | string | optional | Partial match on id, document number or reference. |
status | string | optional | Comma-separated: pending, partially_received, received, undo. |
sn_id | integer | optional | Senitron transfer id. |
items_details | boolean | optional | Add item_details to each asset group. |
assets | boolean | optional | false returns empty assets arrays. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/transfers/in?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transfers": [
{
"id": 10043,
"external_id": 17188209,
"document_number": "17188209",
"reference_number": "TO0008494",
"transfer_date": "10/14/2019 10:34 PM",
"received_date": "",
"status": "Pending",
"api_status": "sent",
"source_location": "002",
"source_location_name": "Location B",
"destination_location": "001",
"destination_location_name": "Location A",
"device_name": "",
"user": "",
"assets": [
{
"item_number": "000492",
"line_number": 0,
"non_rfid_item": false,
"item_details": {
"id": 3243281,
"number": "000492",
"name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"upc": 0,
"alu": "ROY-BOX87",
"description": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ P007104",
"style": "No",
"colour": "0.15",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "0",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN,814.99",
"in_stock": 3
},
"epcs": [
{
"id": 14131,
"epc_id": "CF00000000001FC00000000B",
"asset_id": "11",
"sent_qty": 1,
"received_qty": 0,
"text3": "11/01/2019 01:56 PM",
"status": {
"id": 1045,
"name": "Pending Visibility"
},
"received": false
},
{
"id": 14132,
"epc_id": "CF00000000001FC0000000FB",
"asset_id": "110",
"sent_qty": 1,
"received_qty": 0,
"text3": "11/01/2019 01:56 PM",
"status": {
"id": 1045,
"name": "Pending Visibility"
},
"received": false
}
]
}
],
"sent": {
"items_count": 1,
"assets_count": 2
},
"received": {
"items_count": 0,
"assets_count": 0
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Lists transfers whose destination is location.
Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither
querynorstatusis sent, fully received transfers are left out.statusis the display status;api_statusis the raw transfer status.transfer_dateandreceived_dateare returned as stored (format may vary by source).
Merge the Transfers
/api/v1/transfers/mergeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/merge" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}'Success response
{
"messages": "The selected transfers have been merged successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TRANSFER_NOT_FOUND | Base transfer ID not found |
| 404 | NOT_FOUND | No valid merged transfers |
| 400 | BAD_REQUEST | <exception message> |
Merges merged_transfers into base_transfer. Only transfers with the same destination as the base transfer and nothing received yet are merged; others are ignored.
user(email) is recorded as the user who merged.
Transfer Receiving
/api/v1/transfers/receivingRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"source_location": "001",
"destination_location": "002",
"transfer_date": "11/26/2019 08:30 PM",
"document_number": "D-6724",
"reference_number": "R-4534",
"eos_item_fulfillment_number": "IF-6712",
"reference1": "ref-1",
"reference2": "ref-2",
"reference3": "ref-3",
"reference4": "ref-4",
"shipping_method": "",
"destination_zone": "Receiving",
"reason": "This is a test reason",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"items": [
{
"item_number": "000493",
"item_name": "FIGS DRIED WOODEN BOX 22LBS",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "11/26/2019 07:56 PM",
"rssi": 75,
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "11/26/2019 08:16 PM",
"rssi": 90,
"qty": 1
}
]
},
{
"item_number": "000494",
"item_name": "ROY PRINT BOX 4OZ P007104",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F0023000BAA",
"last_seen": "11/26/2019 08:12 PM",
"rssi": 75,
"qty": 1
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/receiving" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"source_location": "001",
"destination_location": "002",
"transfer_date": "11/26/2019 08:30 PM",
"document_number": "D-6724",
"reference_number": "R-4534",
"eos_item_fulfillment_number": "IF-6712",
"reference1": "ref-1",
"reference2": "ref-2",
"reference3": "ref-3",
"reference4": "ref-4",
"shipping_method": "",
"destination_zone": "Receiving",
"reason": "This is a test reason",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"items": [
{
"item_number": "000493",
"item_name": "FIGS DRIED WOODEN BOX 22LBS",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "11/26/2019 07:56 PM",
"rssi": 75,
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "11/26/2019 08:16 PM",
"rssi": 90,
"qty": 1
}
]
},
{
"item_number": "000494",
"item_name": "ROY PRINT BOX 4OZ P007104",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F0023000BAA",
"last_seen": "11/26/2019 08:12 PM",
"rssi": 75,
"qty": 1
}
]
}
]
}'Success response
{
"id": 3424,
"message": "The transfer receiving data has been received, and a job has been scheduled to process it"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 404 | NOT_FOUND | The destination store is not found. Please enter store code |
| 404 | NOT_FOUND | EPC Tags are not found. Please enter valid EPC Tags |
| 404 | TRANSFER_EXISTS | A transfer exists with the same document and reference number! |
| 422 | ITEM_FULFILLMENT_REQUIRED | The item fulfillment number (eos_item_fulfillment_number) is required for this transfer. |
| 422 | ITEM_FULFILLMENT_NOT_FOUND | The item fulfillment IF-6712 does not belong to this transfer. |
One-step transfer: creates the transfer slip from the scanned items and receives it at destination_location; receiving runs in the background.
TRANSFER_EXISTSalso returns the existing transferid. With NetSuite item-fulfillment transfers, eos_item_fulfillment_number is required when a document or reference number is sent.EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs.user(email) is used when calling with the API key.
Transfer Zone
/api/v1/transfers/zoneRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"device_name": "HH-53",
"zone": {
"id": 1,
"name": "Inside Zone A"
},
"epcs": [
{
"epc": "C6000020000000000001CCD8",
"last_seen": "2024-09-19T15:01:55-04:00",
"rssi": 50
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/zone" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-53",
"zone": {
"id": 1,
"name": "Inside Zone A"
},
"epcs": [
{
"epc": "C6000020000000000001CCD8",
"last_seen": "2024-09-19T15:01:55-04:00",
"rssi": 50
}
]
}'Success response
{
"message": "Transfer assets to new zone is successful"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ZONE_NOT_FOUND | The zone 1 was not found |
| 404 | <exception class> | <exception message> |
Moves the tags to sub-zone zone.id (static zone). Unknown EPCs are added to inventory first (
last_seenmust be a parseable date).Handheld settings control the details: update both static and normal zone also updates last seen and antenna; update tag status to Live sets non-inventory tags to Live (unless their status prevents changes in transfers).
If configured, the move is also sent to the external transfer-zone API and replenishment alerts are refreshed.
Upload Transfer-Out Data
/api/v1/transfers/outRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request-Id | Optional idempotency key; repeating it within 5 minutes returns 409 DUPLICATE_REQUEST. |
Request body
{
"order_type": "TO",
"source_location": "001",
"destination_location": "002",
"transfer_date": "11/26/2019 08:30 PM",
"shipping_method": "",
"reference1": "ref-1",
"reference2": "ref-2",
"reference3": "ref-3",
"reference4": "ref-4",
"email": "api@senitron.net",
"reason": "This is a test reason",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"printer_id": 0,
"document_number": "D-6724",
"reference_number": "700007132",
"destination_zone": {
"id": 343,
"name": "Inside Zone A"
},
"transfers": [
{
"item_number": "000493",
"item_name": "FIGS DRIED WOODEN BOX 22LBS",
"line_number": 33,
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "11/26/2019 07:56 PM",
"rssi": 85,
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "11/26/2019 08:16 PM",
"rssi": 85,
"qty": 1
}
]
},
{
"item_number": "000494",
"item_name": "ROY PRINT BOX 4OZ P007104",
"line_number": 22,
"non_rfid_item": true,
"epcs": [
{
"epc": "FFFFFFFFFFFFFFFFFFFFFFFF",
"last_seen": "11/26/2019 08:12 PM",
"rssi": 75,
"qty": 5
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/out" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Request-Id: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"order_type": "TO",
"source_location": "001",
"destination_location": "002",
"transfer_date": "11/26/2019 08:30 PM",
"shipping_method": "",
"reference1": "ref-1",
"reference2": "ref-2",
"reference3": "ref-3",
"reference4": "ref-4",
"email": "api@senitron.net",
"reason": "This is a test reason",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"printer_id": 0,
"document_number": "D-6724",
"reference_number": "700007132",
"destination_zone": {
"id": 343,
"name": "Inside Zone A"
},
"transfers": [
{
"item_number": "000493",
"item_name": "FIGS DRIED WOODEN BOX 22LBS",
"line_number": 33,
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "11/26/2019 07:56 PM",
"rssi": 85,
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "11/26/2019 08:16 PM",
"rssi": 85,
"qty": 1
}
]
},
{
"item_number": "000494",
"item_name": "ROY PRINT BOX 4OZ P007104",
"line_number": 22,
"non_rfid_item": true,
"epcs": [
{
"epc": "FFFFFFFFFFFFFFFFFFFFFFFF",
"last_seen": "11/26/2019 08:12 PM",
"rssi": 75,
"qty": 5
}
]
}
]
}'Success response
{
"id": 3424,
"pdf": "https://app.senitron.net/acme/001/transfers/3424/export_pdf.pdf?file_name=Transfer_3424_...",
"message": "Transfer-out information received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 404 | NOT_FOUND | The destination store is not found. Please enter store code |
| 404 | NOT_FOUND | The EOS transfer is not found with the reference number: 700007132 |
| 422 | TRANSFER_EXISTS | A transfer exists with the same document and reference number! |
| 422 | INVALID_DATA | Invalid Items. All items were marker tags. |
| 404 | NOT_FOUND | EPC Tags are not found. Please enter valid EPC Tags |
| 409 | DUPLICATE_REQUEST | A record with this request_id has already been processed |
Creates a transfer slip (status pending) from source_location to destination_location; the tags are processed in the background.
Unknown 24-character EPCs are added as new assets (status per location settings). Marker-tag EPCs are skipped.
non_rfid_item: true items: send one EPC
FFFFFFFFFFFFFFFFFFFFFFFFwith qty; the item's virtual tag is reduced (or created) instead.When the handheld setting Skip duplicate EPCs in transfer out is on, EPCs already in another pending transfer between the same locations are skipped. EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs.order_type: "RTV"(NetSuite) creates a return-to-vendor transfer matched by reference_number to the RTV destination location.pdf(a link to the transfer PDF) is returned only when printer_id is sent.eos_item_fulfillment_numberselects the item fulfillment for NetSuite transfer orders.
Upload Transfer-In Data
/api/v1/transfers/inRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request-Id | Optional idempotency key; repeating it within 5 minutes returns 409 DUPLICATE_REQUEST. |
Request body
{
"id": 68855,
"device_name": "HH-53",
"push_qty_to_eos": true,
"assets": [
{
"item_number": "00000000001",
"epcs": [
{
"epc": "EF9C30000000004000000253",
"qty": 1
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/in" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Request-Id: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"id": 68855,
"device_name": "HH-53",
"push_qty_to_eos": true,
"assets": [
{
"item_number": "00000000001",
"epcs": [
{
"epc": "EF9C30000000004000000253",
"qty": 1
}
]
}
]
}'Success response
{
"message": "Transfer-in confirmed data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TRANSFER_COMPLETED | Transfer-slip has been completed, if you have a problem please contact with support |
| 422 | TRANSFER_ERROR | <exception message> |
| 409 | DUPLICATE_REQUEST | A record with this request_id has already been processed |
Receives transfer id (from Get Transfer-In List): the listed EPCs are marked received (quantity capped at the sent quantity), set to Live at the destination (unless their original status prevents changes in transfers) and moved to the destination location.
When the transfer becomes fully received it is completed and pushed to the external system (Lightspeed, NetSuite, Shopify, D365, …) when configured. EPCs in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs.
Retry Transfer-In Push to External System
/api/v1/transfers/in/retryRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "002",
"id": 68855,
"device_name": "HH-53"
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfers/in/retry" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "002",
"id": 68855,
"device_name": "HH-53"
}'Success response
{
"status": "processing",
"message": "Transfer-in is processing"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TRANSFER_NOT_FOUND | Transfer not found |
| 404 | LOCATION_NOT_FOUND | Location not found |
Re-sends a received transfer to the external system when the previous push failed. Nothing is queued if the transfer is already processing or the integration doesn't commit transfers.
Packing
Delete Packing Box Items
/api/v1/packings/boxes/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"boxes": [
{
"box_number": 4,
"items": [
{
"item_number": "210000001207",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"qty": 5
},
{
"epc": "000000000000000000000000",
"serial_number": "",
"qty": 1
}
]
}
]
}
]
}Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/packings/boxes/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"boxes": [
{
"box_number": 4,
"items": [
{
"item_number": "210000001207",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"qty": 5
},
{
"epc": "000000000000000000000000",
"serial_number": "",
"qty": 1
}
]
}
]
}
]
}'Success response
{
"message": "The box item(s)/tag(s) deleted successfully!"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | USER_NOT_FOUND | User not found |
| 200 | HANDHELD_NOT_FOUND | Handheld not found |
| 200 | SO_NOT_FOUND | The picking list not exists! |
| 200 | PACKING_NOT_FOUND | Packing not found |
| 422 | ITEM_NOT_FOUND | item# 210000001207 not found |
| 422 | EPC_NOT_FOUND | item# 210000001207: EPC … not found |
| 422 | ERROR | box# 4 not found |
Removes the listed tags. Empty items, boxes and finally the packing itself are deleted.
user must be an existing user email and device_name must be
HH-<device id>.
Post Packing Box Items
/api/v1/packings/boxes/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"boxes": [
{
"box_number": 4,
"items": [
{
"item_number": "210000001207",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"qty": 5
},
{
"epc": "000000000000000000000000",
"serial_number": "",
"qty": 1
}
]
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/packings/boxes/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"boxes": [
{
"box_number": 4,
"items": [
{
"item_number": "210000001207",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"qty": 5
},
{
"epc": "000000000000000000000000",
"serial_number": "",
"qty": 1
}
]
}
]
}
]
}'Success response
{
"message": "The box item(s)/tag(s) received and saved in cloud!"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | USER_NOT_FOUND | User not found |
| 200 | HANDHELD_NOT_FOUND | Handheld not found |
| 200 | SO_NOT_FOUND | The picking list not exists! |
| 422 | PACKING_QTY_EXCEEDED | item# 210000001207: Packing qty exceeded |
| 422 | EPC_EXISTS | item# 210000001207: EPC C000C30E4F9B8B7000000453 already exists |
| 422 | ERROR | <exception message> |
Packs tags into boxes of the packing for pick list list_id (created on first use). Only items on the pick list are accepted, and the packed quantity cannot exceed the picked quantity.
Use EPC
000000000000000000000000for untagged units (may repeat). Other tags are rejected if already in the box.user must be an existing user email and device_name must be
HH-<device id>.Per-tag problems return HTTP 422 with all messages joined by commas; the valid tags are still saved.
Packing data is pushed to the external system when the handheld setting Push picking data to EOS is on.
Picking
Delete Picking SO List
/api/v1/pickings/listsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
list_id | integer | required | Pick list id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/pickings/lists?location=$LOCATION&list_id=<list_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "The pikcing list is deleted successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | SO_NOT_FOUND | The picking list not exists! |
| 200 | ERROR | Something went wrong, please try again later! |
Deletes the pick list and all of its items.
The success message is returned exactly as shown (including the spelling
pikcing).
Get Pick Lists (Packing)
/api/v1/pickings/packing_listsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
list_id | integer | optional | Exact list id. |
query | string | optional | Partial match on id, SO number, shipment number or title. |
status | string | optional | created, picking or completed (an unknown value returns no lists). |
sort_field | string | optional | Default id. |
sort_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
boxes | boolean | optional | Include packed boxes (with items and tags). |
picked_tags | boolean | optional | Include all picked tags (picked_tags). |
items_details | boolean | optional | Add item_details to box items. |
Try it with curl
curl "https://app.senitron.net/api/v1/pickings/packing_lists?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 1,
"total_entries": 1
},
"lists": [
{
"id": 2,
"so_number": "67884",
"shipment_number": "34890",
"title": "4890 - Adidas",
"customer_name": "Adidas",
"note": "Test note",
"expected": {
"skus": 2,
"assets": 11
},
"picked": {
"skus": 2,
"assets": 11
},
"packed": {
"skus": 1,
"assets": 6
},
"user": "api@senitron.net",
"user_name": "API User",
"created_at": "04/10/2025 09:01 AM",
"updated_at": "04/11/2025 12:55 PM",
"status": "completed",
"boxes": [
{
"box_number": 1,
"user": "api@senitron.net",
"user_name": "API User",
"handheld": "HH-777",
"created_at": "04/10/2025 09:01 AM",
"updated_at": "04/11/2025 12:55 PM",
"items": [
{
"item_number": "210000001207",
"expected_qty": 10,
"picked_qty": 10,
"packed_qty": 6,
"handheld": "HH-777",
"user": "api@senitron.net",
"user_name": "API User",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"handheld": "HH-777",
"user": "api@senitron.net",
"user_name": "API User",
"datetime": "04/11/2025 12:55 PM",
"packed": true,
"qty": 5
},
{
"epc": "000000000000000000000000",
"serial_number": "",
"handheld": "HH-777",
"user": "api@senitron.net",
"user_name": "API User",
"datetime": "04/11/2025 12:55 PM",
"packed": true,
"qty": 1
}
],
"item_details": {
"id": 195386905,
"number": "210000001207",
"name": "TOMMY BAHAMA M SHIRT 130 - L -",
"upc": 21125125,
"alu": "",
"sku": "",
"custom_sku": "0303TB130",
"description": "TOMMY BAHAMA M SHIRT 130 - L-",
"style": "",
"color": "Yellow",
"retail_price": 130.0,
"cost_price": 58.5,
"msrp": 0.0,
"size": "3XL",
"dcs": "",
"dnc": false,
"epcs_count": 2,
"price": "58.5",
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "TOMMY BAHAMA",
"manufacturer": "TOMMY BAHAMA",
"categories": [
{
"id": 1167912,
"name": "03 Mens Shirts 90+"
}
],
"text1": "TOMMY BAHAMA M SHIRT 130 - L - 21125125 TOMMY BAHAMA | Yellow | 3XL",
"text2": "Yellow,3XL,58.50 | | TOMMY BAHAMA",
"in_stock": 1,
"total_qty": 1,
"uom": [],
"uoms": []
}
}
]
}
],
"picked_tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"item_number": "210000001207",
"serial_number": "1107",
"qty": 5,
"text1": "TOMMY BAHAMA M SHIRT 130 - L - 21125125 TOMMY BAHAMA | Yellow | 3XL",
"text2": "Yellow,3XL,58.50 | | TOMMY BAHAMA",
"text3": ""
},
{
"epc": "C000C30E4F9B8B7000000454",
"item_number": "210000001207",
"serial_number": "1108",
"qty": 2,
"text1": "TOMMY BAHAMA M SHIRT 130 - L - 21125125 TOMMY BAHAMA | Yellow | 3XL",
"text2": "Yellow,3XL,58.50 | | TOMMY BAHAMA",
"text3": ""
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
Pick lists with their packing progress (
expected,picked,packed).Times use
MM/DD/YYYY HH:mm AM/PMwith a 24-hour hour (e.g.13:05 PM).
Get Picking Lists
/api/v1/pickings/listsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
list_id | integer | optional | Exact list id. |
query | string | optional | Partial match on id, SO number, shipment number or title. |
status | string | optional | created, picking or completed (an unknown value returns no lists). |
sort_field | string | optional | Default id. |
sort_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
items | boolean | optional | Include items. |
tags | boolean | optional | Include each item's picked tags. |
items_details | boolean | optional | Add item_details. |
items_marker_tags | boolean | optional | Add item_marker_tags (maker_tag, repeat_count). |
Try it with curl
curl "https://app.senitron.net/api/v1/pickings/lists?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"lists": [
{
"id": 1,
"so_number": "599123",
"shipment_number": "013543",
"title": "4890 - Adidas",
"customer_name": "Adidas",
"note": "Test note",
"expected": {
"skus": 2,
"assets": 11
},
"picked": {
"skus": 2,
"assets": 11
},
"overriden": {
"skus": 0,
"assets": 0
},
"user": "api@senitron.net",
"user_name": "API User",
"created_at": "04/10/2025 09:01 AM",
"updated_at": "04/11/2025 12:55 PM",
"status": "completed",
"items": [
{
"item_number": "889166800033",
"expected_qty": 3,
"picked_qty": 3,
"handheld": "HH-777",
"user": "api@senitron.net",
"user_name": "API User",
"bin_number": "",
"override": false,
"override_reason": "",
"tags": [
{
"epc": "CF19930E4F9B8B7000000420",
"serial_number": "1056",
"handheld": "HH-777",
"user": "api@senitron.net",
"user_name": "API User",
"datetime": "04/11/2025 10:33 AM",
"picked": true,
"qty": 1
}
],
"item_details": {
"id": 195386905,
"number": "210000001207",
"name": "TOMMY BAHAMA M SHIRT 130 - L -",
"upc": 21125125,
"alu": "",
"sku": "",
"custom_sku": "0303TB130",
"description": "TOMMY BAHAMA M SHIRT 130 - L-",
"style": "",
"color": "Yellow",
"retail_price": 130.0,
"cost_price": 58.5,
"msrp": 0.0,
"size": "3XL",
"dcs": "",
"dnc": false,
"epcs_count": 2,
"price": "58.5",
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "TOMMY BAHAMA",
"manufacturer": "TOMMY BAHAMA",
"categories": [
{
"id": 1167912,
"name": "03 Mens Shirts 90+"
}
],
"text1": "TOMMY BAHAMA M SHIRT 130 - L - 21125125 TOMMY BAHAMA | Yellow | 3XL",
"text2": "Yellow,3XL,58.50 | | TOMMY BAHAMA",
"in_stock": 1,
"total_qty": 1,
"uom": [],
"uoms": []
},
"item_marker_tags": [
{
"maker_tag": "12,14",
"repeat_count": 3
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
statusis derived from the non-overridden items:created(nothing picked),picking, orcompleted(all picked). Overridden items are counted inoverriden.Times use
MM/DD/YYYY HH:mm AM/PMwith a 24-hour hour (e.g.13:05 PM).
Post Pick List Items
/api/v1/pickings/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"items": [
{
"item_number": "210000001207",
"override": false,
"override_reason": "",
"qty": 10,
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"user": "api@senitron.net",
"qty": 10
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/pickings/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"items": [
{
"item_number": "210000001207",
"override": false,
"override_reason": "",
"qty": 10,
"tags": [
{
"epc": "C000C30E4F9B8B7000000453",
"serial_number": "1107",
"user": "api@senitron.net",
"qty": 10
}
]
}
]
}'Success response
{
"message": "All the pick list item(s)/tag(s) received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | SO_NOT_FOUND | The list not found |
| 200 | ITEM_NOT_FOUND | Item(s) not found in current list: 210000001207 |
| 200 | USER_NOT_FOUND | User not found |
| 200 | HANDHELD_NOT_FOUND | Handheld not found |
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | ITEM_PICKED | The item# 210000001207 picked before and can't be updated with this quantity 10 |
| 200 | EPC_ERROR | ["item# 210000001207: EPC … is used before"] (with message "Some of the pick list item(s)/tag(s) received and saved in cloud") |
Without advanced picking (handheld setting) only
items[].qtyis used. With advanced picking eachtags[]entry is recorded and the quantity is the sum oftags[].qty.The picked quantity cannot exceed the expected quantity (
ITEM_PICKED, nothing is saved).override: trueclears the item's picked tags and marks it overridden withoverride_reason.Handheld settings may also change picked tags' status, adjust their quantity, or create unknown tags.
user must be an existing user email and device_name must be
HH-<device id>.Business errors (
SO_NOT_FOUND,USER_NOT_FOUND,HANDHELD_NOT_FOUND, …) are returned with HTTP 200; check for theerrorkey.
Delete Pick List Item Tags
/api/v1/pickings/items/tagsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"items": [
{
"item_number": "210000001207",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453"
}
]
}
]
}Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/pickings/items/tags" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"list_id": 123,
"items": [
{
"item_number": "210000001207",
"tags": [
{
"epc": "C000C30E4F9B8B7000000453"
}
]
}
]
}'Success response
{
"message": "The pick list item tag(s) has been deleted."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | SO_NOT_FOUND | The list not found |
| 200 | ITEM_NOT_FOUND | Item(s) not found in current list: 210000001207 |
| 200 | USER_NOT_FOUND | User not found |
| 200 | HANDHELD_NOT_FOUND | Handheld not found |
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | EPC_ERROR | ["item# 210000001207: EPC … not found"] |
Un-picks the listed tags and recalculates each item's picked quantity. Tag status/quantity changes made when picking are reverted according to the handheld settings.
user must be an existing user email and device_name must be
HH-<device id>.Business errors (
SO_NOT_FOUND,USER_NOT_FOUND,HANDHELD_NOT_FOUND, …) are returned with HTTP 200; check for theerrorkey.
Purchase Orders
Get List of Purchase Orders
/api/v1/purchase_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
po_number | string | optional | Exact PO number. |
query | string | optional | Partial search on PO number, title, note, document or reference number, vendor. |
items | boolean | optional | Include items. |
epcs | boolean | optional | With items, include received EPCs. |
items_details | boolean | optional | With items, add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/api/v1/purchase_orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 1
},
"purchase_orders": [
{
"id": 101,
"po_number": "PO0011529",
"title": "Purchase Order #PO0011529",
"note": "69182TT-W",
"document_number": "2634361",
"reference_number": "",
"vendor_code": "",
"vendor_name": "Teleties",
"status": "created",
"po_date": "12/20/23 10:20 AM",
"currency": "USD",
"total": 0.0,
"user_name": "API User",
"created_at": "12/04/23 10:20 AM",
"updated_at": "12/04/23 01:34 PM",
"expected": {
"skus": 13,
"assets": 58
},
"received": {
"skus": 1,
"assets": 1
},
"audited": {
"skus": 0,
"assets": 0
},
"items": [
{
"item_number": "0045468459687",
"expected_qty": 4,
"received_qty": 1,
"audited_qty": 0,
"non_rfid_item": false,
"epcs": [
{
"epc": "CF19930E4F9B8B900000041E",
"serial_number": "1054",
"qty": 12,
"audited": false,
"handheld": "HH-305",
"user_name": "API User",
"datetime": "03/14/23 10:45 PM"
}
],
"item_details": {
"id": 32281,
"number": "0045468459687",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"style": "No",
"color": "0.15",
"size": "MS",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"dcs": "",
"dnc": false,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
},
{
"item_number": "0045468459816",
"expected_qty": 1,
"received_qty": 0,
"audited_qty": 0,
"non_rfid_item": false,
"epcs": [],
"item_details": {
"id": 32229,
"number": "0045468459816",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "850002",
"custom_sku": "0350295",
"style": "No",
"color": "0.15",
"size": "MS",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"dcs": "",
"dnc": false,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Without
po_numberorquery, fully received purchase orders are excluded. Sorted by PO date, newest first.Dates use
MM/DD/YY hh:mm AM/PM.totalis always 0.0.General mode:
/{tenant-code}/{location}/api/v1/purchase_orders/...withapi_key; Handheld mode:locationparameter and the handheld token.
PO Audit Data
/api/v1/purchase_orders/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2025 07:15 AM"
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2025 07:16 AM"
}
]
},
{
"item_number": "0045468459816",
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"last_seen": "03/17/2025 07:14 AM"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/purchase_orders/audits" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2025 07:15 AM"
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2025 07:16 AM"
}
]
},
{
"item_number": "0045468459816",
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"last_seen": "03/17/2025 07:14 AM"
}
]
}
]
}'Success response
{
"message": "Purchase order auditing request queued for processing."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 404 | PURCHASE_ORDER_NOT_FOUND | The purchase order 'PO0011529' could not be found. |
| 422 | AUDITING_VALIDATION_ERROR | One or more data validations failed during auditing. |
| 500 | AUDITING_PROCESSING_ERROR | An unexpected error occurred during purchase order auditing. |
The audit is queued and processed in the background.
override: truereplaces previous audit results.Validation and processing errors also include a
detailsfield.General mode:
/{tenant-code}/{location}/api/v1/purchase_orders/...withapi_key; Handheld mode:locationparameter and the handheld token.
PO Receiving Data
/api/v1/purchase_orders/receivingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"qty": 1,
"last_seen": "03/17/2025 07:15 AM",
"rssi": 90
},
{
"epc": "321AB45009E66F00236700CE",
"qty": 1,
"last_seen": "03/17/2025 07:16 AM",
"rssi": 80
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/purchase_orders/receivings" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"qty": 1,
"last_seen": "03/17/2025 07:15 AM",
"rssi": 90
},
{
"epc": "321AB45009E66F00236700CE",
"qty": 1,
"last_seen": "03/17/2025 07:16 AM",
"rssi": 80
}
]
}
]
}'Success response
{
"message": "Purchase order receiving request queued for processing."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 404 | PURCHASE_ORDER_NOT_FOUND | The purchase order 'PO0011529' could not be found. |
| 409 | DUPLICATE_ASSET_RECEIVING | Some of the scanned assets have already been received in another purchase order. |
| 422 | RECEIVING_VALIDATION_ERROR | One or more data validations failed during receiving. |
| 500 | RECEIVING_PROCESSING_ERROR | An unexpected error occurred during purchase order receiving. |
Receiving is queued and processed in the background.
When the handheld setting Prevent duplicate receiving of the same EPC is on, EPCs already received on another PO return
409with anitemsarray showing the otherpo_numberper EPC.EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs.Validation and processing errors also include a
detailsfield.General mode:
/{tenant-code}/{location}/api/v1/purchase_orders/...withapi_key; Handheld mode:locationparameter and the handheld token.
Sales
Audit Sales
/api/v1/sales/auditsPOST /{tenant-code}/{location}/api/v1/sales/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"transaction_number": "866375",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "210000000001",
"override": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2024 07:15 AM"
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2024 07:16 AM"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/sales/audits" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"transaction_number": "866375",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "210000000001",
"override": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2024 07:15 AM"
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2024 07:16 AM"
}
]
}
]
}'Success response
{
"message": "Sales audit information received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location #001 not found |
| 404 | TRANSACTION_NOT_FOUND | The transaction #866375 not found |
Audits sales order transaction_number. Only EPCs of the correct length that already exist for that item number are counted; each tag's
last_seen(MM/DD/YYYY hh:mm AM/PM) and static zone (zone.id) are updated.override: true(request) resets all previous audit results;items[].override: truemarks the item as overridden instead of audited.The order status becomes
Completedwhen every non-overridden item is fully audited, otherwisePending.
Get List of sales
/api/v1/salesGET /{tenant-code}/{location}/api/v1/salesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
transaction_number | string | optional | Exact transaction number. |
query | string | optional | Partial search on transaction number, title, note, document or reference number. |
items | boolean | optional | Include items. |
epcs | boolean | optional | With items, include read EPCs. |
items_details | boolean | optional | With items, add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/sales?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"transactions": [
{
"id": 75,
"transaction_type": "Sale",
"transaction_number": "2000",
"title": "Test request for shirt category",
"note": "",
"document_number": "",
"reference_number": "",
"status": "Created",
"transaction_date": "12/04/23 10:23 AM",
"currency": "USD",
"total": 0.0,
"user_name": "API User",
"customer_name": "",
"created_at": "12/04/23 10:23 AM",
"updated_at": "12/04/23 01:34 PM",
"expected": {
"skus": 2,
"assets": 2
},
"read": {
"skus": 0,
"assets": 0
},
"audited": {
"skus": 0,
"assets": 0
},
"items": [
{
"item_number": "210000000001",
"expected_qty": 1,
"read_qty": 0,
"audited_qty": 0,
"epcs": [],
"item_details": {
"id": 32281,
"number": "210000000001",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"style": "No",
"color": "0.15",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"price": "0.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
},
{
"item_number": "210000000002",
"expected_qty": 1,
"read_qty": 0,
"audited_qty": 0,
"epcs": [],
"item_details": {
"id": 32282,
"number": "210000000002",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"style": "No",
"color": "0.15",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"price": "80.0",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
}
]
},
{
"id": 74,
"transaction_type": "Sale",
"transaction_number": "1000",
"title": "Test request for scarf category",
"note": "",
"document_number": "",
"reference_number": "",
"status": "Pending",
"transaction_date": "12/04/23 10:23 AM",
"currency": "USD",
"total": 0.0,
"user_name": "API User",
"customer_name": "",
"created_at": "12/04/23 10:23 AM",
"updated_at": "12/04/23 01:34 PM",
"expected": {
"skus": 1,
"assets": 2
},
"read": {
"skus": 1,
"assets": 2
},
"audited": {
"skus": 0,
"assets": 0
},
"items": [
{
"item_number": "210000047202",
"expected_qty": 2,
"read_qty": 2,
"audited_qty": 0,
"epcs": [
{
"epc": "C000C30E4FA6C620000036A7",
"serial_number": "1054",
"qty": 1,
"audited": false,
"handheld": "HH-305",
"user_name": "API User",
"datetime": "03/14/23 10:45 PM"
},
{
"epc": "C000C30E4FA6C620000036A8",
"serial_number": "1055",
"qty": 1,
"audited": false,
"handheld": "HH-305",
"user_name": "API User",
"datetime": "03/14/23 10:45 PM"
}
],
"item_details": {
"id": 32283,
"number": "210000047202",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"style": "No",
"color": "0.15",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"size": "MS",
"dcs": "",
"dnc": false,
"price": "0.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location #001 not found |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns sales orders (transaction type Sale). Dates use
MM/DD/YY hh:mm AM/PM;transaction_dateis the record creation time.
Shipping
Delete a Carton
/api/v1/shipping/inbound/cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
carton_number | string | required | Carton number. |
user | string | required | User email. |
device_name | string | optional | Handheld name (logged). |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/shipping/inbound/cartons?location=$LOCATION&carton_number=<carton_number>&user=<user>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "The carton has been deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Carton number is required |
| 400 | MISSING_PARAMETER | User is required |
| 400 | NOT_FOUND | Carton with number 10000000004520000044 not found |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INTERNAL_ERROR | <exception message> |
Deletes the carton and its items from its receiving order (found by carton number). All errors return HTTP 400.
Get New Carton Number
/api/v1/shipping/inbound/carton_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
order_id | integer | required | Receiving order id. |
device_name | string | optional | Handheld name (logged). |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping/inbound/carton_number?location=$LOCATION&order_id=<order_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"carton": {
"id": 151,
"carton_number": "10000000004520000044",
"carton_sequence_number": 44
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Order ID is required |
| 400 | NOT_FOUND | Receiving order with ID 452 not found |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INTERNAL_ERROR | <exception message> |
Creates a new empty carton on the order and returns its number:
1+ order id (12 digits, zero-padded) + sequence (7 digits). All errors return HTTP 400.
Get Receiving Orders (Inbound)
/api/v1/shipping/inbound/receiving_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
asn_number | string | optional | ASN number (exact, % wildcards allowed). |
container_number | string | optional | Container number. |
po_number | string | optional | PO number. |
reference_number | string | optional | Reference number. |
query | string | optional | Partial match on ASN, container number, vendor code, vendor name or reference number. |
is_open | boolean | optional | true hides received orders (ignored when a number filter or query is sent). |
items | boolean | optional | Include items. |
cartons | boolean | optional | Include cartons. |
assets | boolean | optional | Include received assets. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping/inbound/receiving_orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"summary": {
"expected": {
"cartons": 2,
"skus": 10,
"assets": 20
},
"received": {
"cartons": 1,
"skus": 1,
"assets": 2
}
},
"orders": [
{
"id": 984331,
"note": "",
"asn_number": "038059839",
"container_number": "889002",
"po_number": "PO-100",
"vendor_code": "12",
"vendor_name": "ABC Clothing Co",
"reference_number": "8997",
"ship_date": "11/03/2025 09:11 AM",
"container_id": "5506",
"division": "AN",
"user": "API User",
"status": "Created",
"created_at": "11/04/2025 09:11 AM",
"updated_at": "11/04/2025 09:11 AM",
"pre_received_at": "",
"pre_received_by": "",
"summary": {
"expected": {
"cartons": 1,
"skus": 2,
"assets": 2
},
"received": {
"cartons": 0,
"skus": 0,
"assets": 0
}
},
"items": [
{
"id": 532225,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"status": "Sent",
"expected_qty": 4,
"received_qty": 2,
"non_rfid_item": false,
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"item_details": {
"id": 220620047,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"upc": 0,
"alu": "",
"sku": "CRYSP117-29",
"custom_sku": "",
"description": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"style": "",
"color": "",
"size": "",
"price": "0.0",
"cost_price": 0.0,
"retail_price": 70.0,
"msrp": 98.0,
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "Crysp Denim",
"manufacturer": "Crysp Denim",
"categories": [
{
"id": 118395,
"name": "Men's"
}
],
"text1": "210000004531 Crysp: Skywalker Biker Stone Wash 42",
"text2": "",
"epcs_count": 0,
"in_stock": 0
},
"cartons": [
{
"id": 2352354,
"carton_number": "10000000005640000003",
"carton_sequence_number": 3,
"user": "API User",
"device_name": "HH-564",
"status": "Created",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"expected_qty": 30,
"received_qty": 30,
"assets": [
{
"id": 45,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"text3": "Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Received",
"last_seen": "11/04/2025 09:11 AM",
"received_at": "11/04/2025 09:11 AM",
"received_by": "API User"
},
{
"id": 87,
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"text3": "UPC 3523535 - Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Received",
"last_seen": "11/04/2025 09:11 AM",
"received_at": "11/04/2025 09:11 AM",
"received_by": "API User"
}
]
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
Cancelled orders are never returned. Newest first. The top-level
summarycovers all matching orders, not just the page.
Set or Clear the Non-RFID Item Flag
/api/v1/shipping/inbound/non_rfid_itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"order_id": 24,
"user": "api@senitron.net",
"device_name": "HH-53",
"manager_user_id": 110,
"manager_user_info": "API Manager User",
"reason": "",
"non_rfid_item": true,
"items": [
"210000052980",
"210000052981",
"210000052982"
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/inbound/non_rfid_items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"order_id": 24,
"user": "api@senitron.net",
"device_name": "HH-53",
"manager_user_id": 110,
"manager_user_info": "API Manager User",
"reason": "",
"non_rfid_item": true,
"items": [
"210000052980",
"210000052981",
"210000052982"
]
}'Success response
{
"message": "The non-RFID flag was successfully set for the item(s)."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Order ID is required |
| 400 | MISSING_PARAMETER | User is required |
| 400 | MISSING_PARAMETER | Items are required |
| 400 | MISSING_PARAMETER | Non-RFID item flag is required |
| 400 | ORDER_NOT_FOUND | The specified order does not exist. |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INVALID_STATUS | Cannot update a completed receiving order |
| 400 | NOT_FOUND | User with email api@senitron.net not found |
| 400 | ITEMS_NOT_FOUND | None of the specified items exist on the receiving order. |
| 400 | INTERNAL_ERROR | <exception message> |
Sets (
non_rfid_item: true) or clears (false) the non-RFID flag on the listed item numbers of the order. Withfalsethe message says "cleared".All errors return HTTP 400.
Upload Receiving Data
/api/v1/shipping/inbound/receiving_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"order_id": 24,
"carton_number": "10000000002400000029",
"carton_sequence_number": 29,
"user": "api@senitron.net",
"device_name": "HH-53",
"comment": "",
"reason": "",
"user_manager_id": 0,
"user_manager_info": "",
"items": [
{
"item_number": "210000052983",
"non_rfid_item": false,
"expected_qty": 30,
"epcs": [
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
},
{
"epc": "321AB45009E66F00236700CE",
"serial_number": "1230",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 80
}
]
},
{
"item_number": "210000052988",
"non_rfid_item": true,
"expected_qty": 5,
"epcs": [
{
"epc": "FFFFFFFFFFFFFFFFFFFFFFFF",
"serial_number": "",
"qty": 5,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/inbound/receiving_orders" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"order_id": 24,
"carton_number": "10000000002400000029",
"carton_sequence_number": 29,
"user": "api@senitron.net",
"device_name": "HH-53",
"comment": "",
"reason": "",
"user_manager_id": 0,
"user_manager_info": "",
"items": [
{
"item_number": "210000052983",
"non_rfid_item": false,
"expected_qty": 30,
"epcs": [
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
},
{
"epc": "321AB45009E66F00236700CE",
"serial_number": "1230",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 80
}
]
},
{
"item_number": "210000052988",
"non_rfid_item": true,
"expected_qty": 5,
"epcs": [
{
"epc": "FFFFFFFFFFFFFFFFFFFFFFFF",
"serial_number": "",
"qty": 5,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
}
]
}
]
}'Success response
{
"message": "Carton data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Order ID is required |
| 400 | MISSING_PARAMETER | Carton number is required |
| 400 | MISSING_PARAMETER | User is required |
| 400 | MISSING_PARAMETER | Items are required |
| 400 | NOT_FOUND | Receiving order with ID 24 not found |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INVALID_STATUS | Cannot update a completed receiving order |
| 400 | NOT_FOUND | User with email api@senitron.net not found |
| 400 | INTERNAL_ERROR | <exception message> |
Records the scanned items of one carton (carton_number or carton_sequence_number). Non-RFID items use EPC
FFFFFFFFFFFFFFFFFFFFFFFFwith qty.A request with exactly one EPC is validated and saved immediately (errors returned). Larger requests are queued and processed in the background; validation errors are then not returned to the caller.
Get Shipping Methods
/api/v1/shipping_methodsGET /{tenant-code}/{location}/api/v1/shipping_methodsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (or store_code). |
integration_type | string | required | Must be netsuite; other values return an empty list. |
query | string | optional | Partial match on the shipping method name. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping_methods?location=$LOCATION&integration_type=<integration_type>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"shipping_methods": [
{
"id": 1203,
"name": "FedEx Ground"
},
{
"id": 1204,
"name": "UPS 2nd Day Air"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Client is not found. Please enter API Key |
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
Reads the shipping methods (ship items) live from NetSuite for the location's subsidiary.
total_entriesis the number of methods on the returned page.
Temp Transfers
Upload Temp Transfer Order Data
/api/v1/temp_transfersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"from_location_number": "001",
"to_location_number": "002",
"reason": "",
"user": "api@senitron.net",
"device_name": "HH-53",
"parent_number": "0",
"zone": {
"id": 34,
"name": "Inside 101"
},
"assets": [
{
"item_number": "210000043021",
"non_rfid_item": false,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+01:00",
"rssi": 84
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/temp_transfers" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"from_location_number": "001",
"to_location_number": "002",
"reason": "",
"user": "api@senitron.net",
"device_name": "HH-53",
"parent_number": "0",
"zone": {
"id": 34,
"name": "Inside 101"
},
"assets": [
{
"item_number": "210000043021",
"non_rfid_item": false,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+01:00",
"rssi": 84
}
]
}'Success response
{
"id": 23213,
"message": "Temporary transfer information has been saved successfully."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | No assets to transfer |
| 422 | MISSING_PARAMETER | device_name is required |
| 422 | NOT_FOUND | User is required |
| 422 | NOT_FOUND | The source location 001 not found |
| 422 | NOT_FOUND | The destination location 002 not found |
| 422 | FORBIDDEN | User does not belong to this client |
| 422 | PROCESSING_ERROR | <exception message> |
user must be an existing user of the tenant; device_name is required.
When the handheld setting Enable temporary transfers is on, a temporary transfer is saved and its
idreturned. Otherwise the assets are moved directly in the background and the response is{"message": "Transfer processing has been queued"}.EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs. All errors return HTTP 422.
Transfer Orders
Get Carton Number
/api/v1/transfer_orders/cartons/new_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
Try it with curl
curl "https://app.senitron.net/api/v1/transfer_orders/cartons/new_number?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"number": "3366",
"epc": "F11C00000000000000003366"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Reserves and returns the tenant's next carton number. epc is
F11Cfollowed by the number padded to 20 digits.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get Container Number
/api/v1/transfer_orders/containers/new_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
Try it with curl
curl "https://app.senitron.net/api/v1/transfer_orders/containers/new_number?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"number": "72491",
"epc": "F11A00000000000000072491"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Reserves and returns the tenant's next container number. epc is
F11Afollowed by the number padded to 20 digits.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get Pallet Number
/api/v1/transfer_orders/pallets/new_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
Try it with curl
curl "https://app.senitron.net/api/v1/transfer_orders/pallets/new_number?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"number": "5598",
"epc": "F11B00000000000000005598"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Reserves and returns the tenant's next pallet number. epc is
F11Bfollowed by the number padded to 20 digits.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get Transfers Orders
/api/v1/transfer_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
transfer_type | string | optional | IN or OUT relative to the location. |
transfer_id | integer | optional | Transfer id. |
query | string | optional | Partial search on id, document number, reference number. |
from_location | string | optional | Source location code. |
to_location | string | optional | Destination location code. |
shipped_date_from | date | optional | MM/DD/YYYY. |
shipped_date_to | date | optional | MM/DD/YYYY. |
status | string | optional | e.g. pending, partially_received, received. |
is_open | boolean | optional | true hides received/closed transfers. |
transfer_details | boolean | optional | Include containers/pallets/cartons/items. |
items_details | boolean | optional | Add item_details. |
assets_details | boolean | optional | Include assets. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10, maximum 100. |
Try it with curl
curl "https://app.senitron.net/api/v1/transfer_orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"summary": {
"sent": {
"containers": 1,
"pallets": 1,
"cartons": 1,
"skus": 1,
"assets": 2
},
"received": {
"containers": 0,
"pallets": 0,
"cartons": 0,
"skus": 0,
"assets": 1
}
},
"transfer_orders": [
{
"id": 984331,
"title": "",
"from_location_number": "001",
"to_location_number": "002",
"transfer_type": "IN",
"document_number": "",
"reference_number": "",
"shipped_date": "08/12/2025 09:11 AM",
"shipping_method": "",
"reason": "",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"eos_last_sync_at": "08/14/2025 10:30 AM",
"eos_last_sync_by": "API User",
"status": "Partially Received",
"user": "API User",
"device_name": "HH-453",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"summary": {
"sent": {
"containers": 1,
"pallets": 1,
"cartons": 1,
"skus": 1,
"assets": 2
},
"received": {
"containers": 0,
"pallets": 0,
"cartons": 0,
"skus": 0,
"assets": 1
}
},
"containers": [
{
"id": 10,
"number": "4501",
"epc": "F11A00000000000000004501",
"user": "API User",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"pallets": [
{
"id": 43,
"number": "91",
"epc": "F11B00000000000000000091",
"user": "API User",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"cartons": [
{
"id": 2352354,
"number": "8900032535",
"epc": "F11C00000000008900032535",
"user": "API User",
"device_name": "HH-564",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"tracking_number": "",
"tracking_number_url": "",
"items": [
{
"id": 532225,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"status": "Sent",
"sent_qty": 2,
"received_qty": 1,
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"item_details": {
"id": 220620047,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"upc": 0,
"alu": "",
"sku": "CRYSP117-29",
"custom_sku": "",
"description": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"style": "",
"color": "",
"size": "",
"price": "0.0",
"cost_price": 0.0,
"retail_price": 70.0,
"msrp": 98.0,
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "Crysp Denim",
"manufacturer": "Crysp Denim",
"categories": [
{
"id": 118395,
"name": "Men's"
}
],
"text1": "210000004531 Crysp: Skywalker Biker Stone Wash 42",
"text2": "",
"epcs_count": 10,
"in_stock": 10
},
"assets": [
{
"id": 45,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"text3": "Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Received",
"last_seen": "08/12/2025 09:11 AM",
"received_at": "08/12/2025 09:11 AM",
"received_by": "API User"
},
{
"id": 87,
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"text3": "UPC 3523535 - Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Sent",
"last_seen": "08/12/2025 09:11 AM",
"received_at": "",
"received_by": ""
}
]
}
]
}
]
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | INTERNAL_ERROR flat | Internal server error |
Newest first.
per_pageis capped at 100.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get/Print Carton Labels
/api/v1/transfer_orders/cartons/print_labelsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"id": 0,
"document_number": "DOC-123456",
"reference_number": "REF-123456",
"carton_number": "123456",
"expected_qty": 40,
"datetime": "2026-05-20T20:32:04+1:00:00.000000",
"printer_id": 5,
"print": false,
"user": "api@senitron.net",
"device_name": "HH-453",
"items": [
{
"item_number": "210000047086",
"item_name": "Ferrari",
"expected_qty": 2,
"read_qty": 2
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfer_orders/cartons/print_labels" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": 0,
"document_number": "DOC-123456",
"reference_number": "REF-123456",
"carton_number": "123456",
"expected_qty": 40,
"datetime": "2026-05-20T20:32:04+1:00:00.000000",
"printer_id": 5,
"print": false,
"user": "api@senitron.net",
"device_name": "HH-453",
"items": [
{
"item_number": "210000047086",
"item_name": "Ferrari",
"expected_qty": 2,
"read_qty": 2
}
]
}'Success response
{
"id": 0,
"print": false,
"printer": {
"id": 5,
"name": "Zebra Front Desk",
"ip": "192.168.1.50",
"port": "9100",
"type": "IP",
"method": "standard",
"visible": true
},
"payload": "nnn^XAnnn^FO0,0^GB1215,400,3^FSn^FT380,200^CI0^A0N,75^Carton#: 123^FSnn^PQ1,0,1,Yn^XZ"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | PRINTER_NOT_FOUND | The printer not found |
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Builds the ZPL label for the carton on printer printer_id and returns it in
payload. Withprint: truethe label is also sent to the printer; withfalsethe handheld can print the payload itself.When called with the API key, user (email) identifies the user.
Upload Transfer Order Data
/api/v1/transfer_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"id": 0,
"title": "",
"from_location_number": "001",
"to_location_number": "002",
"document_number": "",
"reference_number": "",
"shipped_date": "2025-08-22T20:32:04+1:00:00.000000",
"shipping_method": "",
"reason": "",
"email": "",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"user": "api@senitron.net",
"device_name": "HH-453",
"printer_id": 0,
"destination_zone": {
"id": 34,
"name": "Inside Zone A"
},
"carton_label": {
"printer_id": 12,
"print": false
},
"transfer_orders": [
{
"containers": [
{
"number": "",
"pallets": [
{
"number": "",
"cartons": [
{
"number": "",
"items": [
{
"number": "210000047086",
"name": "Ferrari",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}
]
}
]
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfer_orders" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"id": 0,
"title": "",
"from_location_number": "001",
"to_location_number": "002",
"document_number": "",
"reference_number": "",
"shipped_date": "2025-08-22T20:32:04+1:00:00.000000",
"shipping_method": "",
"reason": "",
"email": "",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"user": "api@senitron.net",
"device_name": "HH-453",
"printer_id": 0,
"destination_zone": {
"id": 34,
"name": "Inside Zone A"
},
"carton_label": {
"printer_id": 12,
"print": false
},
"transfer_orders": [
{
"containers": [
{
"number": "",
"pallets": [
{
"number": "",
"cartons": [
{
"number": "",
"items": [
{
"number": "210000047086",
"name": "Ferrari",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}
]
}
]
}
]
}
]
}'Success response
{
"id": 72491,
"pdf": "https://app.senitron.net/masoud1357/001/transactions/export/pdf/72491/ Transfer_72491_demo_mpz_co_san_diego_ca_to_los_angeles_08222025_123205.pdf",
"message": "Transfer order information has been saved successfully",
"carton_labels": {
"print": false,
"printer": {
"id": 12,
"name": "Zebra Front Desk",
"ip": "192.168.1.50",
"port": "9100",
"type": "IP",
"method": "standard",
"visible": true
},
"labels": [
{
"carton_number": "123",
"payload": "\n\n\n^XA\n\n\n^FO0,0^GB1215,400,3^FS\n^FT380,200^CI0^A0N,75^Carton#: 123^FS\n\n^PQ1,0,1,Y\n^XZ"
},
{
"carton_number": "567",
"payload": "\n\n\n^XA\n\n\n^FO0,0^GB1215,400,3^FS\n^FT380,200^CI0^A0N,75^Carton#: 567^FS\n\n^PQ1,0,1,Y\n^XZ"
}
]
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The source location 001 not found |
| 422 | LOCATION_NOT_FOUND flat | The destination location 002 not found |
| 422 | TRANSFER_ORDER_EXISTS | A transfer order with the same DOC# or REF# already exists |
| 422 | DUPLICATE_TRANSFER_ID | The Transfer ID 72491 already exists, and the transfer could not be created. |
| 422 | PERMISSION_DENIED flat | You have view-only access. Import is not permitted. |
| 422 | PROCESSING_ERROR flat | <message> |
| 422 | INTERNAL_ERROR flat | Internal server error |
Creates a transfer order (containers → pallets → cartons → items → assets). id 0 lets Senitron assign the id; a positive id that already exists is rejected.
Required:
from_location_number,to_location_numberand at least one transfer order with containers. Invalid payloads currently returnINTERNAL_ERROR.pdfis returned when printer_id is set;carton_labelswhen carton_label.printer_id is set (withcarton_label.print: truethe labels are also printed).Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Upload Transfer Order Receiving Data
/api/v1/transfer_orders/receivingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"id": 3423,
"document_number": "",
"reference_number": "",
"datetime": "2025-09-22T20:32:04+1:00:00.000000",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-453",
"zone": {
"id": 0,
"name": ""
},
"items": [
{
"item_number": "210000004501",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfer_orders/receivings" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"id": 3423,
"document_number": "",
"reference_number": "",
"datetime": "2025-09-22T20:32:04+1:00:00.000000",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-453",
"zone": {
"id": 0,
"name": ""
},
"items": [
{
"item_number": "210000004501",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}'Success response
{
"message": "Transfer order receiving information has been saved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location #001 not found |
| 422 | TRANSFER_NOT_FOUND flat | The transfer #3423 not found |
| 422 | TRANSFER_ALREADY_RECEIVED flat | This transfer has already been completely received and cannot be processed again |
| 422 | INTERNAL_ERROR flat | Internal server error |
Receives transfer id at location; processing runs in the background.
Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Merge the Transfer Orders
/api/v1/transfer_orders/mergeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/transfer_orders/merge" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}'Success response
{
"message": "The selected transfers have been merged successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | INVALID_PARAMS flat | base_transfer is required |
| 422 | INVALID_PARAMS flat | At least one merged_transfer is required |
| 422 | TRANSFER_NOT_FOUND flat | Base transfer #27843 not found |
| 422 | NO_VALID_TRANSFERS flat | No valid transfers to merge. Invalid transfers are ignored. |
| 422 | INVALID_PARAMS flat | user is required (provide user email when using API key authentication) |
| 422 | PERMISSION_DENIED flat | You have view-only access. Import is not permitted. |
| 422 | PROCESSING_ERROR flat | Failed to merge transfer orders |
Merges merged_transfers (array or comma-separated ids) into base_transfer. Only transfers with the same source and destination that are not received or closed are merged.
user (email) is required when calling with the API key.
Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Wave Orders & Picking (WOP)
Assign a Wave Order to an User
/api/v1/wop/picking/orders/assignRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/wop/picking/orders/assign" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28
}'Success response
{
"message": "The wave order has been assigned to the specified user."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | VALIDATION_ERROR | The wave order user assignment can only be updated when the wave order status is Created or Firmed, unless you have the Force User Assign permission. |
| 422 | INTERNAL_ERROR | Failed to assign wave order |
Assigns wave order wave_id to user. Allowed only while the order is
createdorfirmed, unless the user has the Force user assign permission.All errors return HTTP 422. user must be an existing user email of the tenant.
Delete Pick List Item Assets
/api/v1/wop/picking/orders/items/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
}
]
}Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/wop/picking/orders/items/assets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
}
]
}'Success response
{
"message": "The wave order picking asset(s) have been deleted."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | MISSING_PARAMETER | items array is required |
| 422 | INTERNAL_ERROR | Failed to delete picking assets |
Un-picks the listed assets from the wave order items.
All errors return HTTP 422. user must be an existing user email of the tenant.
Delete Wave Orders Picking Items
/api/v1/wop/picking/orders/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"add_to_chase_list": false,
"remove_action": "",
"items": [
{
"item_number": "210000006265",
"expected_qty": 1,
"picked_qty": 0,
"order_type": "SO",
"source": "Shopify",
"reference_number": "SO212342144",
"zone": {
"id": 56,
"name": "A25-3-A",
"order": 2,
"qty": 1
},
"reason": "The item not found"
}
]
}Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/wop/picking/orders/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"add_to_chase_list": false,
"remove_action": "",
"items": [
{
"item_number": "210000006265",
"expected_qty": 1,
"picked_qty": 0,
"order_type": "SO",
"source": "Shopify",
"reference_number": "SO212342144",
"zone": {
"id": 56,
"name": "A25-3-A",
"order": 2,
"qty": 1
},
"reason": "The item not found"
}
]
}'Success response
{
"message": "Item(s) removed from wave order successfully."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | MISSING_PARAMETER | items array is required |
| 422 | VALIDATION_ERROR | Wave order status must be created or firmed or picking |
| 422 | INTERNAL_ERROR | Failed to remove item from wave order |
Removes items from a wave order in status
created,firmedorpicking. remove_action defaults toadd_to_chase_listwhenadd_to_chase_list: true, otherwiseundo_wave;items[].reasonis logged.The wave order is cancelled when no items remain, or finished when the remaining items are fully picked.
All errors return HTTP 422. user must be an existing user email of the tenant.
Get Wave Orders Picking List
/api/v1/wop/picking/ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
wave_id | integer | optional | Exact wave order id. |
query | string | optional | Partial match on id, title or reference number. |
status | string | optional | created, firmed, picking, picked, … |
assigned_to | string | optional | User email, or nobody for unassigned orders. |
is_open | boolean | optional | true = only firmed or picking orders. |
items | boolean | optional | Include items. |
assets | boolean | optional | With items, include picked assets. |
items_zones | boolean | optional | With items, include item_zones. |
items_details | boolean | optional | With items, add item_details. |
sort_field | string | optional | Default id. |
sort_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10, maximum 100; 0 = 100. |
Try it with curl
curl "https://app.senitron.net/api/v1/wop/picking/orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"orders": [
{
"id": 28,
"reference_number": "599123",
"title": "Wave Order 28",
"wave_type": "SO-Single",
"due_date": "10/20/2025 10:30 AM",
"user": "api@senitron.net",
"user_name": "API User",
"progress": 90,
"assigned_to": "api@senitron.net",
"assigned_to_name": "API User",
"start_time": "10/20/2025 10:30 AM",
"end_time": "10/20/2025 10:45 AM",
"created_at": "10/20/2025 10:30 AM",
"updated_at": "10/20/2025 10:45 AM",
"status": "created",
"bulk_customer": false,
"customer": {
"id": 0,
"code": "",
"name": ""
},
"expected": {
"skus": 2,
"assets": 4
},
"picked": {
"skus": 0,
"assets": 0
},
"last_picked_zone": {
"id": 0,
"name": ""
},
"items": [
{
"item_number": 210000001209,
"expected_qty": 1,
"picked_qty": 1,
"order_type": "SO",
"source": "Shopify",
"reference_number": "SO100200300",
"zone": {
"id": 56,
"name": "A25-3-A",
"order": 3,
"qty": 1
},
"assets": [
{
"id": 478,
"epc": "CF19930E4F9B8B900000041E",
"serial_number": "1054",
"qty": 1,
"device_name": "HH-305",
"user": "api@senitron.net",
"user_name": "API User",
"last_seen": "03/14/2023 10:45 PM",
"picked": true,
"picked_zone": {
"id": 0,
"name": ""
}
}
],
"item_zones": [
{
"id": 453,
"name": "A25-4-A",
"order": 5,
"qty": 2
},
{
"id": 458,
"name": "A25-5-A",
"order": 8,
"qty": 3
},
{
"id": 459,
"name": "A25-6-A",
"order": 11,
"qty": 1
}
],
"item_details": {
"id": 3243281,
"number": "210000001209",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "60032222",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"style": "No",
"color": "0.15",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "814.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 118395,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | INVALID_STATUS | Invalid status: done |
| 422 | INVALID_EMAIL | Invalid email format: abc |
| 422 | USER_NOT_FOUND | User not found with email: x@example.com |
| 422 | INTERNAL_ERROR | Internal server error |
Each order adds
bulk_customerand acustomerobject (id,code,name). Transfer-mode wave orders also includereference_detailswith the transfer's source and destination locations.Items are sorted by zone order, then reference number. Times are in the location's time zone.
per_pageis capped at 100.
Get WOP Settings
/api/v1/wop/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code (General mode: from the URL). |
Try it with curl
curl "https://app.senitron.net/api/v1/wop/settings?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"so_processing_interval": 20,
"picked_asset_status": {
"id": 7197,
"name": "Picked",
"include_inventory": false
},
"shipped_asset_status": {
"id": 7198,
"name": "ECOM Shipped",
"include_inventory": false
},
"update_picked_asset_zones_when_new_zone_detected": false,
"wo_picking_update_static_and_rfid_zone": true,
"auto_shipped_when_opening_so": true,
"auto_ship_multi_so_items": true,
"prevent_duplicate_epcs": true,
"auto_reject_before_waving": true,
"wo_modes": [
{
"mode": 1,
"title": "SO-Single",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [
{
"id": 1,
"name": "DC Pick"
}
],
"picking_cart_zones": [
{
"id": 2,
"name": "ECOM PICK CART"
}
],
"shipped_zone": {
"id": 3,
"name": "ECOM SHIPPED"
},
"enable_auto_firm": false
},
{
"mode": 2,
"title": "SO-Multi",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 3,
"title": "SO-Single-AMZ",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [
{
"id": 1,
"name": "DC Pick"
}
],
"picking_cart_zones": [
{
"id": 2,
"name": "ECOM PICK CART"
}
],
"shipped_zone": {
"id": 3,
"name": "ECOM SHIPPED"
},
"enable_auto_firm": false
},
{
"mode": 4,
"title": "SO-Multi-AMZ",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 5,
"title": "TO",
"max_order_count": 1,
"max_order_qty": 100,
"picking_zones": [
{
"id": 1,
"name": "DC Pick"
}
],
"picking_cart_zones": [
{
"id": 2,
"name": "ECOM PICK CART"
}
],
"shipped_zone": {
"id": 3,
"name": "ECOM SHIPPED"
},
"enable_auto_firm": false
},
{
"mode": 6,
"title": "SO-Single-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 7,
"title": "SO-Multi-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 8,
"title": "SO-Single-AMZ-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 9,
"title": "SO-Multi-AMZ-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 10,
"title": "TO-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
Returns the tenant's Wave Order Picking settings and modes. Missing statuses or zones are returned with id 0 and empty names.
POST Wave Orders Picking Items
/api/v1/wop/picking/orders/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"reference_number": "SO2352324",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"reference_number": "SO2352324",
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/wop/picking/orders/items" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"reference_number": "SO2352324",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"reference_number": "SO2352324",
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
}
]
}'Success response
{
"message": "The wave order picking item(s)/asset(s) have been received and saved in the cloud."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | MISSING_PARAMETER | items array is required |
| 422 | VALIDATION_ERROR | Wave order has already been picked |
| 422 | EPC_ALREADY_PICKED | The EPC has already been picked in WO# 27 for item# 210000006265 |
| 422 | INTERNAL_ERROR | Failed to save picking data |
Records picked assets for the wave order items. Unknown EPCs are created from the EPC profile.
assets[].last_seenandassets[].zone.idupdate the tag (static zone, and RFID zone when the WOP setting is on).Picked tags get the WOP Picked status. When Prevent duplicate EPCs is on, an EPC picked in another wave order is rejected.
All errors return HTTP 422. user must be an existing user email of the tenant.
Settings
Get Handheld Settings
/api/v1/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Api-Key | <tenant api key> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code; selects location-specific values (e.g. main integration). |
device_id | integer | optional | Device id; selects the app build for current_version. |
model | string | optional | Handheld model key (overrides device_id). |
Try it with curl
curl "https://app.senitron.net/api/v1/settings" \ -H "Authorization: $SENITRON_TOKEN" \ -H "Api-Key: $SENITRON_API_KEY"
Success response
{
"auto_login": false,
"remember_username": true,
"remember_password": true,
"bin_number_catalog_field": "attr3",
"advanced_picking_module": false,
"check_version": true,
"current_version": "1.24.0",
"min_version": "1.20.0",
"current_version_url": "https://senitroncloud.s3.amazonaws.com/uploads/handheld_apk/SenitronRFID-v1.24.0.apk",
"timezone": "America/Los_Angeles",
"check_timezone": true,
"storage_unit": false,
"default_location": {
"code": "001",
"name": "Floor-1"
},
"api_url": "https://app.senitron.net/api/v1",
"upload_mode": "api",
"active_integrations": [
{
"name": "Lightspeed",
"enabled": true
}
],
"wave_order_picking": {
"power_lock": false,
"power_lock_value": 300,
"rssi_lock": false,
"rssi_lock_value": 60
},
"ui_settings": {
"audit_sales_order": {
"expected": "Expect",
"read": "Read",
"missing": "Missing",
"over": "Over",
"unwanted_assets": "Unwanted Asset(s)"
}
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key |
| 401 | UNAUTHORIZED | Invalid Token |
Requires both the
Api-Keyheader and theAuthorizationtoken.Returns the full handheld configuration: every handheld setting flag (about 150 keys — shortened here), the latest app version for the device model, the default location and S3 upload settings. The handheld app reads it after login.
Get Locations
/api/v1/settings/locationsGET /{tenant-code}/api/v1/settings/locationsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) — or Api-Key: <tenant api key> |
Try it with curl
curl "https://app.senitron.net/api/v1/settings/locations" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"default_location": {
"code": "001",
"name": "Floor-1"
},
"locations": [
{
"name": "Floor-1",
"code": "001",
"assigned_to_user": true,
"eos_location_id": "12",
"company_code": ""
},
{
"name": "Warehouse",
"code": "002",
"assigned_to_user": false,
"eos_location_id": "",
"company_code": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
With a token: the locations assigned to the calling handheld. With
api_key: all locations of the tenant. Sorted by code.assigned_to_useris true when the logged-in user has access to the location;eos_location_idis the external-system location id.
Get UI Settings (Column Labels)
/api/v1/settings/uiRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Try it with curl
curl "https://app.senitron.net/api/v1/settings/ui" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"attributes": [
{
"default_label": "Asset ID",
"name": "col_asset_id",
"user_label": "Item #"
},
{
"default_label": "ALU",
"name": "col_alu",
"user_label": "ALU"
},
{
"default_label": "Name / Description",
"name": "col_name",
"user_label": "Description"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Lists every catalog/inventory column with its default label and the tenant's custom label (about 50 entries). Use it to label fields the same way as the web app.
Get App Version
/api/v1/versionRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
device_id | integer | optional | Device id; selects the app build for the device model. |
Try it with curl
curl "https://app.senitron.net/api/v1/version" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"check_version": true,
"current_version": "1.24.0",
"current_version_url": "https://senitroncloud.s3.amazonaws.com/uploads/handheld_apk/SenitronRFID-v1.24.0.apk"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Returns the latest handheld app version for the device's model and whether the app should check for updates.
Users
Get Users
/api/v1/usersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | optional | Location code. |
user_id | integer | optional | Exact user id. |
user_email | string | optional | Exact email. |
pin_number | string | optional | Exact PIN. |
query | string | optional | Match on email, first or last name (use % as a wildcard). |
permissions | boolean | optional | Add warehouse-role permissions. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/users" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"users": [
{
"id": 110,
"name": "Jane",
"last_name": "Doe",
"email": "jane@example.com",
"role": "Store Manager",
"pin_number": "4821",
"default_location": "001",
"locations": [
{
"code": "001",
"name": "Floor-1"
}
],
"permissions": {
"warehouse_manager": true,
"warehouse_employee": false
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
Lists the tenant's users. Only one filter is applied, in this order:
user_id,user_email,pin_number,query.permissionsisnullunless requested.
External System Quantities
Request External Quantities Download
/api/v1/external/inventory/quantitiesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"device_id": 51,
"item_number": [
"210000047060"
],
"category": [
"Tops"
],
"brand": [],
"style": [],
"type": []
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/external/inventory/quantities" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_id": 51,
"item_number": [
"210000047060"
],
"category": [
"Tops"
],
"brand": [],
"style": [],
"type": []
}'Success response
{
"status": "OK",
"job_id": "ext_quantity_download_67_12_51_1791320000"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 404 | NO_INTEGRATION | The client has no external integration |
| 422 | BLANK_REQUEST | No values in payload |
| 500 | SYSTEM | <exception message> |
Starts a background job that downloads current quantities from the external system (Lightspeed) for the selected items. Select items by any of
item_number,category,brand,style,type(arrays); at least one is required.Poll Get External Quantities Job Status with the returned
job_id; progress is also pushed over the websocket.Lightspeed tenants only (the tenant must have a Lightspeed integration).
Compare External Quantities with Scan
/api/v1/external/inventory/quantities/compareRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"job_id": "ext_quantity_download_67_12_51_1791320000",
"inventory_log_id": 86877
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/external/inventory/quantities/compare" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"job_id": "ext_quantity_download_67_12_51_1791320000",
"inventory_log_id": 86877
}'Success response
{
"status": "OK",
"job_id": "ext_quantity_download_67_12_51_1791320000"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 404 | NO_INTEGRATION | The client has no external integration |
| 200 | — | {"status": "DOES_NOT_EXIST", "job_id": "…"} |
| 500 | SYSTEM | <exception message> |
Compares the downloaded external quantities of job job_id with Senitron and with inventory upload inventory_log_id, in the background.
When finished, the job's
file_url(see Get External Quantities Job Status) points to a JSON file with per itemsn_quantity,ext_quantity,differenceandscan_quantity. The Compare-page import table is updated too.Lightspeed tenants only (the tenant must have a Lightspeed integration).
Get External Quantities Job Status
/api/v1/external/inventory/quantities/statusRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
job_id | string | required | Job id (also accepted as id). |
Try it with curl
curl "https://app.senitron.net/api/v1/external/inventory/quantities/status?location=$LOCATION&job_id=<job_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"status": "Completed",
"job_id": "ext_quantity_download_67_12_51_1791320000",
"last_message": "Job Complete",
"file_url": "https://senitroncloud.s3.amazonaws.com/hh/external_inventory_compare/lightspeed/acme_001/ext_quantity_download_67_12_51_1791320000.json"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | SYSTEM | <exception message> |
statusisNot Foundfor unknown job ids.
Sync Quantities to External System
/api/v1/external/inventory/syncRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"job_id": "ext_quantity_download_67_12_51_1791320000",
"item_numbers": [
"210000047060",
"210000047061"
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/external/inventory/sync" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"job_id": "ext_quantity_download_67_12_51_1791320000",
"item_numbers": [
"210000047060",
"210000047061"
]
}'Success response
{
"status": "OK",
"sync_id": "ls_sync_1791320100",
"message": "Initiated"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 200 | — | {"status": "busy", "message": "Another Job in progress, try later"} |
| 200 | SYSTEM | <sync errors or exception message> |
Pushes Senitron quantities of item_numbers to Lightspeed (without backup) and links the sync to download job job_id.
When another Lightspeed sync is pending the call answers
busy.Lightspeed tenants only (the tenant must have a Lightspeed integration).
Pallet Build
Pallet Build EPCs Info
/api/v1/shipping/pb/epcs/infoRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"epcs": [
"C000C30E4F9B40200000063F",
"C000C30E4F9B402000000640"
],
"page": 1,
"per_page": 100
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/pb/epcs/info" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"epcs": [
"C000C30E4F9B40200000063F",
"C000C30E4F9B402000000640"
],
"page": 1,
"per_page": 100
}'Success response
{
"pagination": {
"current_page": 1,
"per_page": 100,
"total_entries": 1
},
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"item_number": "176987",
"item_name": "Shirt",
"serial_number": "1599",
"carton_number": "00008879860012617423",
"recorded_datetime": "03/09/2026 11:18 PM",
"text1": "176987 Shirt",
"text2": "blue L",
"text3": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Returns the listed EPCs that are currently packed in a Pallet Build carton (not returned), with their carton.
Pallet Build Return and Unallocate
/api/v1/shipping/pb/epcs/returnRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"datetime": "03/10/2026 09:15 AM",
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"rssi": 70
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/pb/epcs/return" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"datetime": "03/10/2026 09:15 AM",
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"rssi": 70
}
]
}'Success response
{
"message": "The EPCs received successfully as return and unallocate"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
Marks the EPCs as returned from their Pallet Build cartons (unallocated) and records a return transaction. EPCs not in a carton are ignored.
datetime is required (the return time). A notification email is sent when configured.
Get Pallet Build Purchase Orders
/api/v1/shipping/pb/purchase_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
po_number | string | optional | Exact PO number. |
bol_number | string | optional | Exact BOL number. |
query | string | optional | Exact PO, BOL, master BOL, reference or DC number, or partial carton number. |
cartons | boolean | optional | Include each PO's cartons. |
carton_number | string | optional | With po_number/bol_number: filter cartons. |
dc_number | string | optional | With po_number/bol_number: filter by DC. |
alias_carton_number | string | optional | With po_number/bol_number: filter by alias carton number. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping/pb/purchase_orders?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"purchase_orders": [
{
"id": 812,
"po_number": "PO-4410",
"bol_number": "67566",
"master_bol_number": "4177",
"reference_number": "",
"shipment_number": "",
"bols": [
{
"bol_number": "67566",
"expected": {
"cartons": 1,
"items": 2,
"assets": 12
},
"read": {
"cartons": 1,
"items": 2,
"assets": 12
}
}
],
"dcs": [
{
"dc_number": "DC-07",
"expected": {
"cartons": 8,
"items": 16,
"assets": 96
},
"read": {
"cartons": 3,
"items": 6,
"assets": 36
}
}
],
"cartons_count": {
"expected": 40,
"read": 12
},
"expected": {
"items": 80,
"assets": 480
},
"read": {
"items": 24,
"assets": 144
},
"status": "incomplete",
"create_date": "03/01/2026 08:00 AM",
"update_date": "03/09/2026 11:18 PM",
"cartons": []
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
Pallet Build purchase orders (from imported carton waves), most recently updated first, with BOL, DC and carton progress.
Get Pallet Build Cartons
/api/v1/shipping/pb/cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
carton_number | string | optional | Carton or alias carton number. |
cartons_in_same_po | boolean | optional | With carton_number: return all cartons of that carton's PO. |
pallet_id | integer | optional | Cartons on this pallet. |
alias_carton_number | string | optional | Alias carton number. |
query | string | optional | Exact carton, BOL, PO, master BOL, reference, DC number or pallet id. |
po_number | string | optional | PO number. |
dc_number | string | optional | DC number. |
upc | string | optional | Cartons containing this UPC. |
status | string | optional | incomplete, completed, deleted, … |
updated_from_last_mins | integer | optional | Only cartons updated in the last N minutes. |
items | boolean | optional | Include carton items. |
items_epcs | boolean | optional | With items: include recorded EPCs. |
items_details | boolean | optional | With items: add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping/pb/cartons?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"cartons": [
{
"id": 812,
"carton_number": "00008879860012617423",
"alias_carton_number": "",
"expected": {
"items": 2,
"assets": 12
},
"read": {
"items": 2,
"assets": 12
},
"status": "completed",
"create_date": "03/09/2026 10:02 AM",
"update_date": "03/09/2026 11:18 PM",
"po_number": "PO-4410",
"bol_number": "67566",
"master_bol_number": "4177",
"reference_number": "",
"pallet_id": 31,
"dc_number": "DC-07",
"shipment_number": "",
"user_id": 110,
"user_info": "api@senitron.net - API User",
"manager_user_id": 0,
"manager_user_info": "",
"handheld_name": "HH-53",
"comment": "",
"request_date": "",
"cancel_date": "",
"file": "wave_0309.csv",
"po_cartons": {
"expected": 40,
"read": 12
},
"bol_cartons": {
"expected": 20,
"read": 9
},
"dc_cartons": {
"expected": 8,
"read": 3
},
"ship_to_location": "Store 12",
"items": [
{
"item_number": "176987",
"item_name": "Shirt",
"expected_qty": 6,
"read_qty": 6,
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"last_seen": "03/09/2026 11:18 PM",
"rssi": 90
}
],
"item_details": null
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
po_cartons,bol_cartonsanddc_cartonscounts are filled only when searching bycarton_number(or bypo_number+dc_number+upc).
Upload Pallet Build Carton
/api/v1/shipping/pb/cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"id": "carton-sync-0001",
"carton_number": "00008879860012617423",
"alias_carton_number": "",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"datetime": "03/09/2026 11:18 PM",
"comment": "",
"check_duplicate_epcs": true,
"manager_override_code": "",
"manager_user_info": "",
"items": [
{
"item_number": "176987",
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"last_seen": "03/09/2026 11:18 PM"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/pb/cartons" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"id": "carton-sync-0001",
"carton_number": "00008879860012617423",
"alias_carton_number": "",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"datetime": "03/09/2026 11:18 PM",
"comment": "",
"check_duplicate_epcs": true,
"manager_override_code": "",
"manager_user_info": "",
"items": [
{
"item_number": "176987",
"epcs": [
{
"epc": "C000C30E4F9B40200000063F",
"last_seen": "03/09/2026 11:18 PM"
}
]
}
]
}'Success response
{
"message": "Carton Data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | CARTON_NOT_FOUND | No carton exists with carton number: 00008879860012617423 |
| 404 | Exceptions::CartonDeletedError | This Carton is deleted, You can not upload content |
| 404 | Exceptions::CountMatchError | Tags Count do not match the Carton Expected quantity |
| 404 | Exceptions::DuplicateEpcError | There is a duplicate epc which is recorded before: C000C30E4F9B40200000063F |
| 404 | <exception class> | <exception message> |
Records the EPCs packed in an imported carton (replacing previous reads) and marks it
completed. Unknown EPCs are added to inventory as Live.Each item's EPC count must equal its expected quantity unless a manager override is given (
manager_override_code= manager PIN, ormanager_user_id).check_duplicate_epcs: truerejects EPCs already in another carton; otherwise a notification is sent.id is an optional sync id: re-sending the same id for the carton returns success without changes.
Delete Pallet Build Carton
/api/v1/shipping/pb/cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
carton_number | string | required | Carton number. |
handheld_name | string | optional | Handheld name (logged). |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/shipping/pb/cartons?location=$LOCATION&carton_number=<carton_number>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "Carton Deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> (e.g. unknown carton) |
Marks the carton as
deletedand logs it.
Create Pallet
/api/v1/shipping/pb/pallets/newRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping/pb/pallets/new?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pallet": {
"id": 32
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Creates a new empty pallet (status
incomplete) and returns its id. Note: this is a GET that creates data.
Get Pallets
/api/v1/shipping/pb/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
pallet_id | integer | optional | Pallet id. |
query | string | optional | Exact pallet id or BOL/PO/master BOL/reference/carton number of a carton on it. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/shipping/pb/pallets?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"pallets": [
{
"id": 31,
"cartons_count": 4,
"items_count": 7,
"assets_count": 48,
"shipment_number": "0",
"user_id": 110,
"user_info": "api@senitron.net - API User",
"create_date": "03/09/2026 10:00 AM",
"update_date": "03/09/2026 11:20 PM",
"shipping_status": "",
"shipping_datetime": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
Pallets that are not deleted, most recently updated first.
Upload Pallet
/api/v1/shipping/pb/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"pallet_id": 31,
"user": "api@senitron.net",
"user_name": "API User",
"cartons": [
{
"carton_number": "00008879860012617423",
"action": "new"
},
{
"carton_number": "00008879860012617424",
"action": "delete"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/pb/pallets" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"pallet_id": 31,
"user": "api@senitron.net",
"user_name": "API User",
"cartons": [
{
"carton_number": "00008879860012617423",
"action": "new"
},
{
"carton_number": "00008879860012617424",
"action": "delete"
}
]
}'Success response
{
"message": "Pallet Data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> (e.g. unknown pallet) |
Adds cartons with
action: "new"to the pallet and removes cartons withaction: "delete".
Delete Pallet
/api/v1/shipping/pb/palletsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
pallet_id | integer | required | Pallet id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/api/v1/shipping/pb/pallets?location=$LOCATION&pallet_id=<pallet_id>" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"message": "Pallet Deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | <exception class> | <exception message> |
Removes all cartons from the pallet and marks it
deleted.
Move Cartons Between Pallets
/api/v1/shipping/pb/pallets/moveRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"source_pallet_id": 31,
"destination_pallet_id": 0,
"remove_empty_source_pallet": true,
"user": "api@senitron.net",
"user_name": "API User",
"cartons": [
{
"carton_number": "00008879860012617423"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/pb/pallets/move" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"source_pallet_id": 31,
"destination_pallet_id": 0,
"remove_empty_source_pallet": true,
"user": "api@senitron.net",
"user_name": "API User",
"cartons": [
{
"carton_number": "00008879860012617423"
}
]
}'Success response
{
"message": "The carton(s) moved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | PalletNotFound | Source pallet 31 not found |
| 404 | PalletNotFound | Destination pallet 40 not found |
| 404 | <exception class> | <exception message> |
destination_pallet_id: 0creates a new pallet. Withremove_empty_source_pallet: truean emptied source pallet is deleted.
Print Pallet Label
/api/v1/shipping/pb/pallets/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"pallet_id": 31,
"printer_id": 5,
"count": 1,
"add_to_inventory": true
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/shipping/pb/pallets/print" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"pallet_id": 31,
"printer_id": 5,
"count": 1,
"add_to_inventory": true
}'Success response
{
"message": "Pallet label printed"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | Exceptions::PalletNotFound | Pallet with the number not found |
| 404 | <exception class> | <exception message> |
Prints count (default 1) pallet labels in the background.
add_to_inventory(default true) adds the pallet's EPC to inventory as Live.
Scan & Print
Get Printers (Scan & Print)
/api/v1/scanprints/printersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Partial match on printer name. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/scanprints/printers?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"printers": [
{
"id": 5,
"name": "Zebra Front Desk",
"ip": "192.168.1.50",
"port": "9100",
"type": "IP",
"template": "^XA … ^XZ",
"method": "standard",
"non_rfid_labels": false,
"default": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Visible printers of the location, sorted by name.
templateis the printer's ZPL label template.
Scan & Print Labels
/api/v1/scanprints/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Request-Id | Optional idempotency key; a repeated id returns 409 DUPLICATE_REQUEST. |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"printer_id": 5,
"item_number": "210000047060",
"number_of_tags": 1,
"number_of_copies": 1,
"serial_number": "",
"container_qty": 1,
"add_to_inventory": true,
"receiving_date": "10/07/2026",
"print": true,
"items_details": false
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/scanprints/print" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Request-Id: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"device_name": "HH-53",
"printer_id": 5,
"item_number": "210000047060",
"number_of_tags": 1,
"number_of_copies": 1,
"serial_number": "",
"container_qty": 1,
"add_to_inventory": true,
"receiving_date": "10/07/2026",
"print": true,
"items_details": false
}'Success response
{
"items": [
{
"datetime": "10/07/2026 09:15 AM",
"payload": "^XA^FO50,50^A0N,40^FDClassic Tee^FS^RFW,H^FD...^FS^XZ",
"item_number": "210000047060",
"serial_number": "1025",
"epc": "CF19930E4FA6BD4000000401",
"item_details": null,
"number_of_tags": 1,
"number_of_copies": 1,
"container_qty": 1,
"add_to_inventory": true,
"status": "printed",
"prints_via_cdm": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | The item was not found. Please enter correct item number / alu / sku / upc / ean / custom_sku |
| 422 | PRINTING_DISABLED | The printing functionality has been disabled for this item |
| 404 | PRINTER_NOT_FOUND | Printer not found. Please enter correct printer id |
| 422 | NON_RFID_ITEM | This item is marked as Non-RFID and cannot be printed |
| 400 | PRINTER_TEMPLATE_ERROR | Error generating ZPL from template, check template code: … |
| 400 | INTERNAL_ERROR | <exception message> |
| 409 | DUPLICATE_REQUEST | A record with this request_id has already been processed |
Creates a print job for number_of_tags new serialized tags of the item and returns one entry per tag with its new epc, serial number and the ZPL payload.
item_number may be the item number, ALU, SKU, UPC, EAN or custom SKU.
serial_numberis stored as the alt serial.print: true(or a CDM printer) sends the job to the printer;print: falseonly returns the payload so the handheld can print it.add_to_inventory: truecreates the tags as Live assets (ignored for non-RFID label printers and closed-loop locations);receiving_date(MM/DD/YYYY) is stored on them.For marker tags send
type: "marker_tag"withserial_number_from/serial_number_to.
Get Print History
/api/v1/scanprints/historyRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
query | string | optional | Partial match on item number or alt serial. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/api/v1/scanprints/history?location=$LOCATION" \ -H "Authorization: $SENITRON_TOKEN"
Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"items": [
{
"datetime": "2026-10-07T09:15:02.000-07:00",
"payload": "^XA^FO50,50^A0N,40^FDClassic Tee^FS^RFW,H^FD...^FS^XZ",
"item_number": "210000047060",
"serial_number": "1025",
"epc": "CF19930E4FA6BD4000000401",
"item_details": null,
"number_of_tags": 1,
"number_of_copies": 1,
"add_to_inventory": true,
"status": "printed"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid Token |
Serial print jobs of the location, newest first.
datetimeis ISO 8601.
Bulk Print Labels
/api/v1/scanprints/bulk_printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Authorization | <token> (from Login) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location | string | required | Location code. |
Request body
{
"location": "001",
"user": "api@senitron.net",
"printer_id": 5,
"result": true,
"print": true,
"item_details": false,
"items": [
{
"item_number": "210000047060",
"qty": 3
},
{
"item_number": "CT-BLK-L",
"qty": 2
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/api/v1/scanprints/bulk_print" \
-H "Authorization: $SENITRON_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"printer_id": 5,
"result": true,
"print": true,
"item_details": false,
"items": [
{
"item_number": "210000047060",
"qty": 3
},
{
"item_number": "CT-BLK-L",
"qty": 2
}
]
}'Success response
{
"items": [
{
"datetime": "10/07/2026 09:20 AM",
"item_number": "210000047060",
"item_details": {},
"tags": [
{
"serial_number": "1026",
"epc": "CF19930E4FA6BD4000000402",
"add_to_inventory": false,
"payload": "^XA^FO50,50^A0N,40^FDClassic Tee^FS^RFW,H^FD...^FS^XZ"
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found |
| 404 | PRINTER_NOT_FOUND | The selected printer is not valid. Please select a new printer |
| 400 | ITEMS_NOT_FOUND | No item sent |
| 400 | USER_NOT_FOUND | User not found |
| 400 | ITEMS_NOT_FOUND | None of the sent items exist. Please try agian |
| 422 | — | {"message": "Something went wrong, Please try again later!"} |
Prints qty labels for each item (item number, ALU, SKU, …) on printer_id. user must be an existing user email.
Without
result: truethe response is{"message": "The print job scheduled successfully"}. Withresult: trueandprint: falsethe jobs run in the background (same message).With
result: trueandprint: truethe labels are printed now and the response lists each job's tags and ZPL payloads (this can take a while for large quantities).
General Mode APIs
Server-to-server integration endpoints. Paths are scoped by tenant and location — /{tenant-code}/{location}/api/v1/… — and authenticate with the tenant api_key.
- EPCs & Tags3
- Alerts2
- Assets6
- Catalog1
- EOS2
- EPC Settings2
- ERC1
- Inventory12
- Lightspeed POS1
- Transfer Orders8
- Purchase Orders3
- Sales1
- Manufacturing1
- Shipping5
- Temp Transfers1
- Tenant Validation1
- CDM1
- Utilities1
- Sale / Return Transactions6
- Transfers7
- Wave Orders & Picking (WOP)6
- Settings1
- Catalog (Tenant)5
- Manufacturing Catalog9
- Locations1
- Inventory Compare2
- Webhooks3
- Items & Tag Metadata (Legacy POS)9
- EPC Tags (Readers & POS)5
- Readers & Devices6
- Bills of Lading (BOLs)2
- IITS Tracking1
- Inbound Imports2
- Inventory Export (Legacy)3
- Printing8
- Imports1
- Pallet Build3
- Catalog Import4
- Manufacturing Tags7
- Manufacturing Receiving10
- Manufacturing Integration (ERP)10
- Manufacturing ERP Orders8
- Manufacturing Documents (PDF)14
- Reports1
EPCs & Tags
Item Data
/{tenant-code}/{location}/api/v1/epcs/itemRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: taken from the URL). |
item_number | string | optional | Item number. Also matches ALU or SKU when the handheld setting item search using main catalog attributes is on. |
epc | string | optional | EPC or alt serial (used when item_number is not sent). |
show_epc | boolean | optional | Include the EPC list (epcs). |
show_all_epcs | boolean | optional | With epc: include all in-inventory EPCs of the same item. |
include_in_inventory | boolean | optional | With item_number: only EPCs whose status counts toward inventory. |
status | string | optional | With item_number: only EPCs with this status name. |
detail | boolean | optional | Add extra EPC fields and a ui_settings object. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epcs/item?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"item": {
"id": 6819981,
"number": "0000000000000127",
"name": "Arabian Cordura Saddle",
"upc": 0,
"alu": "000127",
"sku": "12794849",
"ean": "",
"description": "Arabian Cordura Saddle",
"style": "",
"colour": "BLACK 15.5 ARABIAN",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "814.9900",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN,814.99",
"in_stock": 1,
"epcs_count": 1,
"epcs": [
{
"id": 14131,
"epc_id": "CF00000000001FC00000000B",
"asset_id": "11",
"text3": "11/01/2019 01:56 PM,1000",
"first_seen": "11/01/2019 01:56 PM",
"last_seen": "11/01/2019 01:56 PM",
"last_seen_antenna": "1001",
"last_zone": "Floor-1",
"handheld_reader": "",
"alt_serial": "",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"handheld_last_seen": "",
"status": {
"id": 1045,
"name": "Pending Visibility"
},
"created_at": "11/01/2019 01:56 PM",
"updated_at": "11/01/2019 01:56 PM"
}
]
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store is not found. Please enter store code |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Send item_number or epc.
If the item is not in the catalog,
item.idis-1anditem.nameisNot in Catalog(other text fields contain placeholder values).in_stockis the sum ofcurrent_unitsof the returned EPCs.
Decoding EPC and Return Asset and Item Info
/{tenant-code}/api/v1/epcs/decodeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
epc | string | required | EPC to decode. |
item_details | boolean | optional | true adds item_details (when the item exists). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/epcs/decode?api_key=$SENITRON_API_KEY&epc=<epc>"Success response
{
"serial_number": "5561",
"item_number": "210000001577",
"epc": "C000C30E4F9BA290000015B9",
"item_details": {
"id": 219717258,
"number": "210000001577",
"name": "BOYS SUITBOYSUIFAS",
"sku": "60032222",
"upc": 8534299001,
"alu": "X-453",
"description": "BOYS SUITBOYSUIFAS",
"style": "A-1",
"colour": "Yellow",
"size": "XXL",
"price": "80.0",
"retail_price": "90.50",
"msrp": "92.0",
"custom_price_mapping": false,
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"categories": [
{
"id": 1184562,
"name": "Child Category"
}
],
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"attr11": "",
"attr12": "",
"attr13": "",
"attr14": "",
"attr15": "",
"attr16": "",
"attr17": "",
"attr18": "",
"attr19": "",
"attr20": "",
"attr21": "",
"attr22": ""
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
| 400 | INVALID_EPC | The provided EPC is not valid |
| 400 | MISSING_EPC_PROFILE | There is no matching profile for the provided EPC |
Decodes the EPC with the tenant's EPC profiles (no inventory lookup), returning the item number and serial number encoded in it.
item_details.custom_price_mappingreflects the Shopify integration's custom price mapping setting.
Update EPC Status
/{tenant-code}/{location}/api/v1/epcs/status_updateRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request-Id | Optional idempotency key; a repeated value within 10 seconds returns 409 DUPLICATE_REQUEST. |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"status_id": 7582,
"comment": "Changing status from handheld",
"device_name": "HH-444",
"zone": {
"id": 15
},
"add_to_universal_permanent_status_registry": false,
"remove_from_universal_permanent_status_registry": false,
"epcs": [
{
"epc": "FED0000000067B80000002F2"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epcs/status_update?api_key=$SENITRON_API_KEY" \
-H "Request-Id: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"status_id": 7582,
"comment": "Changing status from handheld",
"device_name": "HH-444",
"zone": {
"id": 15
},
"add_to_universal_permanent_status_registry": false,
"remove_from_universal_permanent_status_registry": false,
"epcs": [
{
"epc": "FED0000000067B80000002F2"
}
]
}'Success response
{
"epc_tags": [
{
"id": 3339,
"epc_id": "FED0000000067B80000002F2",
"asset_id": "754",
"status": {
"id": 7582,
"name": "Live"
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | STATUS_NOT_FOUND | The Status is not found |
| 404 | LOCATION_NOT_FOUND | The Store is not found. Please enter store code |
| 409 | DUPLICATE_REQUEST | A record with this request_id has already been processed |
Unknown EPCs are added to inventory first. zone.id (optional sub-zone) updates each tag's last-seen antenna, location and
handheld_reader.On theft-detection locations, the EPCs are added to or removed from the CDM whitelist depending on whether the new status counts toward inventory.
When enabled for the tenant, status changes are synced to NetSuite/Shopify inventory and to the Universal Permanent Status Registry (the two
*_universal_permanent_status_registryflags request this for statuses that allow it).
Alerts
Get an alert result based on EPC status
/{tenant-code}/{location}/api/v1/alerts/epc_statusRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
epc | string | required | EPC read at the exit. |
device_id | string | optional | Reader/antenna id; numeric values are used as the antenna id when marking the tag stolen (default 101). |
strict | boolean | optional | true: unknown EPCs do not alarm. |
time | string | optional | Read time (logged only). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/alerts/epc_status?api_key=$SENITRON_API_KEY&epc=<epc>"Success response
{
"alert": false
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"alert": true} — alarm (HTTP 404 by design) |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Used by theft-detection gates. The response is HTTP 404 with
{"alert": true}when the tag should alarm: its status counts toward inventory or is flagged consider included for instant alert. In that case the tag is also marked Stolen in the background.Unknown EPCs alarm (404) unless
strict=true, which returns{"alert": false}(200).An invalid API key returns HTTP 401 with
{"status": "error", "message": "Invalid API key"}.
Send Theft Email Alert
/{tenant-code}/{location}/api/v1/theft/email_alertRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"theft_epc_tags": [
"CF19930E4FA6BD4000000432"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/theft/email_alert" \
-H "Content-Type: application/json" \
-d '{
"theft_epc_tags": [
"CF19930E4FA6BD4000000432"
]
}'Success response
{
"response": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"response": "Alert Emails not set"} |
| 200 | — | {"response": "No tags with statuses to be present in invetory"} |
Emails the location's Stolen alert recipients about the listed EPCs that are in inventory.
No authentication is checked.
Assets
Get Assets
/{tenant-code}/{location}/api/v1/assetsGET /{tenant-code}/{location}/api/v1/epcs/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | optional | Location code. Falls back to the tenant's first location when missing or unknown. |
query | string | optional | Exact match on asset id (serial), record id, item number, EPC or alt serial. |
serial_numbers | string | optional | Comma-separated asset ids (serial numbers). |
status | string | optional | Status name, e.g. Live. |
zone_ids | string | optional | Comma-separated sub-zone ids; matches the last-seen antenna or static zone. |
include_in_inventory | boolean | optional | true = only assets whose status counts toward inventory. |
items_details | boolean | optional | true adds an item_details object to each asset. |
item_parts | boolean | optional | With items_details, lists item parts (COCI tenants only). |
main_attributes | boolean | optional | true returns only id, serial_number, item_number, alt_serial, epc, text3 and status. |
summary | boolean | optional | true adds a summary object. |
assets | boolean | optional | false omits the asset list (returns "assets": []). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"summary": {
"skus": 1,
"epcs_count": 1,
"qty": 1,
"total_qty": 1
},
"assets": [
{
"id": 32503,
"serial_number": "1024",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/24 07:13 PM",
"last_seen": "01/25/24 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"static_zone": 0,
"static_zone_last_update": "",
"handheld_reader": "HH-53",
"handheld_last_seen": "01/25/2024 07:13 PM",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/24 07:13 PM",
"updated_at": "01/25/24 07:13 PM",
"epc": "CF19930E4FA6BD4000000432",
"text3": "01/25/2024 06:39 PM, 1001",
"uom": "",
"status": {
"id": 1000,
"name": "Live",
"include_inventory": true
},
"audited_by": "",
"audited_at": "",
"item_details": {
"id": 48696466,
"number": "210000047060",
"name": "Classic Tee - Black / M",
"upc": 123456789012,
"alu": "CT-BLK-M",
"description": "Classic Tee - Black / M",
"style": "CT",
"colour": "Black",
"size": "M",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "19.99",
"picture_url": "",
"item_type_name": "Regular",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": 0,
"categories": [
{
"id": 381199,
"name": "Tops"
}
],
"text1": "210000047060 Classic Tee",
"text2": "Black M,19.99",
"in_stock": 3,
"uoms": [],
"parts": []
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
Dates use the location's time zone.
first_seen,last_seen,created_atandupdated_atuseMM/DD/YY hh:mm AM/PM;handheld_last_seenuses a four-digit year.
New Asset
/{tenant-code}/{location}/api/v1/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"item_number": "7630040511896",
"alt_serial": "1212",
"current_units": 3.0,
"storage_unit": 3.0,
"adjust_qty": 10,
"device_name": "",
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": ""
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "7630040511896",
"alt_serial": "1212",
"current_units": 3.0,
"storage_unit": 3.0,
"adjust_qty": 10,
"device_name": "",
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": ""
}'Success response
{
"message": "The asset created successfully",
"asset": {
"id": 3331,
"serial_number": "747",
"item_number": "7630040511896",
"alt_serial": "1212",
"epc": "FED1BC2076AD6600000002EB",
"first_seen": "",
"last_seen": "",
"last_seen_antenna": "",
"last_zone": "",
"handheld_reader": "",
"handheld_last_seen": "",
"current_units": 3.0,
"storage_unit": 3.0,
"adjust_qty": 10,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "06/30/26 03:23 PM",
"updated_at": "06/30/26 03:23 PM",
"status": {
"id": 7583,
"name": "Live"
},
"static_zone": "",
"static_zone_last_update": ""
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "The item number is not valid"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates a new Live asset for item_number at the location in the URL. The EPC and serial number are generated from the tenant's next serial and EPC settings.
Errors use
{"status": "error", "message": …}instead of theerrorobject.
Get Asset
/{tenant-code}/{location}/api/v1/assets/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Asset record id (in-inventory assets only). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets/<id>?api_key=$SENITRON_API_KEY"Success response
{
"id": 3331,
"serial_number": "747",
"item_number": "7630040511896",
"alt_serial": "1212",
"epc": "FED1BC2076AD6600000002EB",
"first_seen": "06/30/26 03:23 PM",
"last_seen": "06/30/26 03:23 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"handheld_reader": "",
"handheld_last_seen": "",
"current_units": 3.0,
"storage_unit": 3.0,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "06/30/26 03:23 PM",
"updated_at": "06/30/26 03:23 PM",
"status": {
"id": 7583,
"name": "Live"
},
"static_zone": "",
"static_zone_last_update": ""
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "The asset ID is not valid"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Same fields as New Asset (General).
Update Asset
/{tenant-code}/{location}/api/v1/assets/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Asset record id (in-inventory assets only). |
Request body
{
"api_key": "<tenant api key>",
"current_units": 2,
"alt_serial": "1212-B",
"attr1": "Room 4",
"device_name": "HH-53"
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets/<id>?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"current_units": 2,
"alt_serial": "1212-B",
"attr1": "Room 4",
"device_name": "HH-53"
}'Success response
{
"message": "The asset updated successfully",
"asset": {
"id": 3331,
"serial_number": "747",
"item_number": "7630040511896",
"alt_serial": "1212-B",
"epc": "FED1BC2076AD6600000002EB",
"first_seen": "06/30/26 03:23 PM",
"last_seen": "06/30/26 03:23 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside 101",
"handheld_reader": "",
"handheld_last_seen": "",
"current_units": 2.0,
"storage_unit": 3.0,
"adjust_qty": 0,
"attr1": "Room 4",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "06/30/26 03:23 PM",
"updated_at": "06/30/26 03:23 PM",
"status": {
"id": 7583,
"name": "Live"
},
"static_zone": "",
"static_zone_last_update": ""
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "The asset ID is not valid"} |
| 404 | — | {"status": "error", "message": "The item number is not valid"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Also accepted as PATCH. Updatable:
item_number(must exist),alt_serial,current_units,storage_unit,adjust_qty,attr1–attr10. Quantity changes are logged as inventory adjustments.
Delete Asset (Kill Tag)
/{tenant-code}/{location}/api/v1/assets/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Asset record id (in-inventory assets only). |
device_name | string | optional | Device name (logged). |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets/<id>?api_key=$SENITRON_API_KEY"Success response
{
"message": "The asset deleted (tag killed) successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "The asset ID is not valid"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
The asset is not removed: its status is set to Tag Killed.
Upload Asset Reads (State)
/{tenant-code}/{location}/api/v1/assets/update_stateRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"devip": "192.168.1.40",
"reads": [
{
"epc": "FED1BC2076AD6600000002EB",
"rssi": -48,
"antenna": 1,
"timestamp": "2026-10-07T09:00:00Z"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets/update_state?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"devip": "192.168.1.40",
"reads": [
{
"epc": "FED1BC2076AD6600000002EB",
"rssi": -48,
"antenna": 1,
"timestamp": "2026-10-07T09:00:00Z"
}
]
}'Success response
{
"message": "The asset state updates enqueued successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"error": {"message": "<exception message>"}} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Queues raw reader reads (
epc,rssi,antenna,timestamp) from reader devip for background processing (last seen / zone updates).
Catalog
Get Catalog Items Mappings
/{tenant-code}/api/v1/catalog/items/mappingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/catalog/items/mappings?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"items_mappings": [
{
"old_item_number": "210000047198",
"new_item_number": "310000047198",
"epc": "C000C30E4FA6C5E000000637",
"location_code": "001",
"location_name": "Floor-1"
},
{
"old_item_number": "210000000002",
"new_item_number": "9360905869838",
"epc": "",
"location_code": "",
"location_name": ""
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns all item-number mappings for the tenant. The
locationparameter is not applied.
EOS
Get EOS Transfer Order Data
/{tenant-code}/{location}/api/v1/eos/transfers/ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Source location code (also accepted as source_location or store_code). |
query | string | optional | Partial match on id, document number, reference number, or item fulfillment number (NetSuite item-fulfillment tenants). |
order_type | string | optional | TO or RTV. |
items | boolean | optional | Default true; false returns empty items arrays. |
items_details | boolean | optional | Add item_details to each item. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/eos/transfers/orders?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"transfers": [
{
"id": 185,
"order_type": "TO",
"document_number": "964801",
"reference_number": "TO0028815",
"eos_item_fulfillment_number": "",
"shipped_date": "26/2024 08:00 AM",
"source_location": "w1001",
"source_location_name": "Bullring Centre",
"destination_location": "s1005",
"destination_location_name": "UK Online Store",
"status": "Received",
"expected": {
"items_count": 400,
"assets_count": 1176
},
"sent": {
"items_count": 1,
"assets_count": 1
},
"received": {
"items_count": 1,
"assets_count": 1
},
"items": [
{
"item_number": "793275",
"expected_qty": 1,
"sent_qty": 0,
"received_qty": 0,
"line_number": 0,
"non_rfid_item": false,
"item_details": {
"id": 3240,
"number": "793275",
"name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"upc": 0,
"alu": "ROY-BOX87",
"description": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ P007104",
"style": "No",
"colour": "0.15",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "0",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"categories": [
{
"id": 1183550,
"name": "W1w"
},
{
"id": 1183552,
"name": "W2w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN, 814.99",
"in_stock": 3
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | the location 001 not found |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns transfers whose source is location, ordered by status, then newest first.
item_details.priceis the item's retail price formatted with two decimals;in_stockcounts the item's EPCs whose status is included in inventory.
Import Items QTY in Compare Page
/{tenant-code}/{location}/api/v1/eos/import_qtyRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"user": "api@senitron.net",
"device_name": "",
"override": false,
"items": [
{
"item_number": "210000043012",
"qty": 10
},
{
"item_number": "210000056398",
"qty": 4
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/eos/import_qty?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "",
"override": false,
"items": [
{
"item_number": "210000043012",
"qty": 10
},
{
"item_number": "210000056398",
"qty": 4
}
]
}'Success response
{
"message": "The item quantities have been imported successfully."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key |
Imports external-system quantities into the Compare page in the background (the response confirms the file was queued).
override: truereplaces the whole Compare-page import table with these items; otherwise the listed items are added/updated.
EPC Settings
Get EPC information
/{tenant-code}/{location}/api/v1/epc_settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_settings?api_key=$SENITRON_API_KEY"Success response
{
"item_number_padding": 12,
"last_encoded_serial": 1115,
"prefixes": [
{
"default": true,
"enabled": true,
"standard": "SENITRON",
"profile_name": "Default",
"prefix": "FCF0",
"item_start_bit": 16,
"item_number_bit": 42,
"item_prefix_start_bit": 14,
"item_prefix_number_bit": 20,
"item_number_padding": 12,
"item_number_middle_padding": 0,
"item_prefix_status": false,
"serial_number_start_bit": 58,
"serial_number_no_of_bits": 38,
"epc_write_prefix": "1111110011110000",
"discover_item_number_directly_as_hex": false
},
{
"default": false,
"enabled": true,
"standard": "SENITRON",
"profile_name": "Profile 1",
"prefix": "C000C",
"item_start_bit": 20,
"item_number_bit": 40,
"item_prefix_start_bit": 12,
"item_prefix_number_bit": 24,
"item_number_padding": 12,
"item_number_middle_padding": 0,
"item_prefix_status": false,
"serial_number_start_bit": 60,
"serial_number_no_of_bits": 36,
"epc_write_prefix": "11000000000000001100",
"discover_item_number_directly_as_hex": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 401 | UNAUTHORIZED | Invalid API key |
| 400 | ERROR | <exception message> |
Same EPC profile data as the handheld Get Inventory Settings, without the location restrictions: one entry per prefix of each enabled EPC profile.
Update EPC information
/{tenant-code}/{location}/api/v1/epc_settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"item_number_padding": 12,
"last_encoded_serial": 1115
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_settings?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number_padding": 12,
"last_encoded_serial": 1115
}'Success response
{
"message": "Inventory settings received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 401 | UNAUTHORIZED | Invalid API key |
| 400 | ERROR | <exception message> |
Both fields are optional. last_encoded_serial updates the tenant's last serial; item_number_padding updates the default EPC profile. Changes are recorded in the event log.
ERC
Get list of the purchase orders
/{tenant-code}/{location}/api/v1/erc/purchase_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
po_number | string | optional | Exact PO number. |
query | string | optional | Partial match on PO number, vendor or zone name, or a status name. |
date_from | string | optional | YYYY-MM-DD or MM/DD/YYYY (PO date). |
date_to | string | optional | YYYY-MM-DD or MM/DD/YYYY (inclusive). |
items | boolean | optional | Include items. |
items_details | boolean | optional | Add item_details. |
assets | boolean | optional | Include received assets. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/erc/purchase_orders?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"purchase_orders": [
{
"id": 1,
"datetime": "06/10/2026 11:40 AM",
"po_number": "PO26BFM-001502",
"vendor": "BLUE FALLS USA, LLC",
"due_date": "06/20/2026 08:40 AM",
"posting_date": "06/10/2026 11:40 AM",
"status": "completed",
"user": "API User",
"zone": "Receiving Bay",
"pulled_at": "06/20/2026 08:40 AM",
"created_at": "06/10/2026 11:40 AM",
"updated_at": "06/20/2026 08:40 AM",
"items": [
{
"item_number": "009414",
"uom": "EA",
"expected_qty": 50,
"received_qty": 50,
"status": "received",
"created_at": "06/10/2026 11:40 AM",
"updated_at": "06/20/2026 08:40 AM",
"item_details": {
"id": 32281,
"number": "009414",
"upc": 0,
"alu": "PRP-124800",
"sku": "SPH-100400",
"ean": "",
"custom_sku": "491-800-005",
"description": "Water purification Cartridge - Red (empty units)",
"short_description": "Water purification Cartridge - Red (empty units)",
"style": "",
"color": "",
"size": "",
"type": "Regular",
"manufacturer": "",
"vendor_id": "V-1279",
"vendor_name": "Las Water Company, Ltd",
"price": 84.0,
"retail_price": 84.99,
"msrp": 45.66,
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"uom": "EA",
"buom": "EA",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"attr11": "",
"attr12": "",
"attr13": "",
"attr14": "",
"attr15": "",
"attr16": "",
"attr17": "",
"attr18": "",
"attr19": "",
"attr20": "",
"attr21": "",
"attr22": "",
"created_at": "06/10/2026 11:40 AM",
"updated_at": "06/20/2026 08:40 AM"
},
"assets": [
{
"id": "8",
"serial_number": "86799",
"alt_serial": "",
"epc": "C60001E0000000000001530F",
"qty": 50,
"received_zone": "Receiving Bay Inside",
"last_zone": "Receiving Bay Inside",
"user": "API User",
"status": {
"id": 6940,
"name": "Live"
},
"pallets": 1,
"boxes": 1,
"units": 50,
"additional_units": 0,
"lot_date": "",
"expiration_date": "",
"created_at": "06/10/2026 11:40 AM",
"updated_at": "06/20/2026 08:40 AM"
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 401 | UNAUTHORIZED | Invalid API key |
Returns ERC purchase-order receivings, newest PO date first.
Inventory
Export items QTY in Compare Page
/{tenant-code}/{location}/api/v1/inventories/quantitiesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
query | string | optional | Partial catalog search (item number, ALU, SKU, name …). |
item_number | string | optional | Exact match on item number, ALU, SKU, UPC or EAN. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/quantities?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"items": [
{
"item_number": "210000043012",
"alu": "y-5609",
"tags_count": 2,
"qty": 10
},
{
"item_number": "210000056398",
"alu": "x-6756",
"tags_count": 1,
"qty": 4
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key |
Returns in-inventory quantities per item at the location:
tags_count(number of tags) andqty(sum of units).
Get Assets
/{tenant-code}/{location}/api/v1/inventories/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
query | string | optional | Exact match on record id, asset id (serial), alt serial, item number or EPC. |
item_number | string | optional | Exact item number. |
alt_serial | string | optional | Exact alt serial. |
date_from | string | optional | YYYY-MM-DD or MM/DD/YYYY; assets updated on/after. |
date_to | string | optional | YYYY-MM-DD or MM/DD/YYYY; assets updated on/before. |
main_attributes | boolean | optional | Only id, serial_number, item_number, alt_serial, epc, text3, status. |
manufacturing | boolean | optional | Manufacturing view (qty, master tag, source, user…). |
items_details | boolean | optional | With manufacturing, add item_details. |
history | boolean | optional | Add the last zone movement and status change. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 10
},
"assets": [
{
"id": 32503,
"serial_number": "45500",
"item_number": "210000047060",
"alt_serial": "",
"first_seen": "01/25/2024 07:13 PM",
"last_seen": "01/25/2024 07:13 PM",
"last_seen_antenna": "1001",
"last_zone": "Inside Zone 1",
"handheld_reader": "",
"handheld_last_seen": "",
"static_zone": "",
"static_zone_last_update": "",
"receiving_date": "",
"current_units": 1.0,
"storage_unit": 1.0,
"adjust_qty": -7,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"created_at": "01/25/2024 07:13 PM",
"updated_at": "01/25/2024 07:13 PM",
"epc": "CF19930E4FA6BD4000000432",
"text3": "01/25/2024 06:39 PM, 1001",
"status": {
"id": 1000,
"name": "Live"
},
"history": {
"movements": [
{
"datetime": "08/14/25 08:49 PM",
"last_zone": "Inside : Zone A",
"current_zone": "Inside : 101 (501)",
"changed_by": "Summarization"
}
],
"statuses": [
{
"datetime": "08/14/25 08:49 PM",
"last_status": "Stolen",
"current_status": "Live",
"changed_by": "Summarization",
"reason": ""
}
]
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Returns only in-inventory assets of the location, ordered by id. Times are in the location's time zone.
Get Inventory Adjustments
/{tenant-code}/{location}/api/v1/inventories/reports/adjustmentsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
query | string | optional | Partial match on item number, reason, reason details or reference number. |
date_from | string | optional | MM/DD/YYYY or YYYY-MM-DD, in the location's time zone. |
date_to | string | optional | MM/DD/YYYY or YYYY-MM-DD (inclusive). |
items_details | boolean | optional | Add item_details. |
assets | boolean | optional | Add the affected assets. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/reports/adjustments?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"adjustments": [
{
"datetime": "06/10/2026 11:40 AM",
"item_number": "006039",
"qty": 21,
"new_qty": 646,
"uom": "EA",
"reason": "Web",
"reason_details": "Print Tag",
"reference_number": "ADJ-2026-06-10-0001",
"user": "API User",
"item_details": {
"id": 195969321,
"number": "006039",
"upc": 0,
"alu": "PRP-124800",
"sku": "SPH-100400",
"ean": "",
"custom_sku": "491-800-005",
"description": "Water purification Cartridge - Red (empty units)",
"short_description": "Water purification Cartridge - Red (empty units)",
"style": "",
"color": "",
"size": "",
"type": "Regular",
"manufacturer": "",
"vendor_id": "V-1279",
"vendor_name": "Las Water Company, Ltd",
"price": 84.0,
"retail_price": 84.99,
"msrp": 45.66,
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"uom": "EA",
"buom": "EA",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"cloud_picture_url": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"attr11": "",
"attr12": "",
"attr13": "",
"attr14": "",
"attr15": "",
"attr16": "",
"attr17": "",
"attr18": "",
"attr19": "",
"attr20": "",
"attr21": "",
"attr22": "",
"created_at": "12/18/2024 20:20 PM",
"updated_at": "05/07/2026 15:20 PM"
},
"assets": [
{
"serial_number": "86799",
"alt_serial": "",
"epc": "C60001E0000000000001530F",
"qty": 21,
"status": {
"id": 6940,
"name": "Live"
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Newest first.
datetimeis in the location's time zone.item_details.created_at/updated_atuseMM/DD/YYYY hh:mm AM/PM.
Inventory Assets Status Logs
/{tenant-code}/{location}/api/v1/inventories/assets/statuses/logsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
query | string | optional | Search on asset fields (id, serial, alt serial, item number, EPC). |
filter_hours | integer | optional | Only changes in the last N hours. |
sort_type | string | optional | asc (default) or desc by change time. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets/statuses/logs?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 10
},
"assets": [
{
"id": 32503,
"serial_number": "45500",
"item_number": "210000047060",
"alt_serial": "",
"last_seen": "01/25/2024 07:13 PM",
"last_zone": "Inside Zone 1",
"created_at": "01/25/2024 07:13 PM",
"epc": "CF19930E4FA6BD4000000432",
"last_status": {
"id": 1000,
"name": "Live"
},
"current_status": {
"id": 1120,
"name": "Sold"
},
"user": "api@senitron.net",
"reason": "Bulk Status Updates by Handheld"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Each entry is one status change:
last_status→current_status, with the user and reason.
Inventory Items Assets by Filter
/{tenant-code}/{location}/api/v1/inventories/items/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
include_in_inventory | boolean | optional | true = only tags whose status counts toward inventory. |
in_stock | boolean | optional | true = only items that have in-inventory tags. |
order | string | optional | item_number (default) or name. |
order_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1 (pages of items). |
per_page | integer | optional | Default 10. |
Request body
{
"location": "001",
"filters": [
{
"name": "Asset ID",
"values": [
{
"value": "210000045065"
},
{
"value": "210000027611"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/items/assets?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"filters": [
{
"name": "Asset ID",
"values": [
{
"value": "210000045065"
},
{
"value": "210000027611"
}
]
}
]
}'Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"summary": {
"skus": 2,
"tags_count": 2,
"assets": 16
},
"items": [
{
"item_number": "210000045065",
"assets": [
{
"serial_number": "123",
"epc": "CF19930E4FA6BD4000000432",
"qty": 6,
"status": {
"id": 1000,
"name": "Live"
}
},
{
"serial_number": "234",
"epc": "CF19930E4FA6BD4000000432",
"qty": 10,
"status": {
"id": 1000,
"name": "Live"
}
}
]
},
{
"item_number": "210000027611",
"assets": []
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | Location not found! |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Filters select catalog items; each item lists its tags. Filter names are catalog column titles from UI settings plus the built-in
Asset ID(item number, padding added automatically),ALU,UPCandSKU. Values match exactly (case-insensitive).summary:
skus= matching items,tags_count= their tags,assets= sum of tag units.
New Assets
/{tenant-code}/{location}/api/v1/inventories/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"user": "api@senitron.net",
"device_name": "HH-367",
"asset": {
"item_number": "210000047060",
"serial_number": "432",
"epc": "",
"alt_serial": "",
"first_seen": "",
"last_seen": "",
"last_seen_antenna": "",
"handheld_reader": "",
"handheld_last_seen": "",
"last_zone": "",
"static_zone": "",
"static_zone_last_update": "",
"receiving_date": "",
"current_units": 1,
"storage_unit": 1,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"status": {
"id": 1000,
"name": "Live"
}
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "HH-367",
"asset": {
"item_number": "210000047060",
"serial_number": "432",
"epc": "",
"alt_serial": "",
"first_seen": "",
"last_seen": "",
"last_seen_antenna": "",
"handheld_reader": "",
"handheld_last_seen": "",
"last_zone": "",
"static_zone": "",
"static_zone_last_update": "",
"receiving_date": "",
"current_units": 1,
"storage_unit": 1,
"adjust_qty": 0,
"attr1": "",
"attr2": "",
"attr3": "",
"attr4": "",
"attr5": "",
"attr6": "",
"attr7": "",
"attr8": "",
"attr9": "",
"attr10": "",
"status": {
"id": 1000,
"name": "Live"
}
}
}'Success response
{
"messages": "The asset info saved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ASSET_NOT_FOUND | The asset not found |
| 404 | USER_NOT_FOUND | The user api@senitron.net not found |
| 404 | STATUS_NOT_FOUND | The status Damaged not found |
| 404 | ITEM_NOT_FOUND | The item# not found |
| 400 | SAVING_ERROR | <validation messages> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
asset.item_number is required (padding is fixed automatically). user must be an existing user email.
If an asset with the same item number and asset.serial_number exists, it is updated; otherwise a new asset is created. A missing EPC is generated from the item number and serial (or the next serial).
asset.status:
id0 (or missing) = Live; otherwise matched byid, then byname.asset.last_zone (sub-zone name) sets the last-seen antenna; asset.static_zone (
<zone> <sub-zone>) sets the static zone.
Push Request for Inventory to SN
/{tenant-code}/{location}/api/v1/inventories/requestsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"datetime": "04/26/2024 08:30 AM",
"request_number": "1001",
"request_name": "Request #1001 - Shoes category",
"user": "api@senitron.net",
"items": [
{
"item_number": "890001",
"expected_qty": 34
},
{
"item_number": "890005",
"expected_qty": 12
},
{
"item_number": "890072",
"expected_qty": 50
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/requests?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"datetime": "04/26/2024 08:30 AM",
"request_number": "1001",
"request_name": "Request #1001 - Shoes category",
"user": "api@senitron.net",
"items": [
{
"item_number": "890001",
"expected_qty": 34
},
{
"item_number": "890005",
"expected_qty": 12
},
{
"item_number": "890072",
"expected_qty": 50
}
]
}'Success response
{
"messages": "The request data saved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | REQUEST_BLANK | The request number is blank |
| 400 | ITEMS_BLANK | The array of items is blank |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates or replaces inventory request request_number with the listed items and expected quantities (items not listed are removed).
items[].item_number may be the item number, SKU, ALU or UPC. Unknown items are skipped: the response is then
{"messages": "The request data saved successfully, but some items is not saved!"}and an email listing them is sent to user.The expected quantities are also stored as the Compare-page import quantities.
Zones List
/{tenant-code}/{location}/api/v1/inventories/zonesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
query | string | optional | Partial match on zone or sub-zone name. |
nested | boolean | optional | true returns zones with their sub_zones (see notes). |
filtered_zone_ids | string | optional | Comma-separated parent zone ids. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default: all rows. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/zones?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"total_entities": 5,
"pagination": {
"current_page": 1,
"per_page": 5,
"total_entries": 5
},
"zones": [
{
"id": 3,
"name": "Annex Back Stock",
"order": 1
},
{
"id": 1,
"name": "Inside 1st Floor",
"order": 2
},
{
"id": 2,
"name": "Inside 2nd Floor",
"order": 3
},
{
"id": 4,
"name": "Inside Front Doors",
"order": 3
},
{
"id": 5,
"name": "Temp April Booth",
"order": 4
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The Store# is not found |
| 400 | ERROR | <exception message> |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Returns sub-zones visible on handhelds, sorted by display name (
<zone> <sub-zone>). When Display zones with physical readers is on, only sub-zones that have non-POS reader antennas are listed.With
nested=true:{"total_entities": 2, "pagination": {…}, "zones": [{"id": 1, "name": "Inside", "order": 1, "sub_zones": [{"id": 4, "name": "101", "order": 1}]}]}
Export Inventory (Email)
/{tenant-code}/api/v1/inventory_exportRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Tenant API key (named key here). |
email | string | required | Recipient of the export file. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/inventory_export?key=$SENITRON_API_KEY&email=<email>"Success response
{
"note": "HTTP 302 redirect back to the referring page"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"data": "No key provided"} |
Starts a background export of the tenant's inventory and emails it to email. The response is a redirect to the referring page (web-app use); a wrong key returns
{"data": "No key provided"}.
Get Alt Serials
/{tenant-code}/{location}/api/v1/inventories/assets/alt_serialsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
include_in_inventory | boolean | optional | Default true; false includes all statuses. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets/alt_serials?api_key=$SENITRON_API_KEY"Success response
[ "1212", "A-1001", "virtual tag" ]
Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Distinct non-empty alt serials of the location's assets (in-inventory only by default).
Get Item Quantities by Bin
/{tenant-code}/{location}/api/v1/inventories/bin_item_qtyRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
bin_grouping | boolean | optional | true groups by item and bin (static zone). |
query | string | optional | With grouping: bin name filter; otherwise catalog search. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/bin_item_qty?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 1
},
"items": [
{
"bin": "Warehouse A-01",
"number": "210000047060",
"upc": 0,
"alu": "CT-BLK-M",
"sku": "",
"description": "Classic Tee",
"tags": 4,
"qty": 4.0
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
In-inventory tag count and quantity per item (and per bin with
bin_grouping).binis empty without grouping.
Inventory Update (Bralco, gzip CSV)
/{tenant-code}/{location}/api/v1/inventory/inventory_update_bralcoRequest headers
| Header | Value |
|---|---|
Content-Type | application/gzip |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventory/inventory_update_bralco?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/gzip" \
--data-binary @data.csv.gzSuccess response
{
"message": "Import enqueued"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | — | {"error": "<exception message>"} |
| 401 | UNAUTHORIZED | Invalid API key |
Customer-specific import. The body is a gzip-compressed CSV; it is processed in the background.
Lightspeed POS
Get EPC info for POS
/{tenant-code}/{location}/api/v1/lightspeed/epc_tags/pos_showRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
epc_id | string | required | EPC to look up. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/lightspeed/epc_tags/pos_show?api_key=$SENITRON_API_KEY&epc_id=<epc_id>"Success response
{
"id": 341,
"item_number": "00000000001",
"name": "BOYS SUITBOYSUIFAS",
"alu": "X-453",
"current_units": 1.0,
"retail_price": 90.5,
"alt_serial": "",
"upc": 8534299001,
"epc_id": "EF9C30000000004000000224",
"attribute1": "Yellow",
"attribute2": "XL",
"attribute3": "",
"attribute4": "",
"attribute5": "",
"attribute6": "",
"attribute7": "",
"attribute8": "",
"attribute9": "",
"attribute10": "",
"attribute11": "",
"attribute12": "",
"attribute13": "",
"attribute14": "",
"attribute15": "",
"attribute16": "",
"attribute17": "",
"attribute18": "",
"attribute19": "",
"attribute20": ""
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "not_found", "message": "EPC Tag not in inventory"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Returns the tag and its catalog item for a POS.
attribute1= colour,attribute2= size,attribute3–attribute22= catalog attributes 3–22.Errors use
{"status": …, "message": …}instead of theerrorobject.
Transfer Orders
Get Pallet Number
/{tenant-code}/{location}/api/v1/transfer_orders/pallets/new_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/pallets/new_number?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"number": "5598",
"epc": "F11B00000000000000005598"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Reserves and returns the tenant's next pallet number. epc is
F11Bfollowed by the number padded to 20 digits.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get Carton Number
/{tenant-code}/{location}/api/v1/transfer_orders/cartons/new_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/cartons/new_number?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"number": "3366",
"epc": "F11C00000000000000003366"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Reserves and returns the tenant's next carton number. epc is
F11Cfollowed by the number padded to 20 digits.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get Container Number
/{tenant-code}/{location}/api/v1/transfer_orders/containers/new_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/containers/new_number?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"number": "72491",
"epc": "F11A00000000000000072491"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Reserves and returns the tenant's next container number. epc is
F11Afollowed by the number padded to 20 digits.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get Transfers Orders
/{tenant-code}/{location}/api/v1/transfer_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL; also accepted as store_code). |
transfer_type | string | optional | IN or OUT relative to the location. |
transfer_id | integer | optional | Transfer id. |
query | string | optional | Partial search on id, document number, reference number. |
from_location | string | optional | Source location code. |
to_location | string | optional | Destination location code. |
shipped_date_from | date | optional | MM/DD/YYYY. |
shipped_date_to | date | optional | MM/DD/YYYY. |
status | string | optional | e.g. pending, partially_received, received. |
is_open | boolean | optional | true hides received/closed transfers. |
transfer_details | boolean | optional | Include containers/pallets/cartons/items. |
items_details | boolean | optional | Add item_details. |
assets_details | boolean | optional | Include assets. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10, maximum 100. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"summary": {
"sent": {
"containers": 1,
"pallets": 1,
"cartons": 1,
"skus": 1,
"assets": 2
},
"received": {
"containers": 0,
"pallets": 0,
"cartons": 0,
"skus": 0,
"assets": 1
}
},
"transfer_orders": [
{
"id": 984331,
"title": "",
"from_location_number": "001",
"to_location_number": "002",
"transfer_type": "IN",
"document_number": "",
"reference_number": "",
"shipped_date": "08/12/2025 09:11 AM",
"shipping_method": "",
"reason": "",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"eos_last_sync_at": "08/14/2025 10:30 AM",
"eos_last_sync_by": "API User",
"status": "Partially Received",
"user": "API User",
"device_name": "HH-453",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"summary": {
"sent": {
"containers": 1,
"pallets": 1,
"cartons": 1,
"skus": 1,
"assets": 2
},
"received": {
"containers": 0,
"pallets": 0,
"cartons": 0,
"skus": 0,
"assets": 1
}
},
"containers": [
{
"id": 10,
"number": "4501",
"epc": "F11A00000000000000004501",
"user": "API User",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"pallets": [
{
"id": 43,
"number": "91",
"epc": "F11B00000000000000000091",
"user": "API User",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"cartons": [
{
"id": 2352354,
"number": "8900032535",
"epc": "F11C00000000008900032535",
"user": "API User",
"device_name": "HH-564",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"tracking_number": "",
"tracking_number_url": "",
"items": [
{
"id": 532225,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"status": "Sent",
"sent_qty": 2,
"received_qty": 1,
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"item_details": {
"id": 220620047,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"upc": 0,
"alu": "",
"sku": "CRYSP117-29",
"custom_sku": "",
"description": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"style": "",
"color": "",
"size": "",
"price": "0.0",
"cost_price": 0.0,
"retail_price": 70.0,
"msrp": 98.0,
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "Crysp Denim",
"manufacturer": "Crysp Denim",
"categories": [
{
"id": 118395,
"name": "Men's"
}
],
"text1": "210000004531 Crysp: Skywalker Biker Stone Wash 42",
"text2": "",
"epcs_count": 10,
"in_stock": 10
},
"assets": [
{
"id": 45,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"text3": "Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Received",
"last_seen": "08/12/2025 09:11 AM",
"received_at": "08/12/2025 09:11 AM",
"received_by": "API User"
},
{
"id": 87,
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"text3": "UPC 3523535 - Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Sent",
"last_seen": "08/12/2025 09:11 AM",
"received_at": "",
"received_by": ""
}
]
}
]
}
]
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | INTERNAL_ERROR flat | Internal server error |
Newest first.
per_pageis capped at 100.Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Get/Print Carton Labels
/{tenant-code}/{location}/api/v1/transfer_orders/cartons/print_labelsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"id": 0,
"document_number": "DOC-123456",
"reference_number": "REF-123456",
"carton_number": "123456",
"expected_qty": 40,
"datetime": "2026-05-20T20:32:04+1:00:00.000000",
"printer_id": 5,
"print": false,
"user": "api@senitron.net",
"device_name": "HH-453",
"items": [
{
"item_number": "210000047086",
"item_name": "Ferrari",
"expected_qty": 2,
"read_qty": 2
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/cartons/print_labels?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": 0,
"document_number": "DOC-123456",
"reference_number": "REF-123456",
"carton_number": "123456",
"expected_qty": 40,
"datetime": "2026-05-20T20:32:04+1:00:00.000000",
"printer_id": 5,
"print": false,
"user": "api@senitron.net",
"device_name": "HH-453",
"items": [
{
"item_number": "210000047086",
"item_name": "Ferrari",
"expected_qty": 2,
"read_qty": 2
}
]
}'Success response
{
"id": 0,
"print": false,
"printer": {
"id": 5,
"name": "Zebra Front Desk",
"ip": "192.168.1.50",
"port": "9100",
"type": "IP",
"method": "standard",
"visible": true
},
"payload": "\n\n\n^XA\n\n\n^FO0,0^GB1215,400,3^FS\n^FT380,200^CI0^A0N,75^Carton#: 123^FS\n\n^PQ1,0,1,Y\n^XZ"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | PRINTER_NOT_FOUND | The printer not found |
| 422 | LOCATION_NOT_FOUND flat | The location 001 not found |
| 422 | INTERNAL_ERROR flat | Internal server error |
Builds the ZPL label for the carton on printer printer_id and returns it in
payload. Withprint: truethe label is also sent to the printer; withfalsethe handheld can print the payload itself.When called with the API key, user (email) identifies the user.
Upload Transfer Order Data
/{tenant-code}/{location}/api/v1/transfer_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"id": 0,
"title": "",
"from_location_number": "001",
"to_location_number": "002",
"document_number": "",
"reference_number": "",
"shipped_date": "2025-08-22T20:32:04+1:00:00.000000",
"shipping_method": "",
"reason": "",
"email": "",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"user": "api@senitron.net",
"device_name": "HH-453",
"printer_id": 0,
"destination_zone": {
"id": 34,
"name": "Inside Zone A"
},
"carton_label": {
"printer_id": 12,
"print": false
},
"transfer_orders": [
{
"containers": [
{
"number": "",
"pallets": [
{
"number": "",
"cartons": [
{
"number": "",
"items": [
{
"number": "210000047086",
"name": "Ferrari",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}
]
}
]
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"id": 0,
"title": "",
"from_location_number": "001",
"to_location_number": "002",
"document_number": "",
"reference_number": "",
"shipped_date": "2025-08-22T20:32:04+1:00:00.000000",
"shipping_method": "",
"reason": "",
"email": "",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"user": "api@senitron.net",
"device_name": "HH-453",
"printer_id": 0,
"destination_zone": {
"id": 34,
"name": "Inside Zone A"
},
"carton_label": {
"printer_id": 12,
"print": false
},
"transfer_orders": [
{
"containers": [
{
"number": "",
"pallets": [
{
"number": "",
"cartons": [
{
"number": "",
"items": [
{
"number": "210000047086",
"name": "Ferrari",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}
]
}
]
}
]
}
]
}'Success response
{
"id": 72491,
"pdf": "https://app.senitron.net/masoud1357/001/transactions/export/pdf/72491/ Transfer_72491_demo_mpz_co_san_diego_ca_to_los_angeles_08222025_123205.pdf",
"message": "Transfer order information has been saved successfully",
"carton_labels": {
"print": false,
"printer": {
"id": 12,
"name": "Zebra Front Desk",
"ip": "192.168.1.50",
"port": "9100",
"type": "IP",
"method": "standard",
"visible": true
},
"labels": [
{
"carton_number": "123",
"payload": "\n\n\n^XA\n\n\n^FO0,0^GB1215,400,3^FS\n^FT380,200^CI0^A0N,75^Carton#: 123^FS\n\n^PQ1,0,1,Y\n^XZ"
},
{
"carton_number": "567",
"payload": "\n\n\n^XA\n\n\n^FO0,0^GB1215,400,3^FS\n^FT380,200^CI0^A0N,75^Carton#: 567^FS\n\n^PQ1,0,1,Y\n^XZ"
}
]
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The source location 001 not found |
| 422 | LOCATION_NOT_FOUND flat | The destination location 002 not found |
| 422 | TRANSFER_ORDER_EXISTS | A transfer order with the same DOC# or REF# already exists |
| 422 | DUPLICATE_TRANSFER_ID | The Transfer ID 72491 already exists, and the transfer could not be created. |
| 422 | PERMISSION_DENIED flat | You have view-only access. Import is not permitted. |
| 422 | PROCESSING_ERROR flat | <message> |
| 422 | INTERNAL_ERROR flat | Internal server error |
Creates a transfer order (containers → pallets → cartons → items → assets). id 0 lets Senitron assign the id; a positive id that already exists is rejected.
Required:
from_location_number,to_location_numberand at least one transfer order with containers. Invalid payloads currently returnINTERNAL_ERROR.pdfis returned when printer_id is set;carton_labelswhen carton_label.printer_id is set (withcarton_label.print: truethe labels are also printed).Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Upload Transfer Order Receiving Data
/{tenant-code}/{location}/api/v1/transfer_orders/receivingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"id": 3423,
"document_number": "",
"reference_number": "",
"datetime": "2025-09-22T20:32:04+1:00:00.000000",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-453",
"zone": {
"id": 0,
"name": ""
},
"items": [
{
"item_number": "210000004501",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/receivings?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"id": 3423,
"document_number": "",
"reference_number": "",
"datetime": "2025-09-22T20:32:04+1:00:00.000000",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-453",
"zone": {
"id": 0,
"name": ""
},
"items": [
{
"item_number": "210000004501",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84
},
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+1:00:00.000000",
"rssi": 75
}
]
}
]
}'Success response
{
"message": "Transfer order receiving information has been saved successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND flat | The location #001 not found |
| 422 | TRANSFER_NOT_FOUND flat | The transfer #3423 not found |
| 422 | TRANSFER_ALREADY_RECEIVED flat | This transfer has already been completely received and cannot be processed again |
| 422 | INTERNAL_ERROR flat | Internal server error |
Receives transfer id at location; processing runs in the background.
Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Merge the Transfer Orders
/{tenant-code}/{location}/api/v1/transfer_orders/mergeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/merge?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}'Success response
{
"message": "The selected transfers have been merged successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | INVALID_PARAMS flat | base_transfer is required |
| 422 | INVALID_PARAMS flat | At least one merged_transfer is required |
| 422 | TRANSFER_NOT_FOUND flat | Base transfer #27843 not found |
| 422 | NO_VALID_TRANSFERS flat | No valid transfers to merge. Invalid transfers are ignored. |
| 422 | INVALID_PARAMS flat | user is required (provide user email when using API key authentication) |
| 422 | PERMISSION_DENIED flat | You have view-only access. Import is not permitted. |
| 422 | PROCESSING_ERROR flat | Failed to merge transfer orders |
Merges merged_transfers (array or comma-separated ids) into base_transfer. Only transfers with the same source and destination that are not received or closed are merged.
user (email) is required when calling with the API key.
Errors from this endpoint are returned without the
errorwrapper:{"type": "LOCATION_NOT_FOUND", "message": "…"}(HTTP 422), except where shown with the wrapper below.
Purchase Orders
Get List of Purchase Orders
/{tenant-code}/{location}/api/v1/purchase_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
po_number | string | optional | Exact PO number. |
query | string | optional | Partial search on PO number, title, note, document or reference number, vendor. |
items | boolean | optional | Include items. |
epcs | boolean | optional | With items, include received EPCs. |
items_details | boolean | optional | With items, add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/purchase_orders?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 20,
"total_entries": 1
},
"purchase_orders": [
{
"id": 101,
"po_number": "PO0011529",
"title": "Purchase Order #PO0011529",
"note": "69182TT-W",
"document_number": "2634361",
"reference_number": "",
"vendor_code": "",
"vendor_name": "Teleties",
"status": "created",
"po_date": "12/20/23 10:20 AM",
"currency": "USD",
"total": 0.0,
"user_name": "API User",
"created_at": "12/04/23 10:20 AM",
"updated_at": "12/04/23 01:34 PM",
"expected": {
"skus": 13,
"assets": 58
},
"received": {
"skus": 1,
"assets": 1
},
"audited": {
"skus": 0,
"assets": 0
},
"items": [
{
"item_number": "0045468459687",
"expected_qty": 4,
"received_qty": 1,
"audited_qty": 0,
"non_rfid_item": false,
"epcs": [
{
"epc": "CF19930E4F9B8B900000041E",
"serial_number": "1054",
"qty": 12,
"audited": false,
"handheld": "HH-305",
"user_name": "API User",
"datetime": "03/14/23 10:45 PM"
}
],
"item_details": {
"id": 32281,
"number": "0045468459687",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"upc": 0,
"alu": "BOX87",
"sku": "890001",
"custom_sku": "0350295",
"style": "No",
"color": "0.15",
"size": "MS",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"dcs": "",
"dnc": false,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
},
{
"item_number": "0045468459816",
"expected_qty": 1,
"received_qty": 0,
"audited_qty": 0,
"non_rfid_item": false,
"epcs": [],
"item_details": {
"id": 32229,
"number": "0045468459816",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "850002",
"custom_sku": "0350295",
"style": "No",
"color": "0.15",
"size": "MS",
"retail_price": 814.99,
"cost_price": 84.0,
"msrp": 45.66,
"dcs": "",
"dnc": false,
"price": "84.00",
"picture_url": "https://senitroncloud.s3.amazonaws.com/uploads/item_pictures/67/1dbcg.jpg",
"item_type_name": "Regular",
"vendor_id": "12",
"vendor_name": "Adidas",
"manufacturer": "Adidas",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2,
"epcs_count": 4
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Without
po_numberorquery, fully received purchase orders are excluded. Sorted by PO date, newest first.Dates use
MM/DD/YY hh:mm AM/PM.totalis always 0.0.General mode:
/{tenant-code}/{location}/api/v1/purchase_orders/...withapi_key; Handheld mode:locationparameter and the handheld token.
PO Audit Data
/{tenant-code}/{location}/api/v1/purchase_orders/auditsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2025 07:15 AM"
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2025 07:16 AM"
}
]
},
{
"item_number": "0045468459816",
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"last_seen": "03/17/2025 07:14 AM"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/purchase_orders/audits?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "03/17/2025 07:15 AM"
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "03/17/2025 07:16 AM"
}
]
},
{
"item_number": "0045468459816",
"epcs": [
{
"epc": "321AB45009E66F00236700AA",
"last_seen": "03/17/2025 07:14 AM"
}
]
}
]
}'Success response
{
"message": "Purchase order auditing request queued for processing."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 404 | PURCHASE_ORDER_NOT_FOUND | The purchase order 'PO0011529' could not be found. |
| 422 | AUDITING_VALIDATION_ERROR | One or more data validations failed during auditing. |
| 500 | AUDITING_PROCESSING_ERROR | An unexpected error occurred during purchase order auditing. |
The audit is queued and processed in the background.
override: truereplaces previous audit results.Validation and processing errors also include a
detailsfield.General mode:
/{tenant-code}/{location}/api/v1/purchase_orders/...withapi_key; Handheld mode:locationparameter and the handheld token.
PO Receiving Data
/{tenant-code}/{location}/api/v1/purchase_orders/receivingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"qty": 1,
"last_seen": "03/17/2025 07:15 AM",
"rssi": 90
},
{
"epc": "321AB45009E66F00236700CE",
"qty": 1,
"last_seen": "03/17/2025 07:16 AM",
"rssi": 80
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/purchase_orders/receivings?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"po_number": "PO0011529",
"device_name": "HH-53",
"zone": {
"id": 324,
"name": "Inside Zone A"
},
"override": false,
"items": [
{
"item_number": "0045468459687",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"qty": 1,
"last_seen": "03/17/2025 07:15 AM",
"rssi": 90
},
{
"epc": "321AB45009E66F00236700CE",
"qty": 1,
"last_seen": "03/17/2025 07:16 AM",
"rssi": 80
}
]
}
]
}'Success response
{
"message": "Purchase order receiving request queued for processing."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found or is not associated with your account. |
| 404 | PURCHASE_ORDER_NOT_FOUND | The purchase order 'PO0011529' could not be found. |
| 409 | DUPLICATE_ASSET_RECEIVING | Some of the scanned assets have already been received in another purchase order. |
| 422 | RECEIVING_VALIDATION_ERROR | One or more data validations failed during receiving. |
| 500 | RECEIVING_PROCESSING_ERROR | An unexpected error occurred during purchase order receiving. |
Receiving is queued and processed in the background.
When the handheld setting Prevent duplicate receiving of the same EPC is on, EPCs already received on another PO return
409with anitemsarray showing the otherpo_numberper EPC.EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs.Validation and processing errors also include a
detailsfield.General mode:
/{tenant-code}/{location}/api/v1/purchase_orders/...withapi_key; Handheld mode:locationparameter and the handheld token.
Sales
Push Sales Orders
/{tenant-code}/{location}/api/v1/salesPOST /api/v1/salesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"transaction_date": "11/27/2024 01:45 PM",
"transaction_number": "45001",
"title": "SO Test #45001",
"customer": "Acme Retail",
"reference_number": "",
"document_number": "",
"user": "api@senitron.net",
"note": "",
"device_id": "",
"catalog_update": false,
"inventory_update": false,
"items": [
{
"item_number": "210000000062",
"qty": 10
},
{
"item_number": "210000000040",
"qty": 20
}
],
"assets": [
{
"epc": "C000C30E4F9B43E0000004EA",
"serial_number": "1258",
"item_number": "210000000062",
"sku": "",
"upc": 3252355,
"alu": "",
"description": "FOOT JOY M OUTER-LS 215 - L -",
"price": 45.0,
"retail_price": 59.0,
"msrp": 57.0,
"qty": 1
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/sales?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transaction_date": "11/27/2024 01:45 PM",
"transaction_number": "45001",
"title": "SO Test #45001",
"customer": "Acme Retail",
"reference_number": "",
"document_number": "",
"user": "api@senitron.net",
"note": "",
"device_id": "",
"catalog_update": false,
"inventory_update": false,
"items": [
{
"item_number": "210000000062",
"qty": 10
},
{
"item_number": "210000000040",
"qty": 20
}
],
"assets": [
{
"epc": "C000C30E4F9B43E0000004EA",
"serial_number": "1258",
"item_number": "210000000062",
"sku": "",
"upc": 3252355,
"alu": "",
"description": "FOOT JOY M OUTER-LS 215 - L -",
"price": 45.0,
"retail_price": 59.0,
"msrp": 57.0,
"qty": 1
}
]
}'Success response
{
"message": "Sales order information has been received and will be saved in the cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location #001 not found |
| 200 | — | {"message": "The sales order #45001 already exists and has been completed; it can no longer be updated!"} |
Creates or updates sales order transaction_number. items (expected quantities) and assets (EPC-level lines) are imported in the background.
customer is a customer company name; a customer with that name and code is created if it doesn't exist.
transaction_date format:
MM/DD/YYYY hh:mm AM/PM. user must be an existing user email when assets are sent.catalog_update/inventory_update(assets only) also update the catalog and inventory from the asset lines.Completed sales orders can't be changed; the call then returns HTTP 200 with the message shown in Errors.
Manufacturing
Create Sales Orders to Zones in Senitron
/{tenant-code}/{location}/api/v1/mf/sales_to_zonesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"so_number": "WG-000004",
"po_number": "WG-000001",
"due_date": "05/08/2025",
"zone": {
"id": 0,
"name": "WG840"
},
"customer": {
"id": 0,
"name": "WALGREENS BOOTS ALLIANCE, INC."
},
"consignee": {
"name": "",
"address1": "1660 WINCHESTER BLVD",
"address2": "",
"city": "CAMPBELL",
"state": "CA",
"zip": "95008_1114"
},
"bill_to": {
"name": "",
"address1": "1660 WINCHESTER BLVD",
"address2": "",
"city": "CAMPBELL",
"state": "CA",
"zip": "95008_1114"
},
"ship_to": {
"name": "WALGREENS #2957",
"address1": "1660 WINCHESTER BLVD",
"address2": "",
"city": "CAMPBELL",
"state": "CA",
"zip": "95008_1114"
},
"items": [
{
"item_number": "CTUB-20062",
"qty": 10,
"uom": "CS",
"unit_weight": 0
},
{
"item_number": "CTUB-20007",
"qty": 10,
"uom": "CS",
"unit_weight": 0
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/mf/sales_to_zones?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"so_number": "WG-000004",
"po_number": "WG-000001",
"due_date": "05/08/2025",
"zone": {
"id": 0,
"name": "WG840"
},
"customer": {
"id": 0,
"name": "WALGREENS BOOTS ALLIANCE, INC."
},
"consignee": {
"name": "",
"address1": "1660 WINCHESTER BLVD",
"address2": "",
"city": "CAMPBELL",
"state": "CA",
"zip": "95008_1114"
},
"bill_to": {
"name": "",
"address1": "1660 WINCHESTER BLVD",
"address2": "",
"city": "CAMPBELL",
"state": "CA",
"zip": "95008_1114"
},
"ship_to": {
"name": "WALGREENS #2957",
"address1": "1660 WINCHESTER BLVD",
"address2": "",
"city": "CAMPBELL",
"state": "CA",
"zip": "95008_1114"
},
"items": [
{
"item_number": "CTUB-20062",
"qty": 10,
"uom": "CS",
"unit_weight": 0
},
{
"item_number": "CTUB-20007",
"qty": 10,
"uom": "CS",
"unit_weight": 0
}
]
}'Success response
{
"message": "The sales order information has been received and will be stored in the cloud."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | VALIDATION_ERROR | so_number is required; due_date is required; Item 1: Item not found: CTUB-20062 |
| 422 | PROCESSING_ERROR | <messages> |
| 422 | INTERNAL_ERROR | An unexpected error occurred while processing the request |
| 401 | UNAUTHORIZED | Invalid API key |
Required: so_number, due_date (
MM/DD/YYYY), zone (id, ornamewhen id is 0), customer (id, ornamewhen id is 0) and at least one item with item_number and a whole-number qty.items[].item_number may be the item number (Asset ID), ALU or SKU; the item must have a
CSunit of measure.unit_weightcan be omitted (taken from the catalog).All validation problems are returned together, separated by
;. When configured, an exception email (MF: Sales Order to Zone API Exceptions) is sent.
Shipping
Delete a Carton
/{tenant-code}/{location}/api/v1/shipping/inbound/cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
carton_number | string | required | Carton number. |
user | string | required | User email. |
device_name | string | optional | Handheld name (logged). |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/inbound/cartons?api_key=$SENITRON_API_KEY&location=$LOCATION&carton_number=<carton_number>&user=<user>"Success response
{
"message": "The carton has been deleted"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Carton number is required |
| 400 | MISSING_PARAMETER | User is required |
| 400 | NOT_FOUND | Carton with number 10000000004520000044 not found |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INTERNAL_ERROR | <exception message> |
Deletes the carton and its items from its receiving order (found by carton number). All errors return HTTP 400.
Get New Carton Number
/{tenant-code}/{location}/api/v1/shipping/inbound/carton_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
order_id | integer | required | Receiving order id. |
device_name | string | optional | Handheld name (logged). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/inbound/carton_number?api_key=$SENITRON_API_KEY&location=$LOCATION&order_id=<order_id>"Success response
{
"carton": {
"id": 151,
"carton_number": "10000000004520000044",
"carton_sequence_number": 44
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Order ID is required |
| 400 | NOT_FOUND | Receiving order with ID 452 not found |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INTERNAL_ERROR | <exception message> |
Creates a new empty carton on the order and returns its number:
1+ order id (12 digits, zero-padded) + sequence (7 digits). All errors return HTTP 400.
Get Receiving Orders (Inbound)
/{tenant-code}/{location}/api/v1/shipping/inbound/receiving_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
asn_number | string | optional | ASN number (exact, % wildcards allowed). |
container_number | string | optional | Container number. |
po_number | string | optional | PO number. |
reference_number | string | optional | Reference number. |
query | string | optional | Partial match on ASN, container number, vendor code, vendor name or reference number. |
is_open | boolean | optional | true hides received orders (ignored when a number filter or query is sent). |
items | boolean | optional | Include items. |
cartons | boolean | optional | Include cartons. |
assets | boolean | optional | Include received assets. |
items_details | boolean | optional | Add item_details. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/inbound/receiving_orders?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 2
},
"summary": {
"expected": {
"cartons": 2,
"skus": 10,
"assets": 20
},
"received": {
"cartons": 1,
"skus": 1,
"assets": 2
}
},
"orders": [
{
"id": 984331,
"note": "",
"asn_number": "038059839",
"container_number": "889002",
"po_number": "PO-100",
"vendor_code": "12",
"vendor_name": "ABC Clothing Co",
"reference_number": "8997",
"ship_date": "11/03/2025 09:11 AM",
"container_id": "5506",
"division": "AN",
"user": "API User",
"status": "Created",
"created_at": "11/04/2025 09:11 AM",
"updated_at": "11/04/2025 09:11 AM",
"pre_received_at": "",
"pre_received_by": "",
"summary": {
"expected": {
"cartons": 1,
"skus": 2,
"assets": 2
},
"received": {
"cartons": 0,
"skus": 0,
"assets": 0
}
},
"items": [
{
"id": 532225,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"status": "Sent",
"expected_qty": 4,
"received_qty": 2,
"non_rfid_item": false,
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"item_details": {
"id": 220620047,
"number": "210000004531",
"name": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"upc": 0,
"alu": "",
"sku": "CRYSP117-29",
"custom_sku": "",
"description": "Men's BB Deep Thinker SS Tee Spectra Yellow S",
"style": "",
"color": "",
"size": "",
"price": "0.0",
"cost_price": 0.0,
"retail_price": 70.0,
"msrp": 98.0,
"picture_url": "",
"cloud_picture_url": "",
"item_type_name": "",
"vendor_id": "",
"vendor_name": "Crysp Denim",
"manufacturer": "Crysp Denim",
"categories": [
{
"id": 118395,
"name": "Men's"
}
],
"text1": "210000004531 Crysp: Skywalker Biker Stone Wash 42",
"text2": "",
"epcs_count": 0,
"in_stock": 0
},
"cartons": [
{
"id": 2352354,
"carton_number": "10000000005640000003",
"carton_sequence_number": 3,
"user": "API User",
"device_name": "HH-564",
"status": "Created",
"created_at": "08/12/2025 09:11 AM",
"updated_at": "08/12/2025 09:11 AM",
"expected_qty": 30,
"received_qty": 30,
"assets": [
{
"id": 45,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "1218",
"qty": 1,
"text3": "Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Received",
"last_seen": "11/04/2025 09:11 AM",
"received_at": "11/04/2025 09:11 AM",
"received_by": "API User"
},
{
"id": 87,
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"text3": "UPC 3523535 - Last Seen",
"tag_status": {
"id": 1000,
"name": "Live"
},
"status": "Received",
"last_seen": "11/04/2025 09:11 AM",
"received_at": "11/04/2025 09:11 AM",
"received_by": "API User"
}
]
}
]
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
Cancelled orders are never returned. Newest first. The top-level
summarycovers all matching orders, not just the page.
Set or Clear the Non-RFID Item Flag
/{tenant-code}/{location}/api/v1/shipping/inbound/non_rfid_itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"order_id": 24,
"user": "api@senitron.net",
"device_name": "HH-53",
"manager_user_id": 110,
"manager_user_info": "API Manager User",
"reason": "",
"non_rfid_item": true,
"items": [
"210000052980",
"210000052981",
"210000052982"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/inbound/non_rfid_items?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"order_id": 24,
"user": "api@senitron.net",
"device_name": "HH-53",
"manager_user_id": 110,
"manager_user_info": "API Manager User",
"reason": "",
"non_rfid_item": true,
"items": [
"210000052980",
"210000052981",
"210000052982"
]
}'Success response
{
"message": "The non-RFID flag was successfully set for the item(s)."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Order ID is required |
| 400 | MISSING_PARAMETER | User is required |
| 400 | MISSING_PARAMETER | Items are required |
| 400 | MISSING_PARAMETER | Non-RFID item flag is required |
| 400 | ORDER_NOT_FOUND | The specified order does not exist. |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INVALID_STATUS | Cannot update a completed receiving order |
| 400 | NOT_FOUND | User with email api@senitron.net not found |
| 400 | ITEMS_NOT_FOUND | None of the specified items exist on the receiving order. |
| 400 | INTERNAL_ERROR | <exception message> |
Sets (
non_rfid_item: true) or clears (false) the non-RFID flag on the listed item numbers of the order. Withfalsethe message says "cleared".All errors return HTTP 400.
Upload Receiving Data
/{tenant-code}/{location}/api/v1/shipping/inbound/receiving_ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"order_id": 24,
"carton_number": "10000000002400000029",
"carton_sequence_number": 29,
"user": "api@senitron.net",
"device_name": "HH-53",
"comment": "",
"reason": "",
"user_manager_id": 0,
"user_manager_info": "",
"items": [
{
"item_number": "210000052983",
"non_rfid_item": false,
"expected_qty": 30,
"epcs": [
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
},
{
"epc": "321AB45009E66F00236700CE",
"serial_number": "1230",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 80
}
]
},
{
"item_number": "210000052988",
"non_rfid_item": true,
"expected_qty": 5,
"epcs": [
{
"epc": "FFFFFFFFFFFFFFFFFFFFFFFF",
"serial_number": "",
"qty": 5,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/inbound/receiving_orders?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"order_id": 24,
"carton_number": "10000000002400000029",
"carton_sequence_number": 29,
"user": "api@senitron.net",
"device_name": "HH-53",
"comment": "",
"reason": "",
"user_manager_id": 0,
"user_manager_info": "",
"items": [
{
"item_number": "210000052983",
"non_rfid_item": false,
"expected_qty": 30,
"epcs": [
{
"epc": "C000C30E4F9DFA0000000FF1",
"serial_number": "1256",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
},
{
"epc": "321AB45009E66F00236700CE",
"serial_number": "1230",
"qty": 1,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 80
}
]
},
{
"item_number": "210000052988",
"non_rfid_item": true,
"expected_qty": 5,
"epcs": [
{
"epc": "FFFFFFFFFFFFFFFFFFFFFFFF",
"serial_number": "",
"qty": 5,
"last_seen": "2025-08-22T00:51:50+01:00",
"rssi": 75
}
]
}
]
}'Success response
{
"message": "Carton data received and saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The specified location '001' could not be found. |
| 400 | MISSING_PARAMETER | Order ID is required |
| 400 | MISSING_PARAMETER | Carton number is required |
| 400 | MISSING_PARAMETER | User is required |
| 400 | MISSING_PARAMETER | Items are required |
| 400 | NOT_FOUND | Receiving order with ID 24 not found |
| 400 | INVALID_STATUS | Cannot update a cancelled receiving order |
| 400 | INVALID_STATUS | Cannot update a completed receiving order |
| 400 | NOT_FOUND | User with email api@senitron.net not found |
| 400 | INTERNAL_ERROR | <exception message> |
Records the scanned items of one carton (carton_number or carton_sequence_number). Non-RFID items use EPC
FFFFFFFFFFFFFFFFFFFFFFFFwith qty.A request with exactly one EPC is validated and saved immediately (errors returned). Larger requests are queued and processed in the background; validation errors are then not returned to the caller.
Temp Transfers
Upload Temp Transfer Order Data
/{tenant-code}/{location}/api/v1/temp_transfersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"from_location_number": "001",
"to_location_number": "002",
"reason": "",
"user": "api@senitron.net",
"device_name": "HH-53",
"parent_number": "0",
"zone": {
"id": 34,
"name": "Inside 101"
},
"assets": [
{
"item_number": "210000043021",
"non_rfid_item": false,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+01:00",
"rssi": 84
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/temp_transfers?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from_location_number": "001",
"to_location_number": "002",
"reason": "",
"user": "api@senitron.net",
"device_name": "HH-53",
"parent_number": "0",
"zone": {
"id": 34,
"name": "Inside 101"
},
"assets": [
{
"item_number": "210000043021",
"non_rfid_item": false,
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"last_seen": "2025-08-22T00:50:50+01:00",
"rssi": 84
}
]
}'Success response
{
"id": 23213,
"message": "Temporary transfer information has been saved successfully."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | No assets to transfer |
| 422 | MISSING_PARAMETER | device_name is required |
| 422 | NOT_FOUND | User is required |
| 422 | NOT_FOUND | The source location 001 not found |
| 422 | NOT_FOUND | The destination location 002 not found |
| 422 | FORBIDDEN | User does not belong to this client |
| 422 | PROCESSING_ERROR | <exception message> |
user must be an existing user of the tenant; device_name is required.
When the handheld setting Enable temporary transfers is on, a temporary transfer is saved and its
idreturned. Otherwise the assets are moved directly in the background and the response is{"message": "Transfer processing has been queued"}.EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs. All errors return HTTP 422.
Tenant Validation
Tenant Code and Key Validation API
/api/v1/tenant_validateRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Senitron integration key (provided by Senitron support). |
tenant_code | string | required | Tenant code. |
tenant_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/api/v1/tenant_validate?key=$SENITRON_API_KEY&tenant_code=<tenant_code>&tenant_key=<tenant_key>"
Success response
{
"valid": true,
"id": 67,
"code": "acme",
"name": "Acme Corp",
"key": "<tenant api key>",
"email": "admin@example.com",
"expiration_date": "12/23/2027",
"enable": true
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"code": "INVALID_API_KEY", "message": "The API key is invalid"} |
| 401 | — | {"error": {"code": "TENANT_CODE_INVALID", "message": "The tenant code is invalid"}} |
| 401 | — | {"error": {"code": "TENANT_KEY_INVALID", "message": "The tenant key is invalid"}} |
| 200 | — | {"error": {"code": "TENANT_CODE_KEY_NOT_MATCH", "message": "The tenant code and key do not match"}} |
Checks that a tenant code and API key belong together.
validis true when the tenant is enabled and its key has not expired.Errors use a
codefield (nottype); the code/key mismatch is returned with HTTP 200.
CDM
Assigning CDM to a Tenant/Location Pair
/api/v1/cdm/assignRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
cdm_mac | string | required | CDM MAC address (case-insensitive). |
tenant_code | string | required | Tenant code (must own the API key). |
location | string | required | Location code. |
Try it with curl
curl "https://app.senitron.net/api/v1/cdm/assign?api_key=$SENITRON_API_KEY&cdm_mac=<cdm_mac>&tenant_code=<tenant_code>&location=$LOCATION"
Success response
{
"message": "The CDM was successfully assigned to the specified tenant/location"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TENANT_NOT_FOUND | The specified tenant does not exist. |
| 401 | UNAUTHORIZED | Invalid API key |
| 404 | LOCATION_NOT_FOUND | The specified location does not exist. |
| 404 | CDM_NOT_REGISTER | The specified CDM is not registered in the cloud. |
| 422 | ASSIGNMENT_FAILED | <validation messages> |
Assigns a registered CDM (reader controller) to the location. A different CDM previously assigned to that location is unassigned.
Utilities
Get Client IP Address
/api/v1/getipRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Senitron integration key (provided by Senitron support). |
format | string | optional | json returns {"ip": …}; otherwise a JSON string. |
Try it with curl
curl "https://app.senitron.net/api/v1/getip?key=$SENITRON_API_KEY"
Success response
{
"ip": "82.159.79.16"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"message": "Please provide correct key"} |
Returns the public IP address the request came from (useful for allow-listing). Without
format=jsonthe body is just the IP as a JSON string, e.g."82.159.79.16".
Sale / Return Transactions
Upload Transactions [Sale/Return] Data V1
/{tenant-code}/{location}/api/v1/arbitraryRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"Name": "Sale",
"Location": "001",
"Count": 2,
"Total": 0.0,
"Currency": "USD",
"Date": "2025-12-09 09:29:24",
"From": "",
"To": "",
"DocumentId": "",
"Reference4": "50",
"TransactionDetails": [
{
"EpcId": "EF9C30000000004000000237",
"ItemNo": "00000000001",
"ProductId": "00000000001",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
},
{
"EpcId": "EF9C3000000000800000022A",
"ItemNo": "00000000002",
"ProductId": "00000000002",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/arbitrary?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Name": "Sale",
"Location": "001",
"Count": 2,
"Total": 0.0,
"Currency": "USD",
"Date": "2025-12-09 09:29:24",
"From": "",
"To": "",
"DocumentId": "",
"Reference4": "50",
"TransactionDetails": [
{
"EpcId": "EF9C30000000004000000237",
"ItemNo": "00000000001",
"ProductId": "00000000001",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
},
{
"EpcId": "EF9C3000000000800000022A",
"ItemNo": "00000000002",
"ProductId": "00000000002",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
}
]
}'Success response
{
"response": "OK"
}Queues POS transaction data for background processing; the transaction type comes from Name (e.g.
Sale,Return).The response only confirms the data was queued.
Upload Transactions [Sale/Return] Data V2
/{tenant-code}/{location}/api/v1/salePOST /{tenant-code}/{location}/api/v1/transactionsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"Name": "Sale",
"Location": "001",
"Count": 2,
"Total": 0.0,
"Currency": "USD",
"Date": "2025-12-09 09:29:24",
"From": "",
"To": "",
"DocumentId": "",
"Reference4": "50",
"EmployeeId": "10",
"TransactionDetails": [
{
"EpcId": "EF9C30000000004000000237",
"ItemNo": "00000000001",
"ProductId": "00000000001",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
},
{
"EpcId": "EF9C3000000000800000022A",
"ItemNo": "00000000002",
"ProductId": "00000000002",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/sale?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Name": "Sale",
"Location": "001",
"Count": 2,
"Total": 0.0,
"Currency": "USD",
"Date": "2025-12-09 09:29:24",
"From": "",
"To": "",
"DocumentId": "",
"Reference4": "50",
"EmployeeId": "10",
"TransactionDetails": [
{
"EpcId": "EF9C30000000004000000237",
"ItemNo": "00000000001",
"ProductId": "00000000001",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
},
{
"EpcId": "EF9C3000000000800000022A",
"ItemNo": "00000000002",
"ProductId": "00000000002",
"ProductDesc": "",
"Attr1": "",
"Attr2": "",
"UnitPrice": 0.0
}
]
}'Success response
{
"response": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 500 | — | {"response": "Unexpected type"} |
Name selects the processor:
Sale,Return,Transfer InorTransfer Out. A body withReads(and no matching Name) is processed as CDM reads. Any other value returns HTTP 500{"response": "Unexpected type"}.Processing runs in the background; the response only confirms the data was queued.
Create or Update Transaction
/{tenant-code}/{location}/api/v1/transactions/updateRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"document_id": "INV-20031",
"count": 2,
"name": "Sale",
"comment": "",
"reference": "R-1",
"total": 120.0,
"currency": "USD",
"date": "2026-10-07 09:00:00",
"transaction_details": [
{
"product_id": "210000047060",
"count": 1,
"epc": "CF19930E4FA6BD4000000432",
"upc": "889001112223",
"price": 60.0
},
{
"product_id": "210000047061",
"count": 1,
"price": 60.0
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transactions/update?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"document_id": "INV-20031",
"count": 2,
"name": "Sale",
"comment": "",
"reference": "R-1",
"total": 120.0,
"currency": "USD",
"date": "2026-10-07 09:00:00",
"transaction_details": [
{
"product_id": "210000047060",
"count": 1,
"epc": "CF19930E4FA6BD4000000432",
"upc": "889001112223",
"price": 60.0
},
{
"product_id": "210000047061",
"count": 1,
"price": 60.0
}
]
}'Success response
{
"message": "Transaction updated successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"message": "Missing required field \"document_id\""} |
| 200 | — | {"message": "Missing required field \"count\""} |
| 200 | — | {"message": "Missing required field \"transaction_details\""} |
| 200 | — | {"message": "Missing required field \"product_id\""} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Finds the transaction by document_id (or creates it) and updates its header and lines. A line with
count> 1 replaces all lines of that product withcountnew lines.Validation errors are returned with HTTP 200 and a
message; check the message, not the status.
Upload Return Data (Legacy)
/{tenant-code}/{location}/api/v1/returnRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
"sale-v2"Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/return" \
-H "Content-Type: application/json" \
-d '"sale-v2"'Success response
{
"response": "OK"
}Legacy endpoint: the body is queued to the same processor as sales (same format as Upload Transactions [Sale/Return] Data V2). Prefer that endpoint with
Name: "Return".No authentication is checked.
Upload Shipment Data (Legacy)
/{tenant-code}/{location}/api/v1/shipmentRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
"sale-v2"Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipment" \
-H "Content-Type: application/json" \
-d '"sale-v2"'Success response
{
"response": "OK"
}Legacy endpoint: the body is queued to the sales processor (same format as Upload Transactions [Sale/Return] Data V2).
No authentication is checked.
Import Sale Orders as Transactions (CSV)
/{tenant-code}/{location}/api/v1/sale/import-sale-ordersRequest headers
| Header | Value |
|---|---|
Content-Type | multipart/form-data |
Parameters
| Name | Type | Description | |
|---|---|---|---|
file | file | required | CSV file (multipart/form-data). |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/sale/import-sale-orders" \
-F "file=@file.csv"Success response
{
"note": "HTTP 200 with an empty body"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": ""} (no file) |
Uploads a CSV of sale orders that is imported as sale transactions in the background.
No authentication is checked.
Transfers
Getting the Transfer Assets
/{tenant-code}/api/v1/transfers/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
transfer_id | integer | optional | Senitron transfer id. |
document_number | string | optional | Exact document number. |
reference_number | string | optional | Exact reference number. |
query | string | optional | Partial match on id, document or reference number. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/transfers/assets?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transfers": [
{
"id": 86186,
"source_location": "001",
"source_location_name": "UAE Warehouse (PK Factory)",
"destination_location": "44302W",
"destination_location_name": "UK Online Store",
"document_number": "",
"reference_number": "",
"transfer_date": "2025-11-07T12:25:23-08:00",
"received_date": "2025-11-07T12:25:23-08:00",
"status": "PENDING",
"external_id": 0,
"assets": [
{
"id": 2092393,
"number": "1001901564",
"name": "25-10-11E16-06TA",
"upc": 1001901564,
"alu": "1001901564",
"sku": "25-10-11E16-06TA",
"epc": "FFE0A00EEDF37F00002CF13D",
"serial_number": 2945341,
"qty": 1,
"shipped": true,
"received": false
},
{
"id": 2092394,
"number": "1001901564",
"name": "25-10-11E16-06TA",
"upc": 1001901564,
"alu": "1001901564",
"sku": "25-10-11E16-06TA",
"epc": "FFE0A00EEDF37F00002D842A",
"serial_number": 2982954,
"qty": 1,
"shipped": true,
"received": false
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key or Token |
Searches all of the tenant's transfers, newest first, with every EPC on each transfer. Dates are ISO 8601.
statusis one ofPENDING,PARTIALLY_RECEIVED,RECEIVEDorUNDO.
Get Transfer-Out Data
/{tenant-code}/{location}/api/v1/transfers/outRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL; also accepted as source_location or store_code). |
query | string | optional | Partial match on id, document number or reference. |
status | string | optional | Comma-separated: pending, partially_received, received, undo. |
sn_id | integer | optional | Senitron transfer id. |
items_details | boolean | optional | Add item_details to each asset group. |
assets | boolean | optional | false returns empty assets arrays. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfers/out?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transfers": [
{
"id": 68855,
"external_id": 0,
"document_number": "",
"reference_number": "",
"transfer_date": "2026-02-13T09:16:27.107-08:00",
"received_date": "",
"status": "pending",
"api_status": "",
"source_location": "001",
"source_location_name": "Location A",
"destination_location": "002",
"destination_location_name": "Location B",
"device_name": "HH-973",
"user": "API User",
"assets": [
{
"item_number": "00000000001",
"line_number": 0,
"non_rfid_item": false,
"item_details": {
"id": 221005322,
"number": "00000000001",
"name": "BOYS SUITBOYSUIFAS",
"upc": 87578876,
"alu": "52534764764",
"description": "BOYS SUITBOYSUIFAS",
"style": "",
"colour": "Blue",
"size": "Large",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "80.0",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 1185255,
"name": "Child Category"
}
],
"text1": "",
"text2": "",
"in_stock": 0
},
"epcs": [
{
"id": 120,
"epc_id": "EF9C30000000004000000253",
"asset_id": "595",
"sent_qty": 1,
"received_qty": 0,
"text3": "",
"status": {
"id": 7855,
"name": ""
},
"received": false
}
]
}
],
"sent": {
"items_count": 1,
"assets_count": 1
},
"received": {
"items_count": 0,
"assets_count": 0
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Lists transfers whose source is location.
Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither
querynorstatusis sent, fully received transfers are left out.statusis the display status;api_statusis the raw transfer status.transfer_dateandreceived_dateare returned as stored (format may vary by source).
Get Transfer-In Data
/{tenant-code}/{location}/api/v1/transfers/inRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL; also accepted as source_location or store_code). |
query | string | optional | Partial match on id, document number or reference. |
status | string | optional | Comma-separated: pending, partially_received, received, undo. |
sn_id | integer | optional | Senitron transfer id. |
items_details | boolean | optional | Add item_details to each asset group. |
assets | boolean | optional | false returns empty assets arrays. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfers/in?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"transfers": [
{
"id": 10043,
"external_id": 17188209,
"document_number": "17188209",
"reference_number": "TO0008494",
"transfer_date": "10/14/2019 10:34 PM",
"received_date": "",
"status": "Pending",
"api_status": "sent",
"source_location": "002",
"source_location_name": "Location B",
"destination_location": "001",
"destination_location_name": "Location A",
"device_name": "",
"user": "",
"assets": [
{
"item_number": "000492",
"line_number": 0,
"non_rfid_item": false,
"item_details": {
"id": 3243281,
"number": "000492",
"name": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ",
"upc": 0,
"alu": "ROY-BOX87",
"description": "ROY ROYAL HAWAIIAN PRINT BOX 4OZ P007104",
"style": "No",
"colour": "0.15",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "0",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 381199,
"name": "W1w"
}
],
"text1": "000127 Arabian Cordura Saddle",
"text2": "BLACK 15.5 ARABIAN,814.99",
"in_stock": 3
},
"epcs": [
{
"id": 14131,
"epc_id": "CF00000000001FC00000000B",
"asset_id": "11",
"sent_qty": 1,
"received_qty": 0,
"text3": "11/01/2019 01:56 PM",
"status": {
"id": 1045,
"name": "Pending Visibility"
},
"received": false
},
{
"id": 14132,
"epc_id": "CF00000000001FC0000000FB",
"asset_id": "110",
"sent_qty": 1,
"received_qty": 0,
"text3": "11/01/2019 01:56 PM",
"status": {
"id": 1045,
"name": "Pending Visibility"
},
"received": false
}
]
}
],
"sent": {
"items_count": 1,
"assets_count": 2
},
"received": {
"items_count": 0,
"assets_count": 0
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 401 | UNAUTHORIZED | Invalid API key or Token |
Lists transfers whose destination is location.
Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither
querynorstatusis sent, fully received transfers are left out.statusis the display status;api_statusis the raw transfer status.transfer_dateandreceived_dateare returned as stored (format may vary by source).
Merge the Transfers
/{tenant-code}/api/v1/transfers/mergeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/transfers/merge?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "HH-53",
"base_transfer": 27843,
"merged_transfers": [
13654,
194834
]
}'Success response
{
"messages": "The selected transfers have been merged successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TRANSFER_NOT_FOUND | Base transfer ID not found |
| 404 | NOT_FOUND | No valid merged transfers |
| 400 | BAD_REQUEST | <exception message> |
Merges merged_transfers into base_transfer. Only transfers with the same destination as the base transfer and nothing received yet are merged; others are ignored.
user(email) is recorded as the user who merged.
Transfer Receiving
/{tenant-code}/{location}/api/v1/transfers/receivingRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"source_location": "001",
"destination_location": "002",
"transfer_date": "11/26/2019 08:30 PM",
"document_number": "D-6724",
"reference_number": "R-4534",
"eos_item_fulfillment_number": "IF-6712",
"reference1": "ref-1",
"reference2": "ref-2",
"reference3": "ref-3",
"reference4": "ref-4",
"shipping_method": "",
"destination_zone": "Receiving",
"reason": "This is a test reason",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"items": [
{
"item_number": "000493",
"item_name": "FIGS DRIED WOODEN BOX 22LBS",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "11/26/2019 07:56 PM",
"rssi": 75,
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "11/26/2019 08:16 PM",
"rssi": 90,
"qty": 1
}
]
},
{
"item_number": "000494",
"item_name": "ROY PRINT BOX 4OZ P007104",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F0023000BAA",
"last_seen": "11/26/2019 08:12 PM",
"rssi": 75,
"qty": 1
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfers/receiving?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"source_location": "001",
"destination_location": "002",
"transfer_date": "11/26/2019 08:30 PM",
"document_number": "D-6724",
"reference_number": "R-4534",
"eos_item_fulfillment_number": "IF-6712",
"reference1": "ref-1",
"reference2": "ref-2",
"reference3": "ref-3",
"reference4": "ref-4",
"shipping_method": "",
"destination_zone": "Receiving",
"reason": "This is a test reason",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"items": [
{
"item_number": "000493",
"item_name": "FIGS DRIED WOODEN BOX 22LBS",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F002367ABCD",
"last_seen": "11/26/2019 07:56 PM",
"rssi": 75,
"qty": 1
},
{
"epc": "321AB45009E66F00236700CE",
"last_seen": "11/26/2019 08:16 PM",
"rssi": 90,
"qty": 1
}
]
},
{
"item_number": "000494",
"item_name": "ROY PRINT BOX 4OZ P007104",
"non_rfid_item": false,
"epcs": [
{
"epc": "321AB45009E66F0023000BAA",
"last_seen": "11/26/2019 08:12 PM",
"rssi": 75,
"qty": 1
}
]
}
]
}'Success response
{
"id": 3424,
"message": "The transfer receiving data has been received, and a job has been scheduled to process it"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 404 | NOT_FOUND | The destination store is not found. Please enter store code |
| 404 | NOT_FOUND | EPC Tags are not found. Please enter valid EPC Tags |
| 404 | TRANSFER_EXISTS | A transfer exists with the same document and reference number! |
| 422 | ITEM_FULFILLMENT_REQUIRED | The item fulfillment number (eos_item_fulfillment_number) is required for this transfer. |
| 422 | ITEM_FULFILLMENT_NOT_FOUND | The item fulfillment IF-6712 does not belong to this transfer. |
One-step transfer: creates the transfer slip from the scanned items and receives it at destination_location; receiving runs in the background.
TRANSFER_EXISTSalso returns the existing transferid. With NetSuite item-fulfillment transfers, eos_item_fulfillment_number is required when a document or reference number is sent.EPCs registered in the Universal Permanent Status Registry with a non-inventory status are skipped and returned in
ignored_upsr_epcs.user(email) is used when calling with the API key.
Transfer Zone
/{tenant-code}/{location}/api/v1/transfers/zoneRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"device_name": "HH-53",
"zone": {
"id": 1,
"name": "Inside Zone A"
},
"epcs": [
{
"epc": "C6000020000000000001CCD8",
"last_seen": "2024-09-19T15:01:55-04:00",
"rssi": 50
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfers/zone?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"device_name": "HH-53",
"zone": {
"id": 1,
"name": "Inside Zone A"
},
"epcs": [
{
"epc": "C6000020000000000001CCD8",
"last_seen": "2024-09-19T15:01:55-04:00",
"rssi": 50
}
]
}'Success response
{
"message": "Transfer assets to new zone is successful"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ZONE_NOT_FOUND | The zone 1 was not found |
| 404 | <exception class> | <exception message> |
Moves the tags to sub-zone zone.id (static zone). Unknown EPCs are added to inventory first (
last_seenmust be a parseable date).Handheld settings control the details: update both static and normal zone also updates last seen and antenna; update tag status to Live sets non-inventory tags to Live (unless their status prevents changes in transfers).
If configured, the move is also sent to the external transfer-zone API and replenishment alerts are refreshed.
Create Transfer Slip (Legacy)
/{tenant-code}/{location}/api/v1/transfer-slipRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Tenant API key (named key, query string). |
Request body
{
"transfer_type": "Transfer Out",
"transfer_slip_stores": "002",
"transfer_slip_epc_ids": [
"CF19930E4FA6BD4000000432"
],
"DocumentId": "TS-1001",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"reason_info": "Restock"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer-slip?key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"transfer_type": "Transfer Out",
"transfer_slip_stores": "002",
"transfer_slip_epc_ids": [
"CF19930E4FA6BD4000000432"
],
"DocumentId": "TS-1001",
"reference1": "",
"reference2": "",
"reference3": "",
"reference4": "",
"reason_info": "Restock"
}'Success response
{
"status": "success"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"error": "Invalid API key"} |
| 400 | — | {"error": "No epcs sent in slip"} |
Creates a pending transfer slip from this location to transfer_slip_stores and sets the EPCs to In Transit at the destination. Prefer Transfer Out for new integrations.
Wave Orders & Picking (WOP)
Assign a Wave Order to an User
/{tenant-code}/{location}/api/v1/wop/picking/orders/assignRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/picking/orders/assign?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28
}'Success response
{
"message": "The wave order has been assigned to the specified user."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | VALIDATION_ERROR | The wave order user assignment can only be updated when the wave order status is Created or Firmed, unless you have the Force User Assign permission. |
| 422 | INTERNAL_ERROR | Failed to assign wave order |
Assigns wave order wave_id to user. Allowed only while the order is
createdorfirmed, unless the user has the Force user assign permission.All errors return HTTP 422. user must be an existing user email of the tenant.
Delete Pick List Item Assets
/{tenant-code}/{location}/api/v1/wop/picking/orders/items/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
}
]
}Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/picking/orders/items/assets?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53"
}
]
}
]
}'Success response
{
"message": "The wave order picking asset(s) have been deleted."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | MISSING_PARAMETER | items array is required |
| 422 | INTERNAL_ERROR | Failed to delete picking assets |
Un-picks the listed assets from the wave order items.
All errors return HTTP 422. user must be an existing user email of the tenant.
Delete Wave Orders Picking Items
/{tenant-code}/{location}/api/v1/wop/picking/orders/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"add_to_chase_list": false,
"remove_action": "",
"items": [
{
"item_number": "210000006265",
"expected_qty": 1,
"picked_qty": 0,
"order_type": "SO",
"source": "Shopify",
"reference_number": "SO212342144",
"zone": {
"id": 56,
"name": "A25-3-A",
"order": 2,
"qty": 1
},
"reason": "The item not found"
}
]
}Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/picking/orders/items?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"add_to_chase_list": false,
"remove_action": "",
"items": [
{
"item_number": "210000006265",
"expected_qty": 1,
"picked_qty": 0,
"order_type": "SO",
"source": "Shopify",
"reference_number": "SO212342144",
"zone": {
"id": 56,
"name": "A25-3-A",
"order": 2,
"qty": 1
},
"reason": "The item not found"
}
]
}'Success response
{
"message": "Item(s) removed from wave order successfully."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | MISSING_PARAMETER | items array is required |
| 422 | VALIDATION_ERROR | Wave order status must be created or firmed or picking |
| 422 | INTERNAL_ERROR | Failed to remove item from wave order |
Removes items from a wave order in status
created,firmedorpicking. remove_action defaults toadd_to_chase_listwhenadd_to_chase_list: true, otherwiseundo_wave;items[].reasonis logged.The wave order is cancelled when no items remain, or finished when the remaining items are fully picked.
All errors return HTTP 422. user must be an existing user email of the tenant.
Get Wave Orders Picking List
/{tenant-code}/{location}/api/v1/wop/picking/ordersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
wave_id | integer | optional | Exact wave order id. |
query | string | optional | Partial match on id, title or reference number. |
status | string | optional | created, firmed, picking, picked, … |
assigned_to | string | optional | User email, or nobody for unassigned orders. |
is_open | boolean | optional | true = only firmed or picking orders. |
items | boolean | optional | Include items. |
assets | boolean | optional | With items, include picked assets. |
items_zones | boolean | optional | With items, include item_zones. |
items_details | boolean | optional | With items, add item_details. |
sort_field | string | optional | Default id. |
sort_type | string | optional | asc (default) or desc. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10, maximum 100; 0 = 100. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/picking/orders?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"orders": [
{
"id": 28,
"reference_number": "599123",
"title": "Wave Order 28",
"wave_type": "SO-Single",
"due_date": "10/20/2025 10:30 AM",
"user": "api@senitron.net",
"user_name": "API User",
"progress": 90,
"assigned_to": "api@senitron.net",
"assigned_to_name": "API User",
"start_time": "10/20/2025 10:30 AM",
"end_time": "10/20/2025 10:45 AM",
"created_at": "10/20/2025 10:30 AM",
"updated_at": "10/20/2025 10:45 AM",
"status": "created",
"bulk_customer": false,
"customer": {
"id": 0,
"code": "",
"name": ""
},
"expected": {
"skus": 2,
"assets": 4
},
"picked": {
"skus": 0,
"assets": 0
},
"last_picked_zone": {
"id": 0,
"name": ""
},
"items": [
{
"item_number": 210000001209,
"expected_qty": 1,
"picked_qty": 1,
"order_type": "SO",
"source": "Shopify",
"reference_number": "SO100200300",
"zone": {
"id": 56,
"name": "A25-3-A",
"order": 3,
"qty": 1
},
"assets": [
{
"id": 478,
"epc": "CF19930E4F9B8B900000041E",
"serial_number": "1054",
"qty": 1,
"device_name": "HH-305",
"user": "api@senitron.net",
"user_name": "API User",
"last_seen": "03/14/2023 10:45 PM",
"picked": true,
"picked_zone": {
"id": 0,
"name": ""
}
}
],
"item_zones": [
{
"id": 453,
"name": "A25-4-A",
"order": 5,
"qty": 2
},
{
"id": 458,
"name": "A25-5-A",
"order": 8,
"qty": 3
},
{
"id": 459,
"name": "A25-6-A",
"order": 11,
"qty": 1
}
],
"item_details": {
"id": 3243281,
"number": "210000001209",
"name": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"upc": 0,
"alu": "BOX87",
"sku": "60032222",
"description": "Day 2.05 Cargo O/L in Hunter Green 34 (US 4) P007104",
"style": "No",
"color": "0.15",
"size": "",
"dcs": "",
"dnc": false,
"total_qty": 0,
"price": "814.99",
"picture_url": "",
"item_type_name": "Regular",
"categories": [
{
"id": 118395,
"name": "W1w"
}
],
"text1": "52983 Day 2.05 Cargo O/L in Hunter Green 34 (US 4)",
"text2": "BLACK 15.5,814.99",
"in_stock": 2
}
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | INVALID_STATUS | Invalid status: done |
| 422 | INVALID_EMAIL | Invalid email format: abc |
| 422 | USER_NOT_FOUND | User not found with email: x@example.com |
| 422 | INTERNAL_ERROR | Internal server error |
Each order adds
bulk_customerand acustomerobject (id,code,name). Transfer-mode wave orders also includereference_detailswith the transfer's source and destination locations.Items are sorted by zone order, then reference number. Times are in the location's time zone.
per_pageis capped at 100.
Get WOP Settings
/{tenant-code}/{location}/api/v1/wop/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
location | string | required | Location code (General mode: from the URL). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/settings?api_key=$SENITRON_API_KEY&location=$LOCATION"Success response
{
"so_processing_interval": 20,
"picked_asset_status": {
"id": 7197,
"name": "Picked",
"include_inventory": false
},
"shipped_asset_status": {
"id": 7198,
"name": "ECOM Shipped",
"include_inventory": false
},
"update_picked_asset_zones_when_new_zone_detected": false,
"wo_picking_update_static_and_rfid_zone": true,
"auto_shipped_when_opening_so": true,
"auto_ship_multi_so_items": true,
"prevent_duplicate_epcs": true,
"auto_reject_before_waving": true,
"wo_modes": [
{
"mode": 1,
"title": "SO-Single",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [
{
"id": 1,
"name": "DC Pick"
}
],
"picking_cart_zones": [
{
"id": 2,
"name": "ECOM PICK CART"
}
],
"shipped_zone": {
"id": 3,
"name": "ECOM SHIPPED"
},
"enable_auto_firm": false
},
{
"mode": 2,
"title": "SO-Multi",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 3,
"title": "SO-Single-AMZ",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [
{
"id": 1,
"name": "DC Pick"
}
],
"picking_cart_zones": [
{
"id": 2,
"name": "ECOM PICK CART"
}
],
"shipped_zone": {
"id": 3,
"name": "ECOM SHIPPED"
},
"enable_auto_firm": false
},
{
"mode": 4,
"title": "SO-Multi-AMZ",
"max_order_count": 40,
"max_order_qty": 40,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 5,
"title": "TO",
"max_order_count": 1,
"max_order_qty": 100,
"picking_zones": [
{
"id": 1,
"name": "DC Pick"
}
],
"picking_cart_zones": [
{
"id": 2,
"name": "ECOM PICK CART"
}
],
"shipped_zone": {
"id": 3,
"name": "ECOM SHIPPED"
},
"enable_auto_firm": false
},
{
"mode": 6,
"title": "SO-Single-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 7,
"title": "SO-Multi-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 8,
"title": "SO-Single-AMZ-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 9,
"title": "SO-Multi-AMZ-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
},
{
"mode": 10,
"title": "TO-CL",
"max_order_count": 100,
"max_order_qty": 100,
"picking_zones": [],
"picking_cart_zones": [],
"shipped_zone": {
"id": 0,
"name": ""
},
"enable_auto_firm": false
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
Returns the tenant's Wave Order Picking settings and modes. Missing statuses or zones are returned with id 0 and empty names.
POST Wave Orders Picking Items
/{tenant-code}/{location}/api/v1/wop/picking/orders/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Request body
{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"reference_number": "SO2352324",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"reference_number": "SO2352324",
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/picking/orders/items?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"location": "001",
"datetime": "06/26/2020 08:30 PM",
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"wave_id": 28,
"items": [
{
"item_number": "210000006265",
"qty": 2,
"reference_number": "SO2352324",
"assets": [
{
"epc": "C000C30E4F9DFA00000004C2",
"serial_number": "2453",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
},
{
"epc": "CF19930E4F9CC79000000999",
"serial_number": "2457",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
},
{
"item_number": "210000001207",
"qty": 1,
"reference_number": "SO2352324",
"assets": [
{
"epc": "CF19930E4F9B8B700000099E",
"serial_number": "2462",
"qty": 1,
"user": "api@senitron.net",
"user_name": "API User",
"device_name": "HH-53",
"last_seen": "2025-08-22T00:50:50+1:00:00.000000",
"rssi": 84,
"zone": {
"id": 34,
"name": "A25-3-A"
}
}
]
}
]
}'Success response
{
"message": "The wave order picking item(s)/asset(s) have been received and saved in the cloud."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | MISSING_PARAMETER | Location is required |
| 422 | LOCATION_NOT_FOUND | The location 001 not found |
| 422 | MISSING_PARAMETER | wave_id is required |
| 422 | MISSING_PARAMETER | user (email) is required |
| 422 | NOT_FOUND | Wave order with id 28 not found |
| 422 | NOT_FOUND | User with email api@senitron.net not found |
| 422 | MISSING_PARAMETER | items array is required |
| 422 | VALIDATION_ERROR | Wave order has already been picked |
| 422 | EPC_ALREADY_PICKED | The EPC has already been picked in WO# 27 for item# 210000006265 |
| 422 | INTERNAL_ERROR | Failed to save picking data |
Records picked assets for the wave order items. Unknown EPCs are created from the EPC profile.
assets[].last_seenandassets[].zone.idupdate the tag (static zone, and RFID zone when the WOP setting is on).Picked tags get the WOP Picked status. When Prevent duplicate EPCs is on, an EPC picked in another wave order is rejected.
All errors return HTTP 422. user must be an existing user email of the tenant.
Settings
Get UI Settings (API key)
/{tenant-code}/{location}/api/v1/settings/uiRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/settings/ui?api_key=$SENITRON_API_KEY"Success response
{
"attributes": [
{
"default_label": "Asset ID",
"name": "col_asset_id",
"user_label": "Item #"
},
{
"default_label": "ALU",
"name": "col_alu",
"user_label": "ALU"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key |
Same response as Get UI Settings (Column Labels), authenticated with the tenant API key.
Catalog (Tenant)
List Catalog Items
/{tenant-code}/api/v1/catalogsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
query | string | optional | Exact number/SKU/custom SKU/ALU/UPC (case-insensitive) or partial description. |
inventory_data | boolean | optional | Add inventory (in-inventory tags and quantity per location). |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 100. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/catalogs?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 100,
"total_entries": 1
},
"items": [
{
"id": 597116103,
"number": "000000197634",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"description": "Hoka Bondi 8",
"short_description": "Hoka Bondi 8 running shoe",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"type": "Regular",
"manufacturer": "Hoka",
"vendor_id": "",
"vendor_name": "Bondi 8",
"price": 64.95,
"retail_price": 87.5,
"msrp": 0.0,
"extra": "",
"dcs": "",
"dnc": false,
"non_rfid_item": false,
"categories": [
{
"name": "Shoes",
"children": [
{
"name": "Running",
"children": []
}
]
}
],
"unit_of_measure": "EA",
"base_unit_of_measure": "EA",
"preferred_unit_of_mea22sure": "EA",
"mf_back_flush": false,
"mf_exp_calculation": "",
"ext_sync": false,
"mf_disable_production": false,
"mf_auto_production_quality_hold": false,
"attr3": "",
"attr4": "",
"attr22": "",
"picture": "",
"disable_printing": false,
"cloud_picture_url": "",
"created_at": "12/18/2024 20:20 PM",
"updated_at": "05/07/2026 15:20 PM",
"inventory": {
"tags": 12,
"qty": 12.0,
"locations": [
{
"location_code": "001",
"location_name": "Floor-1",
"tags": 12,
"qty": 12.0
}
]
}
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Tenant-wide catalog (not tied to a location).
inventoryappears only withinventory_data=true.Response quirks: the preferred unit of measure is returned under the key
preferred_unit_of_mea22sure;created_at/updated_atuse a 24-hour hour with AM/PM.
Get Catalog Item
/{tenant-code}/api/v1/catalogs/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Item number (padding is added automatically). |
inventory_data | boolean | optional | Add inventory. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/catalogs/<id>?api_key=$SENITRON_API_KEY"Success response
{
"id": 597116103,
"number": "000000197634",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"description": "Hoka Bondi 8",
"short_description": "Hoka Bondi 8 running shoe",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"type": "Regular",
"manufacturer": "Hoka",
"vendor_id": "",
"vendor_name": "Bondi 8",
"price": 64.95,
"retail_price": 87.5,
"msrp": 0.0,
"extra": "",
"dcs": "",
"dnc": false,
"non_rfid_item": false,
"categories": [
{
"name": "Shoes",
"children": [
{
"name": "Running",
"children": []
}
]
}
],
"unit_of_measure": "EA",
"base_unit_of_measure": "EA",
"preferred_unit_of_mea22sure": "EA",
"mf_back_flush": false,
"mf_exp_calculation": "",
"ext_sync": false,
"mf_disable_production": false,
"mf_auto_production_quality_hold": false,
"attr3": "",
"attr4": "",
"attr22": "",
"picture": "",
"disable_printing": false,
"cloud_picture_url": "",
"created_at": "12/18/2024 20:20 PM",
"updated_at": "05/07/2026 15:20 PM",
"inventory": {
"tags": 12,
"qty": 12.0,
"locations": [
{
"location_code": "001",
"location_name": "Floor-1",
"tags": 12,
"qty": 12.0
}
]
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": {"status": "error", "code": 102, "message": "Item not found"}} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Same item fields as List Catalog Items.
Create or Update Catalog Item
/{tenant-code}/api/v1/catalogsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"number": "",
"unique_field": "sku",
"description": "Hoka Bondi 8",
"short_description": "Hoka Bondi 8 running shoe",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"type": "Regular",
"manufacturer": "Hoka",
"vendor_id": "",
"vendor_name": "Bondi 8",
"price": 64.95,
"retail_price": 87.5,
"msrp": 0,
"non_rfid_item": false,
"unit_of_measure": "EA",
"attr3": "",
"cloud_picture_url": "",
"categories": [
{
"name": "Shoes",
"children": [
{
"name": "Running"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalogs?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"number": "",
"unique_field": "sku",
"description": "Hoka Bondi 8",
"short_description": "Hoka Bondi 8 running shoe",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"custom_sku": "",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"type": "Regular",
"manufacturer": "Hoka",
"vendor_id": "",
"vendor_name": "Bondi 8",
"price": 64.95,
"retail_price": 87.5,
"msrp": 0,
"non_rfid_item": false,
"unit_of_measure": "EA",
"attr3": "",
"cloud_picture_url": "",
"categories": [
{
"name": "Shoes",
"children": [
{
"name": "Running"
}
]
}
]
}'Success response
{
"number": "000000197634",
"message": "The catalog item created successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"error": {"status": "error", "code": 104, "message": "Description not sent"}} |
| 400 | — | {"error": {"status": "error", "message": "<validation messages>"}} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
description is required. Without number the next number is generated (max + 1, padded).
unique_field (e.g.
sku): when set, the item is matched by that field instead of the number — an existing match is updated (message says "updated").Accepted fields:
upc,alu,sku,custom_sku,description,short_description,style,colour,size,manufacturer,vendor_id,vendor_name,price,retail_price,msrp,extra,dcs,dnc,unit_of_measure,base_unit_of_measure,preferred_unit_of_measure,non_rfid_item, manufacturing flags (mf_*,ext_sync),attr3–attr22,type(item type name, created if new),picture(Base64) orcloud_picture_url, andcategories(nestedname/children, created if new).
Update Catalog Item
/{tenant-code}/api/v1/catalogs/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Current item number. |
Request body
{
"api_key": "<tenant api key>",
"number": "000000197634",
"description": "Hoka Bondi 8 (2026)",
"retail_price": 89.0
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/api/v1/catalogs/<id>?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"number": "000000197634",
"description": "Hoka Bondi 8 (2026)",
"retail_price": 89.0
}'Success response
{
"message": "The catalog item updated successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": {"status": "error", "code": 102, "message": "Item does not exist in database"}} |
| 409 | — | {"error": {"status": "error", "code": 103, "message": "Item number exists in database"}} |
| 400 | — | {"error": {"status": "error", "code": 104, "message": "Description not sent"}} |
| 400 | — | {"error": {"status": "error", "code": 105, "message": "Something went wrong! please try again later!"}} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Also accepted as PATCH. Sending a different number renumbers the item (rejected if that number exists).
Accepted fields:
upc,alu,sku,custom_sku,description,short_description,style,colour,size,manufacturer,vendor_id,vendor_name,price,retail_price,msrp,extra,dcs,dnc,unit_of_measure,base_unit_of_measure,preferred_unit_of_measure,non_rfid_item, manufacturing flags (mf_*,ext_sync),attr3–attr22,type(item type name, created if new),picture(Base64) orcloud_picture_url, andcategories(nestedname/children, created if new).
Delete Catalog Item
/{tenant-code}/api/v1/catalogs/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Item number. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/catalogs/<id>?api_key=$SENITRON_API_KEY"Success response
{
"message": "The catalog item removed successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": {"status": "error", "code": 102, "message": "Item does not exist in database"}} |
| 400 | — | {"error": {"status": "error", "message": "Oops, something went wrong!"}} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Manufacturing Catalog
Bulk Save Units of Measure
/{tenant-code}/api/v1/manufacturing/uomsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
delete_missing_uoms | boolean | optional | true deletes storage units that are not in the payload. |
Request body
[
{
"item_number": "CTUB-20062",
"name": "CS",
"units": 12,
"default": true
},
{
"item_number": "CTUB-20062",
"name": "EA",
"units": 1,
"default": false
}
]Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/manufacturing/uoms?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"item_number": "CTUB-20062",
"name": "CS",
"units": 12,
"default": true
},
{
"item_number": "CTUB-20062",
"name": "EA",
"units": 1,
"default": false
}
]'Success response
{
"message": "The UOM data saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
The body is a JSON array of storage units; it is stored and processed in the background (HTTP 201).
Pass
api_key(anddelete_missing_uoms) in the query string, because the body is an array.
List Manufacturing Catalog
/{tenant-code}/api/v1/manufacturing/catalogsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
number | string | optional | Exact item number. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/catalogs?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 597116188,
"number": "000412",
"alu": "CTUB-20062",
"description": "Cup tub 20oz",
"short_description": "",
"type_id": 1201,
"upc": null,
"sku": "",
"style": "",
"colour": "",
"size": "",
"price": 1.2,
"retail_price": 0.0,
"base_unit_of_measure": "EA",
"preferred_unit_of_measure": "CS",
"gross_weight": 0.02,
"mf_exp_calculation": "365D",
"locked": false,
"client_id": 67,
"created_at": "2026-10-07T09:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Catalog items ordered by number (all columns, shortened here).
Create or Update Manufacturing Item
/{tenant-code}/api/v1/manufacturing/catalogsPATCH /{tenant-code}/api/v1/manufacturing/catalogsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"alu": "CTUB-20062",
"description": "Cup tub 20oz",
"type": "Raw Material",
"price": 1.2,
"unit_of_measure": "EA",
"preferred_unit_of_measure": "CS",
"gross_weight": 0.02,
"expiration_calculation": "365D",
"category_code": "PACKAGING",
"categories": [
{
"name": "Packaging",
"children": [
{
"name": "Tubs"
}
]
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/manufacturing/catalogs?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"alu": "CTUB-20062",
"description": "Cup tub 20oz",
"type": "Raw Material",
"price": 1.2,
"unit_of_measure": "EA",
"preferred_unit_of_measure": "CS",
"gross_weight": 0.02,
"expiration_calculation": "365D",
"category_code": "PACKAGING",
"categories": [
{
"name": "Packaging",
"children": [
{
"name": "Tubs"
}
]
}
]
}'Success response
{
"id": 597116188,
"number": "000412",
"alu": "CTUB-20062",
"description": "Cup tub 20oz",
"short_description": "",
"type_id": 1201,
"upc": null,
"sku": "",
"style": "",
"colour": "",
"size": "",
"price": 1.2,
"retail_price": 0.0,
"base_unit_of_measure": "EA",
"preferred_unit_of_measure": "CS",
"gross_weight": 0.02,
"mf_exp_calculation": "365D",
"locked": false,
"client_id": 67,
"created_at": "2026-10-07T09:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"status": "error", "message": "No ALU Present"} |
| 400 | — | {"status": "error", "message": "Item is locked for update/delete"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Items are matched by alu (the ERP item number) and created if new (number = next catalog number). Accepted fields:
alu,description,short_description,type(item type name),price,retail_price,msrp,upc,sku,custom_sku,style,colour,size,gross_weight,base_unit_of_measure(orunit_of_measure),preferred_unit_of_measure,vendor_id,vendor_name,manufacturer,extra,total_qty,cloud_picture_url,attr3–attr22,expiration_calculation,category_code,categories.background_job: truequeues the save and returns HTTP 201"ok".Returns HTTP 201 with the item. Calls are stored in the catalog log.
Bulk Upsert Manufacturing Items
/{tenant-code}/api/v1/manufacturing/catalogs/bulkRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
delete_missing_items | boolean | optional | true removes items missing from the payload. |
Request body
[
{
"alu": "CTUB-20062",
"description": "Cup tub 20oz",
"type": "Raw Material",
"price": 1.2,
"unit_of_measure": "EA",
"preferred_unit_of_measure": "CS",
"gross_weight": 0.02,
"expiration_calculation": "365D",
"category_code": "PACKAGING",
"categories": [
{
"name": "Packaging",
"children": [
{
"name": "Tubs"
}
]
}
]
}
]Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/manufacturing/catalogs/bulk?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"alu": "CTUB-20062",
"description": "Cup tub 20oz",
"type": "Raw Material",
"price": 1.2,
"unit_of_measure": "EA",
"preferred_unit_of_measure": "CS",
"gross_weight": 0.02,
"expiration_calculation": "365D",
"category_code": "PACKAGING",
"categories": [
{
"name": "Packaging",
"children": [
{
"name": "Tubs"
}
]
}
]
}
]'Success response
{
"message": "The catalog item data saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
The body is a JSON array of items (same fields as Create or Update Manufacturing Item), stored and processed in the background (HTTP 201).
Pass
api_key(anddelete_missing_items) in the query string.
Delete Manufacturing Item
/{tenant-code}/api/v1/manufacturing/catalogsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
alu | string | required | ERP item number (ALU). |
permanent | boolean | optional | true deletes permanently; default: soft delete (discard). |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/manufacturing/catalogs?api_key=$SENITRON_API_KEY&alu=<alu>"Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"message": "The catalog number is not found"} |
| 200 | — | {"message": "Discarded before"} |
| 400 | — | {"message": "Error destroy catalog"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
List BOM Lines
/{tenant-code}/{location}/api/v1/bom_dataRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bom_data?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 501,
"item_id": 597116190,
"parent_item_number": "000420",
"parent_alu": "FG-100",
"line_no": 10000,
"bom_item_type": "Item",
"child_item_id": 597116188,
"child_item_number": "000412",
"child_alu": "CTUB-20062",
"assembly_bom": false,
"description": "\"Cup tub 20oz\"",
"unit_of_measure_code": "EA",
"quantity_per": 1.0,
"position": "",
"machine_number": "",
"lead_time_offset": "",
"resource_usage_type": "",
"variant_code": "",
"disable": false
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
All bill-of-materials lines.
Create or Update BOM Line
/{tenant-code}/{location}/api/v1/bom_dataPATCH /{tenant-code}/{location}/api/v1/bom_dataRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"parent_item_no": "FG-100",
"line_no": 10000,
"type": "Item",
"item_no": "CTUB-20062",
"assembly_bom": "No",
"description": "Cup tub 20oz",
"unit_of_measure_code": "EA",
"quantity_per": 1,
"position": "",
"position_2": "",
"position_3": "",
"machine_no": "",
"lead_time_offset": "",
"resource_usage_type": "",
"variant_code": "",
"installed_in_line_no": 0,
"installed_in_item_no": ""
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bom_data?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"parent_item_no": "FG-100",
"line_no": 10000,
"type": "Item",
"item_no": "CTUB-20062",
"assembly_bom": "No",
"description": "Cup tub 20oz",
"unit_of_measure_code": "EA",
"quantity_per": 1,
"position": "",
"position_2": "",
"position_3": "",
"machine_no": "",
"lead_time_offset": "",
"resource_usage_type": "",
"variant_code": "",
"installed_in_line_no": 0,
"installed_in_item_no": ""
}'Success response
{
"id": 501,
"item_id": 597116190,
"parent_item_number": "000420",
"parent_alu": "FG-100",
"line_no": 10000,
"bom_item_type": "Item",
"child_item_id": 597116188,
"child_item_number": "000412",
"child_alu": "CTUB-20062",
"assembly_bom": false,
"description": "\"Cup tub 20oz\"",
"unit_of_measure_code": "EA",
"quantity_per": 1.0,
"position": "",
"machine_number": "",
"lead_time_offset": "",
"resource_usage_type": "",
"variant_code": "",
"disable": false
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"status": "error", "message": "<errors>"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
A BOM line links parent item parent_item_no to component item_no (both ALUs) at line_no; it is matched by parent and line number.
assembly_bom:Yes/No.background_job: truequeues the save and returns HTTP 201"ok".Returns HTTP 201 with the line. Calls are stored in the BOM log.
Disable BOM Line
/{tenant-code}/{location}/api/v1/bom_dataRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
parent_item_no | string | required | Parent item ALU. |
line_no | integer | required | Line number. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bom_data?api_key=$SENITRON_API_KEY&parent_item_no=<parent_item_no>&line_no=<line_no>"Success response
{
"status": "success"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"status": "error", "message": "Error saving Bom data"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Marks the line as disabled (it is kept). Unknown lines also return success.
Bulk Upsert BOM Lines
/{tenant-code}/api/v1/manufacturing/bomsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
delete_missing_boms | boolean | optional | true disables lines missing from the payload. |
Request body
[
{
"parent_item_no": "FG-100",
"line_no": 10000,
"type": "Item",
"item_no": "CTUB-20062",
"assembly_bom": "No",
"description": "Cup tub 20oz",
"unit_of_measure_code": "EA",
"quantity_per": 1,
"position": "",
"position_2": "",
"position_3": "",
"machine_no": "",
"lead_time_offset": "",
"resource_usage_type": "",
"variant_code": "",
"installed_in_line_no": 0,
"installed_in_item_no": ""
}
]Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/manufacturing/boms?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"parent_item_no": "FG-100",
"line_no": 10000,
"type": "Item",
"item_no": "CTUB-20062",
"assembly_bom": "No",
"description": "Cup tub 20oz",
"unit_of_measure_code": "EA",
"quantity_per": 1,
"position": "",
"position_2": "",
"position_3": "",
"machine_no": "",
"lead_time_offset": "",
"resource_usage_type": "",
"variant_code": "",
"installed_in_line_no": 0,
"installed_in_item_no": ""
}
]'Success response
{
"message": "The BOM data saved in cloud"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
The body is a JSON array of BOM lines, processed in the background. Pass
api_keyin the query string.
Locations
List Locations (Destinations)
/{tenant-code}/api/v1/locations/destinationsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/locations/destinations"Success response
[
{
"id": 12,
"name": "Floor-1",
"code": "001",
"client_id": 67,
"store_no": "",
"timezone": "America/Los_Angeles",
"steet": "1660 Winchester Blvd",
"city": "Campbell",
"state": "CA",
"zip": "95008",
"country": "US",
"email": "store1@example.com",
"phone": "",
"currency": "USD",
"tenant_code": "acme_001",
"enable": true,
"created_at": "2024-01-10T10:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 500 | — | Unknown tenant code (server error) |
Returns every location of the tenant with all its stored attributes (shortened here). No authentication is checked.
Inventory Compare
Import Quantities (PSPY, gzip CSV)
/{tenant-code}/api/v1/inventory_compare/import_qty_pspyRequest headers
| Header | Value |
|---|---|
Content-Type | application/gzip |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key (or send it in the Api-Key header). |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/inventory_compare/import_qty_pspy?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/gzip" \
--data-binary @data.csv.gzSuccess response
{
"message": "Import enqueued"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 422 | — | {"error": "<exception message>"} |
| 401 | UNAUTHORIZED | Invalid API key or Token |
The request body is a gzip-compressed CSV (send
Content-Type: application/gzipand the raw bytes). The CSV is imported into the Compare page in the background.Example:
gzip -c qty.csv | curl -X POST --data-binary @- -H 'Content-Type: application/gzip' -H 'Api-Key: <key>' …
Import Lightspeed Inventory File
/{tenant-code}/{location}/api/v1/lightspeed/import_templateRequest headers
| Header | Value |
|---|---|
Content-Type | multipart/form-data |
Parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Tenant API key (named key). |
file | file | required | Lightspeed CSV export (multipart/form-data). |
create_nil_qty_items | boolean | optional | Any value: also create items whose quantity is empty. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/lightspeed/import_template?key=$SENITRON_API_KEY" \
-F "file=@file.csv"Success response
{
"message": "Catalog file will be imported soon"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"message": "No key provided"} |
Imports a Lightspeed inventory CSV into the catalog and the Compare page in the background.
Webhooks
Shopify Inventory Levels Webhook
/{tenant-code}/api/v1/webhooks/shopify/inventory_levels/updatePOST /{tenant-code}/api/v1/webhooks/shopify/inventory_levels/connect, POST /{tenant-code}/api/v1/webhooks/shopify/inventory_levels/disconnectRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"inventory_item_id": 49148385,
"location_id": 655441491,
"available": 6,
"updated_at": "2026-10-07T09:00:00-04:00"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/webhooks/shopify/inventory_levels/update" \
-H "Content-Type: application/json" \
-d '{
"inventory_item_id": 49148385,
"location_id": 655441491,
"available": 6,
"updated_at": "2026-10-07T09:00:00-04:00"
}'Success response
{}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"status": "error", "message": "<message>"} (unknown Shopify location) |
Receiver for Shopify
inventory_levels/update,/connectand/disconnectwebhooks (configured in Shopify, not called manually). The location is matched by Shopify location_id (external location id). The event is logged and processed in the background; the response is HTTP 201 with{}.
Lightspeed Sale Webhook
/{tenant-code}/{location}/api/v1/sale/lightspeedRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"saleID": "18342",
"completed": "true",
"SaleLines": {
"SaleLine": [
{
"itemID": "771",
"unitQuantity": "1"
}
]
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/sale/lightspeed" \
-H "Content-Type: application/json" \
-d '{
"saleID": "18342",
"completed": "true",
"SaleLines": {
"SaleLine": [
{
"itemID": "771",
"unitQuantity": "1"
}
]
}
}'Success response
{
"note": "HTTP 200 with an empty body"
}Receiver for Lightspeed Retail sale events (configured in Lightspeed). The payload is processed in the background.
No authentication is checked.
Lightspeed Work Order Webhook
/{tenant-code}/{location}/api/v1/workorder/lightspeedRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"workorderID": "512",
"WorkorderItems": {
"WorkorderItem": [
{
"itemID": "771",
"saleLineID": "0"
}
]
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/workorder/lightspeed" \
-H "Content-Type: application/json" \
-d '{
"workorderID": "512",
"WorkorderItems": {
"WorkorderItem": [
{
"itemID": "771",
"saleLineID": "0"
}
]
}
}'Success response
{
"note": "HTTP 200 with an empty body"
}Receiver for Lightspeed Retail work-order events. The payload is processed in the background.
No authentication is checked.
Items & Tag Metadata (Legacy POS)
Get Items with Live Quantity
/{tenant-code}/api/v1/item/{id}GET /{tenant-code}/{location}/api/v1/item/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | One item number, or several separated by commas. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/item/<id>"Success response
[
{
"id": 597116103,
"number": "000000197634",
"description": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"price": "64.95",
"retail_price": "87.5",
"manufacturer": "Hoka",
"client_id": 67,
"type_id": 1201,
"created_at": "2024-12-18T20:20:00.000Z",
"updated_at": "2026-05-07T15:20:00.000Z",
"total_qty": 12
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 500 | — | Unknown item number (server error) |
Returns each item once per location of the tenant, with
total_qty= that location's Live + Pending Visibility tags.Records are returned with all of their database columns (shortened here).
No authentication is checked; the tenant comes from the URL.
Export Catalog CSV
/{tenant-code}/api/v1/items.csvGET /{tenant-code}/{location}/api/v1/items.csvRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | optional | Tenant API key (required unless time is sent). |
time | string | optional | Return only items changed since this time (no key needed). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/items.csv?key=$SENITRON_API_KEY" \
-o export.csvSuccess response
{
"note": "CSV file (text/csv)"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"data": "No key provided"} |
Request the
.csvformat. Withtime, returns the items changed since then; otherwise the full catalog CSV (requireskey). Used by the Senitron POS integration.
Get Items by Item Number
/{tenant-code}/api/v1/tags/metadataRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
[ "000000197634", "000000197635" ]
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/metadata" \
-H "Content-Type: application/json" \
-d '[
"000000197634",
"000000197635"
]'Success response
[
{
"id": 597116103,
"number": "000000197634",
"description": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"price": "64.95",
"retail_price": "87.5",
"manufacturer": "Hoka",
"client_id": 67,
"type_id": 1201,
"created_at": "2024-12-18T20:20:00.000Z",
"updated_at": "2026-05-07T15:20:00.000Z",
"item_type": {
"id": 1201,
"name": "Regular"
},
"item_categories": [
{
"id": 1408190,
"name": "Shoes"
}
],
"category_name": "Shoes",
"total_qty": 12
}
]The body is a JSON array of item numbers. Unknown numbers are skipped. Includes
item_type,item_categories,category_nameandtotal_qty.Records are returned with all of their database columns (shortened here).
No authentication is checked; the tenant comes from the URL.
Get Items by Item Number (All Locations)
/{tenant-code}/api/v1/tags/item_metadataRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
[
"000000197634"
]Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/item_metadata" \
-H "Content-Type: application/json" \
-d '[
"000000197634"
]'Success response
[
{
"id": 597116103,
"number": "000000197634",
"description": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"price": "64.95",
"retail_price": "87.5",
"manufacturer": "Hoka",
"client_id": 67,
"type_id": 1201,
"created_at": "2024-12-18T20:20:00.000Z",
"updated_at": "2026-05-07T15:20:00.000Z"
}
]The body is a JSON array of item numbers. Each found item is returned once per location of the tenant.
Records are returned with all of their database columns (shortened here).
No authentication is checked; the tenant comes from the URL.
Get Items by Item Number (Simple)
/{tenant-code}/api/v1/items/by_item_numberRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
[ "000000197634", "000000197635" ]
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/items/by_item_number" \
-H "Content-Type: application/json" \
-d '[
"000000197634",
"000000197635"
]'Success response
[
{
"id": 597116103,
"number": "000000197634",
"description": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"price": "64.95",
"retail_price": "87.5",
"manufacturer": "Hoka",
"client_id": 67,
"type_id": 1201,
"created_at": "2024-12-18T20:20:00.000Z",
"updated_at": "2026-05-07T15:20:00.000Z"
}
]The body is a JSON array of item numbers.
Records are returned with all of their database columns (shortened here).
No authentication is checked; the tenant comes from the URL.
Get Tags by EPC
/{tenant-code}/api/v1/tags/tag_metadataRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
store_code | string | required | Location code whose tags are searched (query string). |
add | boolean | optional | true adds unknown EPCs to inventory with status Unknown. |
reason | string | optional | With add: reason written to the tag history. |
Request body
[ "CF19930E4FA6BD4000000432", "CF19930E4FA6BD4000000433" ]
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/tag_metadata?store_code=$LOCATION" \
-H "Content-Type: application/json" \
-d '[
"CF19930E4FA6BD4000000432",
"CF19930E4FA6BD4000000433"
]'Success response
[
{
"id": 32503,
"epc_id": "CF19930E4FA6BD4000000432",
"asset_id": "1024",
"item_number": "210000047060",
"status_id": 1000,
"current_units": 1.0,
"last_seen": "2026-10-07T09:00:00.000Z",
"alt_serial": null
}
]The body is a JSON array of EPCs; returns the matching tag records of location store_code (empty array if the location is unknown).
Records are returned with all of their database columns (shortened here).
No authentication is checked; the tenant comes from the URL.
Get Items by EPC
/{tenant-code}/api/v1/tags/metadata-by-epcRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
store_code | string | required | Location code whose tags are searched (query string). |
ignore_presence | boolean | optional | Include tags whose item is not in the catalog. |
Request body
[
"CF19930E4FA6BD4000000432"
]Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/metadata-by-epc?store_code=$LOCATION" \
-H "Content-Type: application/json" \
-d '[
"CF19930E4FA6BD4000000432"
]'Success response
[
{
"item": {
"id": 597116103,
"number": "000000197634",
"description": "Hoka Bondi 8",
"upc": 197634439105,
"alu": "",
"sku": "1127952FTRS9B",
"style": "1127952",
"colour": "White - Pink",
"size": "9",
"price": "64.95",
"retail_price": "87.5",
"manufacturer": "Hoka",
"client_id": 67,
"type_id": 1201,
"created_at": "2024-12-18T20:20:00.000Z",
"updated_at": "2026-05-07T15:20:00.000Z"
},
"asset_id": "1024",
"quality_hold_id": null
}
]For each known EPC returns its catalog item, asset id and quality-hold id (if on hold).
No authentication is checked; the tenant comes from the URL.
Decode Tags by EPC
/{tenant-code}/api/v1/tags/metadata-by-tagRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
store_code | string | required | Location code whose tags are searched (query string). |
Request body
[ "CF19930E4FA6BD4000000432", "FFFF00000000000000000001" ]
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/metadata-by-tag?store_code=$LOCATION" \
-H "Content-Type: application/json" \
-d '[
"CF19930E4FA6BD4000000432",
"FFFF00000000000000000001"
]'Success response
[
{
"item_number": "210000047060",
"asset_id": "1024",
"epc": "CF19930E4FA6BD4000000432",
"item_name": "Classic Tee"
},
{
"item_number": "4294967295",
"asset_id": "1",
"epc": "FFFF00000000000000000001",
"item_name": "-"
}
]Returns item number, asset id and item name per EPC; unknown EPCs are decoded from the EPC itself.
No authentication is checked; the tenant comes from the URL.
Get Item Units of Measure
/{tenant-code}/api/v1/items/uomsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
number | string | required | Item number. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/items/uoms?number=<number>"Success response
[
{
"id": 15,
"item_number": "CTUB-20062",
"name": "CS",
"units": 12.0,
"default": true
}
]Storage units (UOMs) of the item, or
nullif the item doesn't exist.Records are returned with all of their database columns (shortened here).
No authentication is checked; the tenant comes from the URL.
EPC Tags (Readers & POS)
Export EPC Tags CSV
/{tenant-code}/{location}/api/v1/epc_tags.csvGET /{tenant-code}/api/v1/epc_tags.csvRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | optional | Tenant API key (required unless time is sent). |
time | string | optional | Return only tags changed since this time (no key needed). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_tags.csv?key=$SENITRON_API_KEY" \
-o export.csvSuccess response
{
"note": "CSV file (text/csv)"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"data": "No key provided"} |
Request the
.csvformat. Withtime, returns the tags changed since then; otherwise all tags (requireskey). Used by the Senitron POS integration.
Mark Tag Stolen (Exit Read)
/{tenant-code}/{location}/api/v1/epc_tags/mark-stolenPOST /{tenant-code}/{location}/api/v1/epc_tags/mark_stolenRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"epc": "CF19930E4FA6BD4000000432",
"antenna_id": "101",
"rssi": -50
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_tags/mark-stolen" \
-H "Content-Type: application/json" \
-d '{
"epc": "CF19930E4FA6BD4000000432",
"antenna_id": "101",
"rssi": -50
}'Success response
{
"gpio": false
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing EPC"} |
| 400 | — | {"message": "EPC could not be decoded, malformed epc"} |
Called by exit/theft readers when a tag passes an exit antenna. Unknown EPCs are added from the EPC itself. The tag's last-seen antenna and location are updated.
If the tag's status counts toward inventory (or is flagged for instant alerts), the zone's auto-change-status rule (default Stolen) is applied, exit alerts and emails are sent, and a realtime alert is broadcast.
The response is the GPIO instruction for the reader (alarm/light) — its fields depend on the location's GPIO settings. No authentication is checked.
Mark Tags Killed
/{tenant-code}/{location}/api/v1/epc_tags/mark-killedPOST /{tenant-code}/{location}/api/v1/epc_tags/mark_killedRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"find_by": "epc_id",
"tags": [
"CF19930E4FA6BD4000000432",
"CF19930E4FA6BD4000000433"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_tags/mark-killed?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"find_by": "epc_id",
"tags": [
"CF19930E4FA6BD4000000432",
"CF19930E4FA6BD4000000433"
]
}'Success response
{
"message": "done",
"tags": [
"CF19930E4FA6BD4000000432",
"CF19930E4FA6BD4000000433"
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sets the listed tags to Tag Killed.
find_by:epc_id(default) oritem_number(kills every tag of each item number).tagslists the EPCs that were changed.An empty
tagsarray returns an empty response.
Preview Tags from EPCs
/{tenant-code}/{location}/api/v1/epc_tags/init-by-epcsPOST /{tenant-code}/{location}/api/v1/epc_tags/init_by_epcsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"epcs": [
"CF19930E4FA6BD4000000499"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_tags/init-by-epcs" \
-H "Content-Type: application/json" \
-d '{
"epcs": [
"CF19930E4FA6BD4000000499"
]
}'Success response
[
{
"id": null,
"epc_id": "CF19930E4FA6BD4000000499",
"asset_id": "1177",
"item_number": "210000047060"
}
]For EPCs not in inventory, returns unsaved tag records decoded from the EPC (item number and serial). Known EPCs are left out. Nothing is saved.
Record Printed Tags
/{tenant-code}/{location}/api/v1/epc_tags/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"epc": "CF19930E4FA6BD4000000432",
"item_number": "210000047060",
"serial_number": "1024",
"printer": "Zebra Front Desk"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_tags/print" \
-H "Content-Type: application/json" \
-d '{
"epc": "CF19930E4FA6BD4000000432",
"item_number": "210000047060",
"serial_number": "1024",
"printer": "Zebra Front Desk"
}'Success response
{
"data": "Insertion scheduled"
}Queues the posted print data (any JSON) for insertion as printed tags at the location (used by print stations). No authentication is checked.
Readers & Devices
ATS Beacon Reads
/{tenant-code}/{location}/api/v1/ats/readsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"msg": "advData",
"gmac": "AC233FC0A1B2",
"obj": [
{
"dmac": "AC233FA0B1C2",
"rssi": -61
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/ats/reads?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"msg": "advData",
"gmac": "AC233FC0A1B2",
"obj": [
{
"dmac": "AC233FA0B1C2",
"rssi": -61
}
]
}'Success response
{}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
| 400 | — | {"errors": "<exception message>"} |
| 401 | UNAUTHORIZED | Invalid API key |
Receives BLE gateway (ATS) advertisements:
gmac= gateway MAC,obj[0].dmac= beacon MAC. Duplicate reads within the location's RSSI threshold are ignored.When ATS trigger new tag instant API is on, new beacons trigger the instant API in the background.
Inject Reader Data (EPC States)
/{tenant-code}/{location}/api/v1/epc_states/injectorRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"DeviceId": "RRD-12",
"LocationId": "acme_001",
"ReaderType": 2,
"Reads": [
{
"EPC": "CF19930E4FA6BD4000000432",
"FirstSeen": "2026-10-07T09:00:00Z",
"LastSeen": "2026-10-07T09:00:01Z",
"NumberOfPings": 2,
"RSSI": -44,
"antenna_id": "101"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_states/injector" \
-H "Content-Type: application/json" \
-d '{
"DeviceId": "RRD-12",
"LocationId": "acme_001",
"ReaderType": 2,
"Reads": [
{
"EPC": "CF19930E4FA6BD4000000432",
"FirstSeen": "2026-10-07T09:00:00Z",
"LastSeen": "2026-10-07T09:00:01Z",
"NumberOfPings": 2,
"RSSI": -44,
"antenna_id": "101"
}
]
}'Success response
{
"response": "OK"
}Queues fixed-reader read data for background processing (EPC state / last seen). Used by CDM/reader software. No authentication is checked.
Publish Live Reads
/{tenant-code}/{location}/api/v1/epc_states/readRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"DeviceId": "RRD-12",
"LocationId": "acme_001",
"reader_id": "12",
"Reads": [
{
"EPC": "CF19930E4FA6BD4000000432",
"RSSI": -44,
"antenna_id": "101"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_states/read" \
-H "Content-Type: application/json" \
-d '{
"DeviceId": "RRD-12",
"LocationId": "acme_001",
"reader_id": "12",
"Reads": [
{
"EPC": "CF19930E4FA6BD4000000432",
"RSSI": -44,
"antenna_id": "101"
}
]
}'Success response
{
"response": "OK"
}Caches the latest reads of the device and broadcasts them to the web app's live-reads screen. Nothing is stored in inventory. No authentication is checked.
Simulate Reader Reads (Testing)
/{tenant-code}/{location}/api/v1/epc_states/mock_insertRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"asset_id": "1024, 1025",
"device_id": "RRD-12",
"antenna_id": "101"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_states/mock_insert" \
-H "Content-Type: application/json" \
-d '{
"asset_id": "1024, 1025",
"device_id": "RRD-12",
"antenna_id": "101"
}'Success response
{
"response": "{\"response\":\"OK\"}",
"tags_send": 2,
"tag_ids": 2,
"check_tag_id": false
}Testing helper: builds reads for the given asset ids and posts them to Publish Live Reads for the same location.
check_tag_idis true when some asset ids were not found.
Get EPCs by Asset IDs
/{tenant-code}/{location}/api/v1/epc_states/epc_idsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
assets[] | string | required | Asset ids (repeat the parameter). |
Try it with curl
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_states/epc_ids?assets[]=<assets>"Success response
{
"epcs": [
"CF19930E4FA6BD4000000432"
]
}Returns the EPCs of the given asset ids. No authentication is checked.
Instant RFID Event
/{tenant-code}/{location}/api/v1/rfid/instantRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
[
{
"epc": "CF19930E4FA6BD4000000432",
"antenna_id": "101",
"rssi": -45
}
]Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/rfid/instant" \
-H "Content-Type: application/json" \
-d '[
{
"epc": "CF19930E4FA6BD4000000432",
"antenna_id": "101",
"rssi": -45
}
]'Success response
{
"status": true,
"alert": true,
"command_type": "",
"options": ""
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "EpcID prefix is not defined for this tenant"} |
| 400 | — | {"message": "The EPC prefix is not valid for this tenant"} |
Body: one read object or an array. Reads whose EPC does not start with one of the tenant's EPC prefixes are ignored. Each active EAA event is triggered after its delay.
No authentication is checked.
Bills of Lading (BOLs)
Import BOLs from File
/{tenant-code}/{location}/api/v1/bols/importRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | URL of the BOL file to import. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bols/import?api_key=$SENITRON_API_KEY&file=<file>"Success response
{
"message": "BOL(s) created successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | Could not find Store with that code |
| 401 | UNAUTHORIZED | Invalid API key |
Downloads the file at file and creates the BOLs it contains.
Import BOL Cartons from File
/{tenant-code}/{location}/api/v1/bols/import_cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | URL of the carton file to import. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bols/import_cartons?api_key=$SENITRON_API_KEY&file=<file>"Success response
{
"message": "BOL(s) created successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | Could not find Store with that code |
| 404 | NOT_FOUND | Url should be filled |
| 401 | UNAUTHORIZED | Invalid API key |
IITS Tracking
Get IITS Tracking Events
/{tenant-code}/{location}/api/v1/iits/eventsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
event_number | integer | optional | Event id. |
from_date | string | optional | MM/DD/YYYY. |
to_date | string | optional | MM/DD/YYYY (inclusive). |
last_events | integer | optional | Only events of the last N hours. |
direction | string | optional | Event direction (e.g. in, out). |
employee | string | optional | Partial match on employee details. |
vehicle | string | optional | Partial match on vehicle details. |
only_item_assets | boolean | optional | Only events with item assets. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 10; 0 returns all rows. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/iits/events?api_key=$SENITRON_API_KEY"Success response
{
"pagination": {
"current_page": 1,
"per_page": 10,
"total_entries": 1
},
"events": [
{
"event_number": 911,
"event_datetime": "10/07/2026 08:42 AM",
"direction": "Out",
"employee": {
"id": 51,
"item_number": "",
"serial_number": "E-1007",
"epc": "E2801190200052C1A5A10300",
"details": "Jane Doe"
},
"vehicle": {
"id": 52,
"item_number": "",
"serial_number": "TRUCK-3",
"epc": "E2801190200052C1A5A10301",
"details": "Truck 3"
},
"assets": [
{
"id": 53,
"item_number": "210000047060",
"serial_number": "1024",
"epc": "CF19930E4FA6BD4000000432",
"details": "",
"direction": "Out"
}
]
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | UNAUTHORIZED | Invalid API key |
Industrial item tracking (IITS) gate events with the employee, vehicle and assets read together, newest first. An unknown location falls back to the first location.
Inbound Imports
Import Inbound Avery Assets
/{tenant-code}/{location}/api/v1/inbound/avery/import_pnRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | URL of the file to import. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inbound/avery/import_pn?api_key=$SENITRON_API_KEY&file=<file>"Success response
{
"message": "Inbound avery asset import enqueued"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing catalog file."} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Import Inbound Receiving Orders
/{tenant-code}/{location}/api/v1/inbound/receiving_orders/import_pnRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | URL of the file to import. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inbound/receiving_orders/import_pn?api_key=$SENITRON_API_KEY&file=<file>"Success response
{
"message": "Inbound receiving order import enqueued"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing catalog file."} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Inventory Export (Legacy)
Get Inventory (Legacy)
/{tenant-code}/{location}/api/v1/inventory_detailsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Tenant API key (named key). |
page | integer | optional | Default 1 (100 tags per page). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventory_details?key=$SENITRON_API_KEY"Success response
[
{
"id": 32503,
"epc_id": "CF19930E4FA6BD4000000432",
"asset_id": "1024",
"item_number": "210000047060",
"status": {
"id": 1000,
"name": "Live"
},
"item": {
"number": "210000047060",
"description": "Classic Tee"
}
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"data": "No key provided"} |
All tags of the location (100 per page) with their
statusanditemrecords (all columns, shortened here).
Export Inventory Log CSV
/{tenant-code}/{location}/api/v1/inventory_log.csvRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Tenant API key (named key). |
app | string | optional | QBPOS (QuickBooks POS format) or COMCACH; default: standard log. |
fields | string | optional | Optional list of fields to export (standard format). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventory_log.csv?key=$SENITRON_API_KEY" \
-o export.csvSuccess response
{
"note": "CSV file (text/csv)"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"data": "No key provided"} |
Request the
.csvformat (e.g.…/inventory_log.csv).
Download Inventory CSV (Fields & Filters)
/{tenant-code}/{location}/api/v1/inventory_download.csvRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
key | string | required | Tenant API key (named key). |
Request body
{
"key": "<tenant api key>",
"user": "api@senitron.net",
"device_name": "HH-53",
"fields": [
{
"name": "number",
"label": "Item #"
},
{
"name": "description",
"label": "Description"
}
],
"filters": [
{
"name": "manufacturer",
"value": "Hoka"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventory_download.csv?key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"user": "api@senitron.net",
"device_name": "HH-53",
"fields": [
{
"name": "number",
"label": "Item #"
},
{
"name": "description",
"label": "Description"
}
],
"filters": [
{
"name": "manufacturer",
"value": "Hoka"
}
]
}' \
-o export.csvSuccess response
{
"note": "CSV file (text/csv)"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | INVALID_DATA | please provide fields and filters |
| 404 | INVALID_FIELD | please input valid fields or filters |
| 200 | INVALID_KEY | please provide valid key |
Request the
.csvformat (e.g.…/inventory_log.csv).fields[].nameandfilters[].namemust be catalog column names; unknown names are dropped.
Printing
List Printers
/{tenant-code}/{location}/api/v1/printersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printers"Success response
[
{
"id": 5,
"name": "Zebra Front Desk",
"ip": "192.168.1.60",
"port": 9100,
"model": "ZT411",
"printer_paper_width": 216,
"printer_paper_height": 276,
"self_serialization": false,
"store_id": 12,
"created_at": "2025-02-01T10:00:00.000Z"
}
]All printers of the tenant ordered by name, with all their stored settings (shortened here). No authentication is checked.
Print Item Tags (Encode EPCs)
/{tenant-code}/{location}/api/v1/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
printer_id | integer | required | Printer id (see List Printers). |
item_number | string | required | Item number, SKU, ALU, EAN or UPC. |
count | integer | required | Number of tags. |
print | boolean | required | true sends the jobs to the printer (CDM); false only generates EPCs and ZPL. |
user_email | string | optional | User recorded on the print jobs. |
app_version | string | optional | Caller version (logged). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/print?api_key=$SENITRON_API_KEY&printer_id=<printer_id>&item_number=<item_number>&count=<count>&print=<print>"Success response
{
"item_number": "210000047060",
"count": 2,
"tags": [
{
"serial": 1177,
"epc": "CF19930E4FA6BD4000000499",
"zpl": "^XA^RFW,H^FD CF19930E4FA6BD4000000499^FS ... ^XZ"
},
{
"serial": 1178,
"epc": "CF19930E4FA6BD400000049A",
"zpl": "^XA ... ^XZ"
}
]
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | PARAMS_MISSING | params: printer_id, print, item_number, count needs to be present |
| 400 | CATALOG_MISSING | Item is not present in senitron catalog |
| 400 | RECORD NOT FOUND | Couldn't find Printer |
| 400 | PRINTER_TEMPLATE_ERROR | Error generating print params <message> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Generates count serials and EPCs (advancing the tenant's last encoded serial) with the printer's ZPL, and creates print jobs. With
print=truethe jobs are queued for the printer.For self-serializing printers a single job is created and
tagsis empty. Vend tenants: unknown items are fetched from Vend by SKU.
Barcode Image
/{tenant-code}/{location}/api/v1/printing/barcodeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
text | string | required | Text to encode. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/barcode.png?text=<text>" \
-o image.pngSuccess response
{
"note": "PNG image (image/png)"
}Request the
.pngformat (…/printing/barcode.png?text=…).
QR Code Image
/{tenant-code}/{location}/api/v1/printing/qr_codeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
text | string | required | Text to encode. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/qr_code.png?text=<text>" \
-o image.pngSuccess response
{
"note": "PNG image (image/png)"
}Request the
.pngformat (…/printing/qr_code.png?text=…).
Marker Tag Cover Page
/{tenant-code}/{location}/api/v1/printing/marker_tag_cover_page/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its cover-page template and paper size are used). |
tag_ids | string | required | Comma-separated tag (asset record) ids. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/marker_tag_cover_page/<id>.pdf?tag_ids=<tag_ids>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown printer or tags (record not found) |
Returns a PDF document (request the
.pdfformat);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML.
Employee Badge Cover Page (ELC)
/{tenant-code}/{location}/api/v1/elc/printing/{id}/employeeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (cover-page template). |
employee_ids[] | integer | required | ELC employee ids (repeat the parameter). |
Try it with curl
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/elc/printing/<id>/employee.pdf?employee_ids[]=<employee_ids>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Returns a PDF document (request the
.pdfformat);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML.Employee life-cycle (ELC) module.
Print Item Label
/{tenant-code}/{location}/api/v1/itemprintRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "210000047060",
"printer_id": 5,
"count": 1,
"container_qty": 1,
"alt_serial": "",
"print": true,
"unique_print": false,
"add_to_inventory": true,
"user": "api@senitron.net",
"device_name": "ERP",
"item": {
"number": "210000047060",
"description": "Classic Tee",
"sku": "CT-BLK-M",
"alu": "",
"upc": 889001112223,
"style": "CT",
"colour": "Black",
"size": "M",
"retail_price": 25.0
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/itemprint?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "210000047060",
"printer_id": 5,
"count": 1,
"container_qty": 1,
"alt_serial": "",
"print": true,
"unique_print": false,
"add_to_inventory": true,
"user": "api@senitron.net",
"device_name": "ERP",
"item": {
"number": "210000047060",
"description": "Classic Tee",
"sku": "CT-BLK-M",
"alu": "",
"upc": 889001112223,
"style": "CT",
"colour": "Black",
"size": "M",
"retail_price": 25.0
}
}'Success response
{
"datetime": "2026-10-07T09:00:00.000-07:00",
"payload": "^XA^RFW,H^FDCF19930E4FA6BD4000000499^FS^FO40,40^FDClassic Tee^FS^XZ",
"item_number": "210000047060",
"serial_number": "1177",
"alt_serial": "",
"epc": "CF19930E4FA6BD4000000499",
"container_qty": 1
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | The location 001 not found |
| 404 | ITEM_NOT_FOUND | No item_number specified |
| 404 | PRINTER_NOT_FOUND | The Printer is not valid |
| 422 | PRINTER_DISABLED | The printer is disabled (not visible) and print jobs cannot be sent to it |
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 422 | PRINTING_DISABLED | The printing functionality has been disabled for this item |
| 422 | NON_RFID_ITEM | This item is marked as Non-RFID and cannot be printed |
| 400 | PRINTER_TEMPLATE_ERROR | Error generating ZPL from template, check template code: <message> |
| 400 | INTERNAL_ERROR | <exception message> |
| 401 | UNAUTHORIZED | Invalid API key |
Encodes one new EPC (next serial) and prints it count times (copies).
print: truesends the job to the printer; otherwise only the ZPL is returned.unique_print: truereprints the item's latest live tag instead of encoding a new one. Analt_serialalready used by the item reuses that tag's EPC.add_to_inventory: trueadds the tag to inventory.item_number is matched against number, UPC, ALU or SKU. Send item (catalog fields) to create the item if it doesn't exist, or update it. The label is rendered with the printer's ZPL template;
payloadis the ZPL.The
Api-Keyheader can be used instead of theapi_keyparameter.
Print Item Labels V2
/{tenant-code}/{location}/api/v1/itemprint_v2Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "210000047060",
"printer_id": 5,
"count": 2,
"number_of_copy": 1,
"print": true,
"add_to_inventory": true,
"user": "api@senitron.net",
"device_name": "ERP",
"item": {
"number": "210000047060",
"description": "Classic Tee",
"sku": "CT-BLK-M",
"alu": "",
"upc": 889001112223,
"style": "CT",
"colour": "Black",
"size": "M",
"retail_price": 25.0
},
"epc": {
"serial_number": null,
"alt_serial": "",
"storage_unit": 1,
"current_units": 1,
"static_zone": "Warehouse A-01",
"last_zone": "",
"attr1": "",
"receiving_date": "10/07/2026"
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/itemprint_v2?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "210000047060",
"printer_id": 5,
"count": 2,
"number_of_copy": 1,
"print": true,
"add_to_inventory": true,
"user": "api@senitron.net",
"device_name": "ERP",
"item": {
"number": "210000047060",
"description": "Classic Tee",
"sku": "CT-BLK-M",
"alu": "",
"upc": 889001112223,
"style": "CT",
"colour": "Black",
"size": "M",
"retail_price": 25.0
},
"epc": {
"serial_number": null,
"alt_serial": "",
"storage_unit": 1,
"current_units": 1,
"static_zone": "Warehouse A-01",
"last_zone": "",
"attr1": "",
"receiving_date": "10/07/2026"
}
}'Success response
[
{
"datetime": "2026-10-07T09:00:00.000-07:00",
"payload": "^XA^RFW,H^FDCF19930E4FA6BD4000000499^FS^FO40,40^FDClassic Tee^FS^XZ",
"item_number": "210000047060",
"serial_number": "1177",
"alt_serial": "",
"epc": "CF19930E4FA6BD4000000499",
"container_qty": 1
},
{
"datetime": "2026-10-07T09:00:00.000-07:00",
"payload": "^XA^RFW,H^FDCF19930E4FA6BD4000000499^FS^FO40,40^FDClassic Tee^FS^XZ",
"item_number": "210000047060",
"serial_number": "1178",
"alt_serial": "",
"epc": "CF19930E4FA6BD400000049A",
"container_qty": 1
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | DUPLICATE_ITEM | <database message> |
| 404 | LOCATION_NOT_FOUND | The location 001 not found |
| 404 | ITEM_NOT_FOUND | No item_number specified |
| 404 | PRINTER_NOT_FOUND | The Printer is not valid |
| 422 | PRINTER_DISABLED | The printer is disabled (not visible) and print jobs cannot be sent to it |
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 422 | PRINTING_DISABLED | The printing functionality has been disabled for this item |
| 422 | NON_RFID_ITEM | This item is marked as Non-RFID and cannot be printed |
| 400 | PRINTER_TEMPLATE_ERROR | Error generating ZPL from template, check template code: <message> |
| 400 | INTERNAL_ERROR | <exception message> |
| 401 | UNAUTHORIZED | Invalid API key |
Encodes count new EPCs (one label each,
number_of_copycopies) and returns one entry per label.epc sets attributes on the tags added to inventory:
alt_serial,attr1–attr10,receiving_date,storage_unit,current_units,static_zone(bin) andlast_zone/last_seen_antenna.epc.serial_numberforces the serial.Soft-deleted items are restored when item is sent.
item_number is matched against number, UPC, ALU or SKU. Send item (catalog fields) to create the item if it doesn't exist, or update it. The label is rendered with the printer's ZPL template;
payloadis the ZPL.The
Api-Keyheader can be used instead of theapi_keyparameter.
Imports
Upload File (Items / Assets / Image)
/{tenant-code}/{location}/api/v1/uploaderRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"action_type": "item",
"file_extension": "csv",
"file": "<Base64 file content>"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/uploader?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"action_type": "item",
"file_extension": "csv",
"file": "<Base64 file content>"
}'Success response
{
"message": "The upload is queued"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"errors": ["action is not defined"]} |
| 404 | — | {"errors": ["item# not found"]} |
| 400 | — | {"errors": ["The image can not be saved"]} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
action_type:item(catalog import),item_asset(catalog + assets import) — both queued — oritem_image(sets the picture of item_number; returns{"message": "The image saved"}).fileis the Base64-encoded file andfile_extensionits type (e.g.csv,xlsx,png).
Pallet Build
Import Pallet Build Cartons from File
/{tenant-code}/{location}/api/v1/shipping/pallet_build/import_cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | URL of the carton (wave) file. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/pallet_build/import_cartons?api_key=$SENITRON_API_KEY&file=<file>"Success response
{
"message": "Carton(s) created successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | Could not find Store with that code |
| 404 | NOT_FOUND | URL should be filled |
| 401 | UNAUTHORIZED | Invalid API key |
Downloads the file and imports its cartons in the background.
The
Api-Keyheader can be used instead of theapi_keyparameter.
Import Order Cartons (JSON)
/{tenant-code}/{location}/api/v1/shipping/pallet_build/import_order_cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
order_type | string | optional | When set, the request is rejected unless order.order_type matches (case-insensitive). |
Request body
{
"order": {
"id": "PO-4410",
"order_type": "retail",
"customer_id": "DC-07",
"order_batch_id": "67566",
"order_orig": "SO-1001",
"warehouse_id": "W1",
"created_at": "2026-10-07T09:00:00Z",
"shipping_address_1": "1660 Winchester Blvd",
"shipping_zip": "95008",
"packages": [
{
"id": "00008879860012617423",
"tracking": "1Z999",
"tracking_link": "https://…"
}
],
"order_items": [
{
"package_id": "00008879860012617423",
"sku": "CT-BLK-M",
"description": "Classic Tee",
"quantity": 6
}
]
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/pallet_build/import_order_cartons?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"order": {
"id": "PO-4410",
"order_type": "retail",
"customer_id": "DC-07",
"order_batch_id": "67566",
"order_orig": "SO-1001",
"warehouse_id": "W1",
"created_at": "2026-10-07T09:00:00Z",
"shipping_address_1": "1660 Winchester Blvd",
"shipping_zip": "95008",
"packages": [
{
"id": "00008879860012617423",
"tracking": "1Z999",
"tracking_link": "https://…"
}
],
"order_items": [
{
"package_id": "00008879860012617423",
"sku": "CT-BLK-M",
"description": "Classic Tee",
"quantity": 6
}
]
}
}'Success response
{
"message": "The order cartons and items have been imported successfully."
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | The location code is invalid. |
| 400 | BAD_REQUEST | Missing order.id |
| 400 | BAD_REQUEST | Invalid order type |
| 400 | BAD_REQUEST | Invalid gzip body |
| 401 | UNAUTHORIZED | Invalid API key |
Creates Pallet Build cartons from an order: one carton per
order_items[].package_id, items matched by SKU. Mapping:id→ PO,order_batch_id→ BOL,customer_id→ DC,order_orig→ reference,warehouse_id→ wave.Re-importing an order replaces its cartons. Items with unknown SKUs are reported by email (if the notification is set up).
The body may be gzip-compressed (
Content-Encoding: gzip). Processing runs in the background.The
Api-Keyheader can be used instead of theapi_keyparameter.
Import ASN Cartons from File
/{tenant-code}/{location}/api/v1/shipping/pb/import_asn_cartonsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | URL of the ASN file. |
data_type | integer | required | 1 = ASN header file, 2 = ASN details file. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/pb/import_asn_cartons?api_key=$SENITRON_API_KEY&file=<file>&data_type=<data_type>"Success response
{
"message": "The data has been successfully received and will be processed shortly"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | LOCATION_NOT_FOUND | The location 001 not found |
| 404 | NOT_FOUND | URL should be filled |
| 404 | NOT_FOUND | Data Type should be filled |
| 401 | UNAUTHORIZED | Invalid API key |
Imports ASN (advance ship notice) header or detail files into Pallet Build cartons in the background.
The
Api-Keyheader can be used instead of theapi_keyparameter.
Catalog Import
Import Catalog File
/{tenant-code}/api/v1/catalog/importRequest headers
| Header | Value |
|---|---|
Content-Type | multipart/form-data |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
attachment | file | required | Catalog file (multipart/form-data). |
import_type | string | optional | system (Senitron CSV, default), lightspeed, simple (JSON) or coci_catalog_item_part. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog/import?api_key=$SENITRON_API_KEY" \
-F "attachment=@catalog.csv"Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"message": "No File", "status": 406} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Uploads a catalog file that is imported in the background. Download a template with Download Catalog Sample File.
The response body carries the status (
{"status": 200}); a missing file returns HTTP 200 withstatus: 406.
Import Catalog File (Verbose)
/{tenant-code}/api/v1/catalog/import_verboseRequest headers
| Header | Value |
|---|---|
Content-Type | multipart/form-data |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
attachment | file | required | Catalog file (multipart/form-data). |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog/import_verbose?api_key=$SENITRON_API_KEY" \
-F "attachment=@catalog.csv"Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"message": "No File", "status": 406} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Same as Import Catalog File (Senitron CSV) with detailed per-row logging of the import.
Import Catalog (Patricia Nash)
/{tenant-code}/api/v1/catalog/import_pnRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
file | string | required | Catalog file content (CSV text). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/catalog/import_pn?api_key=$SENITRON_API_KEY&file=<file>"Success response
{
"message": "Catalog import enqueued"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing catalog file."} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Customer-specific catalog import format.
Download Catalog Sample File
/{tenant-code}/api/v1/catalog/sample_fileRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
type | string | required | system, lightspeed or coci_catalog_item_part. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/catalog/sample_file?type=<type>" \
-o export.csvSuccess response
{
"note": "CSV file (text/csv)"
}Template CSV for catalog imports. For
systemandlightspeed, the tenant's custom attribute columns (and forsystemthePUOM,UOM,Measure Unitcolumns) are added. Unknown types return an empty response.
Manufacturing Tags
Generate & Print Manufacturing Tags
/{tenant-code}/{location}/api/v1/manufacturing/tags/generateRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"printer_id": 5,
"zone": {
"id": 14
},
"uom": "CS",
"pallet_count": 0,
"box_count": 2,
"unit_count": 12,
"lot_date": "10/07/2026",
"expiration_date": "10/07/2027",
"customer_name": "",
"customer_lot_number": "",
"field_on_lic_plate": "",
"lic_plate_count": "",
"comment": "",
"print": true,
"user": "operator@acme.com",
"device_name": "HH-53"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tags/generate?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"printer_id": 5,
"zone": {
"id": 14
},
"uom": "CS",
"pallet_count": 0,
"box_count": 2,
"unit_count": 12,
"lot_date": "10/07/2026",
"expiration_date": "10/07/2027",
"customer_name": "",
"customer_lot_number": "",
"field_on_lic_plate": "",
"lic_plate_count": "",
"comment": "",
"print": true,
"user": "operator@acme.com",
"device_name": "HH-53"
}'Success response
{
"message": "The tags are scheduled for creation and printing"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 404 | PRINTER_NOT_FOUND | The printer is not valid |
| 404 | ZONE_NOT_FOUND | The zone not found |
| 422 | PRINTING_DISABLED | The printing functionality has been disabled for this item |
| 422 | MAX_PRINT_UNITS_EXCEEDED | Print blocked: units per tag (240 EA) exceeds the maximum allowed limit of 200 EA. |
| 422 | MAX_PRINT_VALUE_EXCEEDED | Print blocked: value per tag ($1200.0) exceeds the maximum allowed limit of $1000. |
| 422 | MASTER_TAG_EXISTS | A master tag (#1024) already exists for this item in this master tag zone. … |
| 422 | NORMAL_TAG_IN_MASTER_ZONE | This zone already contains a normal tag (#1024) for this item. … |
| 422 | MISSING_UOM | <message> |
| 422 | EPC_LENGTH_ERROR | <message> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates new tags for an item in zone zone.id and prints their labels in the background. Label count:
pallet_countif set, elsebox_count, elseunit_count; units per tag follow from the other counts and uom.lot_date(MM/DD/YYYY) becomes the lot number (YYYYMMDD). Per-item print limits (units/value per tag) are enforced.Every call is stored in the manufacturing tag log.
Adjust Tag Quantity
/{tenant-code}/{location}/api/v1/manufacturing/tags/adjustmentRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"serial_number": "1024",
"action_type": "adj",
"qty": 10,
"uom": "EA",
"reason": "cycle count",
"zone": {
"id": 14
},
"user": "operator@acme.com",
"device_name": "HH-53",
"comment": ""
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tags/adjustment?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"serial_number": "1024",
"action_type": "adj",
"qty": 10,
"uom": "EA",
"reason": "cycle count",
"zone": {
"id": 14
},
"user": "operator@acme.com",
"device_name": "HH-53",
"comment": ""
}'Success response
{
"messages": "The tag scheduled for the cycle count"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 404 | TAG_NOT_FOUND | The tag 1024 not found |
| 400 | TAG_HARD_ALLOCATED | Tag has been HARD ALLOCATED to an SO can't be qty Adjusted |
| 404 | UOM_NOT_FOUND | The UOM CS not found |
| 404 | REASON_NOT_FOUND | The reason damaged not found |
| 404 | ISSUE | <message> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
action_type:adj(set quantity, default),inc(add) ordec(subtract); qty is converted from uom to the item's base unit.reason:cycle count,sample,prod adj,return to vendororlegacy disposition. A quantity of 0 kills the tag; a killed tag set above 0 becomes Live.zone.idalso moves the tag.item_number is matched against number, UPC, ALU or SKU. serial_number is the tag's asset id.
Every call is stored in the manufacturing tag log.
Confirm Tag (Physical Audit)
/{tenant-code}/{location}/api/v1/manufacturing/tags/confirmRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"serial_number": "1024",
"user": "operator@acme.com",
"device_name": "HH-53"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tags/confirm?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"serial_number": "1024",
"user": "operator@acme.com",
"device_name": "HH-53"
}'Success response
{
"messages": "The tag has been confirmed successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 404 | TAG_NOT_FOUND | The tag 1024 not found |
| 404 | ISSUE | <message> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Marks the tag as physically audited (by user) and updates its last seen time.
item_number is matched against number, UPC, ALU or SKU. serial_number is the tag's asset id.
Every call is stored in the manufacturing tag log.
Merge Tags
/{tenant-code}/{location}/api/v1/manufacturing/tags/mergeRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"serial_number": "1024",
"tags": [
"1025",
"1026"
],
"user": "operator@acme.com"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tags/merge?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"serial_number": "1024",
"tags": [
"1025",
"1026"
],
"user": "operator@acme.com"
}'Success response
{
"message": "The tags has been merged successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | TAG_NOT_FOUND | The tag 1024 not found |
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 404 | ITEM_NOT_VALID | Item number is not valid for tag# 1024 |
| 404 | TAGS_NOT_FOUND | The tags is empty |
| 404 | TAGS_NOT_FOUND | The tag(s) 1026 not found |
| 422 | — | {"error": "<message>"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Moves the quantities of tags (asset ids of the same item) into tag serial_number and kills them. item_number must be the tag's exact item number.
When lot/expiration validation is enabled, only tags with the same lot and expiration date can be merged.
Every call is stored in the manufacturing tag log.
Split Tag
/{tenant-code}/{location}/api/v1/manufacturing/tags/splitRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"serial_number": "1024",
"uom": "EA",
"tag_count": 2,
"units_per_tag": 6,
"printer_id": 5,
"print_license_plate": false,
"note": "",
"user": "operator@acme.com"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tags/split?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"serial_number": "1024",
"uom": "EA",
"tag_count": 2,
"units_per_tag": 6,
"printer_id": 5,
"print_license_plate": false,
"note": "",
"user": "operator@acme.com"
}'Success response
{
"messages": "The tag has been splitted successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 404 | TAG_NOT_FOUND | The tag 1024 not found |
| 404 | UOM_NOT_FOUND | The UOM CS not found |
| 404 | PRINTER_NOT_FOUND | The Printer 5 not found |
| 400 | ISSUE | <message> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates tag_count new tags of units_per_tag (in uom) taken from the tag's quantity and prints them on printer_id.
item_number is matched against number, UPC, ALU or SKU. serial_number is the tag's asset id.
Every call is stored in the manufacturing tag log.
Transfer Tag to Location
/{tenant-code}/{location}/api/v1/manufacturing/tags/transferRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"serial_number": "1024",
"new_location": "002",
"user": "operator@acme.com",
"device_name": "HH-53"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tags/transfer?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"serial_number": "1024",
"new_location": "002",
"user": "operator@acme.com",
"device_name": "HH-53"
}'Success response
{
"messages": "The tag has been transferred successfully"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | LOCATION_NOT_FOUND | The location 002 not found |
| 404 | ITEM_NOT_FOUND | The item 210000047060 not found |
| 404 | TAG_NOT_FOUND | The tag 1024 not found |
| 400 | TAG_IN_TRANSIT | The tag is not active to be marked as in transit - change status or duplicate to mark as In Transit |
| 400 | TAG_QUALITY_HOLD | The tag is placed under quality hold, not authorized to transfer |
| 404 | ISSUE | <message> |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates a transfer slip that sends the tag to location new_location (another location of the tenant).
item_number is matched against number, UPC, ALU or SKU. serial_number is the tag's asset id.
Every call is stored in the manufacturing tag log.
Create Tagging Request
/{tenant-code}/{location}/api/v1/manufacturing/tagging_requestsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_id": 597116103,
"storage_unit_id": 15,
"qty": 24,
"lot": "20261007",
"expirated_at": "2027-10-07",
"transaction_id": "TR-88",
"reason": 1
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/tagging_requests?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_id": 597116103,
"storage_unit_id": 15,
"qty": 24,
"lot": "20261007",
"expirated_at": "2027-10-07",
"transaction_id": "TR-88",
"reason": 1
}'Success response
{
"id": 31,
"client_id": 67,
"store_id": 12,
"item_id": 597116103,
"manufacturing_storage_unit_id": 15,
"qty": 24.0,
"lot": "20261007",
"expirated_at": "2027-10-07",
"transaction_id": "TR-88",
"reason": 1,
"submitted_by": "Jane Doe",
"submitted_user_id": 110,
"status": "pending"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates a pending request for untagged stock to be tagged. Note: the submitter is taken from the signed-in web user, so this call currently fails (HTTP 500) with only an API key.
Manufacturing Receiving
Get Item Encoding Info
/{tenant-code}/{location}/api/v1/manufacturing/receive/item-info/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | Item ALU. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/item-info/<id>?api_key=$SENITRON_API_KEY"Success response
{
"epc_encoding_info": {
"prefix": "0011000000",
"itemLength": 40,
"serialLength": 38,
"palletLength": 12,
"caseLength": 12
},
"last_encoded_serial": 1024,
"item": {
"id": 597116103,
"number": "CTUB-20062",
"alu": "CTUB-20062",
"description": "Cup tub 20oz"
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"message": "Couldn't find item"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
EPC encoding settings, last encoded serial and the item record (all columns, shortened here).
Get Item Storage Units
/{tenant-code}/{location}/api/v1/manufacturing/receive/storage-units/{item_number}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
item_number | path | required | Item number. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/storage-units/<item_number>?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 15,
"item_number": "CTUB-20062",
"name": "CS",
"units": 12.0,
"default": true
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing item_number"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Reserve Serial Numbers
/{tenant-code}/{location}/api/v1/manufacturing/receive/last-encoded-serialRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
incrementSerialCount | integer | required | Number of serials to reserve. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/last-encoded-serial?api_key=$SENITRON_API_KEY&incrementSerialCount=<incrementSerialCount>"Success response
{
"lastEncodedSerial": 1025
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Atomically advances the tenant's last encoded serial by incrementSerialCount and returns the first reserved serial. Note: this GET changes data.
Set Last Encoded Serial
/{tenant-code}/{location}/api/v1/manufacturing/receive/save-last-encoded-serialRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"lastEncodedSerial": 1100
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/save-last-encoded-serial?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lastEncodedSerial": 1100
}'Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing last encoded serial"} |
| 400 | — | {"message": "Error saving last encoded serial"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Cancel Reception (Reset to Pending)
/{tenant-code}/{location}/api/v1/manufacturing/receive/cancel-reception/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | required | External receive (reception) id. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/cancel-reception/<id>?api_key=$SENITRON_API_KEY"Success response
{
"id": 41,
"receiving_id": "PO-7781",
"vendor_name": "Acme Supplies",
"status": "pending"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sets the reception back to pending and returns it (all columns, shortened here).
Kill Cancelled Reception Tags
/{tenant-code}/{location}/api/v1/manufacturing/receive/kill-tagsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"epcs": [
"30340212C8044C4000000401"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/kill-tags?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"epcs": [
"30340212C8044C4000000401"
]
}'Success response
{
"message": "Cancelled tags have been killed"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing list of EPCs to kill"} |
| 200 | — | {"message": "Operation cannot be canceled as some tags are currently live. Use \"Undo\" to reverse the operation."} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sets the EPCs of a cancelled reception to Tag Killed (refused if any of them is Live).
Undo Check: Tags Live
/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_tags_live_statusRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
epcs[] | string | required | EPCs (repeat the parameter). |
Try it with curl
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receiving/undo/check_tags_live_status?api_key=$SENITRON_API_KEY&epcs[]=<epcs>"Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"tags": [{"asset_id": "1025", "status": "Quality Hold"}]} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
OK when every EPC is Live; otherwise lists the tags that are not.
Undo Check: Tag Quantities Unchanged
/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_tags_quantitiesRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
epcs[] | string | required | EPCs (repeat the parameter). |
Try it with curl
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receiving/undo/check_tags_quantities?api_key=$SENITRON_API_KEY&epcs[]=<epcs>"Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"tags": [<tag records whose quantity changed>]} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
OK when every tag still has its initial quantity.
Undo Check: SO Allocations
/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_so_allocationsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
epcs[] | string | required | EPCs (repeat the parameter). |
Try it with curl
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receiving/undo/check_so_allocations?api_key=$SENITRON_API_KEY&epcs[]=<epcs>"Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "EPCs already exist in SO allocations", "allocations": [{"asset_id": "1025", "salesorder_id": "SO-1001"}], "allocation_items": []} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
OK when none of the EPCs is allocated to a sales order.
Undo Check: ERP API Errors
/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_api_errorRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
epcs[] | string | required | EPCs (repeat the parameter). |
po_number | string | required | Purchase order number. |
Try it with curl
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receiving/undo/check_api_error?api_key=$SENITRON_API_KEY&epcs[]=<epcs>&po_number=<po_number>"Success response
{
"message": "No API Error"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"message": "All API Error"} |
| 400 | — | {"message": "Not allowed"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
No API Error: no tag is in API Error.All API Error: all tags are, and they match the PO's unit-of-measure push errors (undo allowed). OtherwiseNot allowed.
Manufacturing Integration (ERP)
Get Manufacturing Settings
/{tenant-code}/api/v1/manufacturing/integration/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/settings?api_key=$SENITRON_API_KEY"Success response
{
"id": 3,
"client_id": 67,
"ro_posting_date_range_before": "2026-09-27",
"ro_posting_date_range_after": "2026-10-17",
"ro_qty_tolerance": 0,
"ro_qty_tolerance_under": 0,
"price_fluctuation_threshold": 50,
"packet_item_prefix": "WIP",
"max_print_units": null,
"max_print_value": null,
"created_at": "2025-01-10T10:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Tenant manufacturing settings (created with defaults on first call; more columns than shown).
Update Receiving Posting Date Range
/{tenant-code}/api/v1/manufacturing/integration/settingsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"ro_posting_date_range_before": "2026-09-27",
"ro_posting_date_range_after": "2026-10-17"
}Try it with curl
curl -X PATCH "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/settings?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"ro_posting_date_range_before": "2026-09-27",
"ro_posting_date_range_after": "2026-10-17"
}'Success response
{
"id": 3,
"client_id": 67,
"ro_posting_date_range_before": "2026-09-27",
"ro_posting_date_range_after": "2026-10-17",
"ro_qty_tolerance": 0,
"ro_qty_tolerance_under": 0,
"price_fluctuation_threshold": 50,
"packet_item_prefix": "WIP",
"max_print_units": null,
"max_print_value": null,
"created_at": "2025-01-10T10:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Error saving settings"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sets the allowed posting date range for receiving orders. Both fields are written (an omitted one is cleared).
List Integration Users
/{tenant-code}/api/v1/manufacturing/integration/usersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/users?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 9,
"client_id": 67,
"username": "DOMAIN\\jdoe",
"email": "jdoe@noemailsenitron.net",
"full_name": "jdoe",
"posting_date_allowed_range_start": "2026-09-27",
"posting_date_allowed_range_end": "2041-10-07",
"created_at": "2026-10-07T09:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Calls are stored in the integration log.
Create or Update Integration User
/{tenant-code}/api/v1/manufacturing/integration/usersPUT /{tenant-code}/api/v1/manufacturing/integration/usersRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"username": "DOMAIN\\jdoe",
"full_name": "Jane Doe",
"email": "jdoe@acme.com"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/users?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"username": "DOMAIN\\jdoe",
"full_name": "Jane Doe",
"email": "jdoe@acme.com"
}'Success response
{
"id": 9,
"client_id": 67,
"username": "DOMAIN\\jdoe",
"email": "jdoe@noemailsenitron.net",
"full_name": "jdoe",
"posting_date_allowed_range_start": "2026-09-27",
"posting_date_allowed_range_end": "2041-10-07",
"created_at": "2026-10-07T09:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 406 | — | {"status": "error", "message": {"email": ["is invalid"]}} |
| 406 | — | {"status": "error", "message": "Error updating user"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Upserts an ERP user by username and creates a matching Senitron user (random password) if none has that email. Without email one is generated (
<username>@noemailsenitron.net).Creating returns the integration user; updating (PUT, or POST of an existing username) returns
{"message": "OK"}. The posting date range is reset to −10 days … +15 years.Calls are stored in the integration log.
Delete Integration User
/{tenant-code}/api/v1/manufacturing/integration/users/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | optional | Not used (optional). |
email | string | required | Email of the user to delete. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/users/<id>?api_key=$SENITRON_API_KEY&email=<email>"Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"status": "error", "message": {}} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Deletes the Senitron user and the integration user with this email. The
/{id}segment is optional.Calls are stored in the integration log.
List Storage Units (UOMs)
/{tenant-code}/api/v1/manufacturing/integration/storage-unitsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/storage-units?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 15,
"client_id": 67,
"item_number": "CTUB-20062",
"item_alu": "",
"name": "CS",
"measure_unit": "12",
"created_at": "2026-10-07T09:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
All storage units (units of measure) of the tenant.
Calls are stored in the integration log.
Create or Update Storage Unit
/{tenant-code}/api/v1/manufacturing/integration/storage-unitsPUT /{tenant-code}/api/v1/manufacturing/integration/storage-unitsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"item_number": "CTUB-20062",
"name": "CS",
"measure_unit": "12",
"background_job": false
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/storage-units?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"item_number": "CTUB-20062",
"name": "CS",
"measure_unit": "12",
"background_job": false
}'Success response
{
"id": 15,
"client_id": 67,
"item_number": "CTUB-20062",
"item_alu": "",
"name": "CS",
"measure_unit": "12",
"created_at": "2026-10-07T09:00:00.000Z",
"updated_at": "2026-10-07T09:00:00.000Z"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Error saving storage unit: <errors>"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Upserts the storage unit name of item_number (
measure_unit= base units per storage unit).background_job: truequeues it and returns HTTP 201"ok".heartbeat: trueonly checks connectivity and returns{"message": "ok"}.Calls are stored in the integration log.
Delete Storage Unit
/{tenant-code}/api/v1/manufacturing/integration/storage-units/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
id | path | optional | Not used (optional). |
item_number | string | required | Item number. |
name | string | required | Storage unit name. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/storage-units/<id>?api_key=$SENITRON_API_KEY&item_number=<item_number>&name=<name>"Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Error deleting storage unit"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Calls are stored in the integration log.
Apply Item Charge to Lot
/{tenant-code}/{location}/api/v1/manufacturing/receive/charge_itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"lot_no": "L-20261007",
"item_no": "CTUB-20062",
"description": "Freight",
"amount_to_assign": 120.0,
"applies_to_receipt_line_amount": 1800.0,
"location_code": "MAIN"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/charge_items?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lot_no": "L-20261007",
"item_no": "CTUB-20062",
"description": "Freight",
"amount_to_assign": 120.0,
"applies_to_receipt_line_amount": 1800.0,
"location_code": "MAIN"
}'Success response
{
"id": 77,
"nav_lot_number": "L-20261007",
"item_number": "CTUB-20062",
"source_reference": "PO-7781",
"unit_cost": 1.55
}Errors
| HTTP | Type | Message |
|---|---|---|
| 406 | — | {"message": "<validation errors>"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Adds an ERP item charge (e.g. freight) to the lot and recalculates its cost. An unknown lot returns HTTP 200 with
null.Calls are stored in the integration log.
Revalue Lot Cost
/{tenant-code}/{location}/api/v1/manufacturing/lot_revaluationRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"lot_no": "L-20261007",
"item_number": "CTUB-20062",
"cost_per_unit": 1.62
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/lot_revaluation?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"lot_no": "L-20261007",
"item_number": "CTUB-20062",
"cost_per_unit": 1.62
}'Success response
{
"id": 77,
"nav_lot_number": "L-20261007",
"item_number": "CTUB-20062",
"source_reference": "PO-7781",
"unit_cost": 1.62
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sets a new unit cost for the lot's tags (item charges are re-applied). An unknown lot returns
null.Calls are stored in the integration log.
Manufacturing ERP Orders
List ERP Purchase Orders
/{tenant-code}/{location}/api/v1/external_receiveRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_receive?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 41,
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10T00:00:00.000-07:00",
"expected_qty": 1200,
"locked": false,
"invoiced": false,
"status": "pending"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Purchase orders received from the ERP for manufacturing receiving (all columns, shortened here).
Calls are stored in the ERP order log.
Create or Update ERP Purchase Order
/{tenant-code}/{location}/api/v1/external_receiveRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10",
"expected_qty": 1200,
"locked": "NO",
"send_api_time": "2026-10-07 09:00",
"invoiced": false,
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"receiving_id": "PO-7781",
"item_number": "CTUB-20062",
"item_description": "Cup tub 20oz",
"storage_unit": "CS",
"unit_weight": 0.02,
"measure_unit": 12,
"measure_unit_cost": 18.6,
"receive_price": 1860.0,
"line_uofm_code": "CS",
"expected_qty": 100,
"expected_receipt_date": "2026-10-10"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_receive?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10",
"expected_qty": 1200,
"locked": "NO",
"send_api_time": "2026-10-07 09:00",
"invoiced": false,
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"receiving_id": "PO-7781",
"item_number": "CTUB-20062",
"item_description": "Cup tub 20oz",
"storage_unit": "CS",
"unit_weight": 0.02,
"measure_unit": 12,
"measure_unit_cost": 18.6,
"receive_price": 1860.0,
"line_uofm_code": "CS",
"expected_qty": 100,
"expected_receipt_date": "2026-10-10"
}
]
}'Success response
{
"message": "Ok",
"data": {
"id": 41,
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10T00:00:00.000-07:00",
"expected_qty": 1200,
"locked": false,
"invoiced": false,
"status": "pending"
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"status": "error", "message": "Error saving receive data"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Upserts the PO by receiving_id and its lines by
nav_line_number. A completed PO only hasinvoicedupdated.send_api_timeisYYYY-MM-DD HH:MM;locked:YES/NO.Calls are stored in the ERP order log.
Update ERP Purchase Order
/{tenant-code}/{location}/api/v1/external_receiveRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10",
"expected_qty": 1200,
"locked": "NO",
"send_api_time": "2026-10-07 09:00",
"invoiced": false,
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"receiving_id": "PO-7781",
"item_number": "CTUB-20062",
"item_description": "Cup tub 20oz",
"storage_unit": "CS",
"unit_weight": 0.02,
"measure_unit": 12,
"measure_unit_cost": 18.6,
"receive_price": 1860.0,
"line_uofm_code": "CS",
"expected_qty": 100,
"expected_receipt_date": "2026-10-10"
}
]
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_receive?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10",
"expected_qty": 1200,
"locked": "NO",
"send_api_time": "2026-10-07 09:00",
"invoiced": false,
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"receiving_id": "PO-7781",
"item_number": "CTUB-20062",
"item_description": "Cup tub 20oz",
"storage_unit": "CS",
"unit_weight": 0.02,
"measure_unit": 12,
"measure_unit_cost": 18.6,
"receive_price": 1860.0,
"line_uofm_code": "CS",
"expected_qty": 100,
"expected_receipt_date": "2026-10-10"
}
]
}'Success response
{
"message": "Ok",
"data": {
"id": 41,
"receiving_id": "PO-7781",
"type_id": 1,
"vendor_id": "V-100",
"vendor_name": "Acme Supplies",
"receive_price": 1860.0,
"expected_receipt_date": "2026-10-10T00:00:00.000-07:00",
"expected_qty": 1200,
"locked": false,
"invoiced": false,
"status": "pending"
}
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "INVALID LOCATION CODE"} |
| 400 | — | {"status": "error", "message": "Error saving receive data"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Also accepted as PATCH. Like create; with original_facility (ERP location code of another location) a PO that does not exist here is moved from that location (and locked there).
Calls are stored in the ERP order log.
Delete ERP Purchase Order Lines
/{tenant-code}/{location}/api/v1/external_receiveRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"Items": [
{
"nav_line_number": 10000
}
],
"api_key": "<tenant api key>",
"receiving_id": "PO-7781"
}Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_receive?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Items": [
{
"nav_line_number": 10000
}
],
"receiving_id": "PO-7781"
}'Success response
{
"status": "success"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "Purchase order doesn't exist"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Deletes the listed lines (by
nav_line_number) of the PO.Calls are stored in the ERP order log.
List ERP Sales Orders
/{tenant-code}/{location}/api/v1/external_shipmentRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
page | integer | optional | Default 1. |
per_page | integer | optional | Default 20. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_shipment?api_key=$SENITRON_API_KEY"Success response
[
{
"id": 63,
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12T00:00:00.000-07:00",
"order_qty": 200,
"po_number": "CUST-PO-9",
"locked": false,
"auto_pick": false,
"in_transit": false
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sales orders received from the ERP for picking/shipping (all columns, shortened here).
Calls are stored in the ERP order log.
Create or Update ERP Sales Order
/{tenant-code}/{location}/api/v1/external_shipmentRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12",
"order_qty": 200,
"sold_quantity": 0,
"consignee": "",
"bill_to": "",
"ship_to": "1660 Winchester Blvd",
"po_number": "CUST-PO-9",
"store_no": "",
"locked": "no",
"scan_based_trading": "no",
"so_in_transit": "no",
"send_api_time": "2026-10-07 09:00",
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"salesorder_id": "SO-1001",
"item_number": "FG-100",
"item_description": "Finished good",
"storage_unit": "CS",
"unit_weight": 1.2,
"measure_unit": 12,
"measure_unit_cost": 120.0,
"order_price": 2400.0,
"order_qty": 20,
"unit_price": 10.0,
"expected_shipment_date": "2026-10-12"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_shipment?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12",
"order_qty": 200,
"sold_quantity": 0,
"consignee": "",
"bill_to": "",
"ship_to": "1660 Winchester Blvd",
"po_number": "CUST-PO-9",
"store_no": "",
"locked": "no",
"scan_based_trading": "no",
"so_in_transit": "no",
"send_api_time": "2026-10-07 09:00",
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"salesorder_id": "SO-1001",
"item_number": "FG-100",
"item_description": "Finished good",
"storage_unit": "CS",
"unit_weight": 1.2,
"measure_unit": 12,
"measure_unit_cost": 120.0,
"order_price": 2400.0,
"order_qty": 20,
"unit_price": 10.0,
"expected_shipment_date": "2026-10-12"
}
]
}'Success response
{
"id": 63,
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12T00:00:00.000-07:00",
"order_qty": 200,
"po_number": "CUST-PO-9",
"locked": false,
"auto_pick": false,
"in_transit": false
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"status": "error", "message": "Error saving shipment data"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Upserts the SO by salesorder_id and its lines by
nav_line_number; lineitem_numberis the item's ALU.scan_based_trading: yesenables auto-pick;so_in_transit: yesmarks it in transit.Calls are stored in the ERP order log.
Update ERP Sales Order
/{tenant-code}/{location}/api/v1/external_shipmentRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12",
"order_qty": 200,
"sold_quantity": 0,
"consignee": "",
"bill_to": "",
"ship_to": "1660 Winchester Blvd",
"po_number": "CUST-PO-9",
"store_no": "",
"locked": "no",
"scan_based_trading": "no",
"so_in_transit": "no",
"send_api_time": "2026-10-07 09:00",
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"salesorder_id": "SO-1001",
"item_number": "FG-100",
"item_description": "Finished good",
"storage_unit": "CS",
"unit_weight": 1.2,
"measure_unit": 12,
"measure_unit_cost": 120.0,
"order_price": 2400.0,
"order_qty": 20,
"unit_price": 10.0,
"expected_shipment_date": "2026-10-12"
}
]
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_shipment?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12",
"order_qty": 200,
"sold_quantity": 0,
"consignee": "",
"bill_to": "",
"ship_to": "1660 Winchester Blvd",
"po_number": "CUST-PO-9",
"store_no": "",
"locked": "no",
"scan_based_trading": "no",
"so_in_transit": "no",
"send_api_time": "2026-10-07 09:00",
"original_facility": "",
"Items": [
{
"nav_line_number": 10000,
"salesorder_id": "SO-1001",
"item_number": "FG-100",
"item_description": "Finished good",
"storage_unit": "CS",
"unit_weight": 1.2,
"measure_unit": 12,
"measure_unit_cost": 120.0,
"order_price": 2400.0,
"order_qty": 20,
"unit_price": 10.0,
"expected_shipment_date": "2026-10-12"
}
]
}'Success response
{
"id": 63,
"salesorder_id": "SO-1001",
"type_id": 1,
"customer_id": "C-55",
"customer_name": "Retail Co",
"order_price": 2400.0,
"expected_shipment_date": "2026-10-12T00:00:00.000-07:00",
"order_qty": 200,
"po_number": "CUST-PO-9",
"locked": false,
"auto_pick": false,
"in_transit": false
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "INVALID LOCATION CODE"} |
| 400 | — | {"status": "error", "message": "<errors>"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Also accepted as PATCH. Like create; original_facility moves the SO from another location (see Update ERP Purchase Order).
Calls are stored in the ERP order log.
Delete ERP Sales Order Lines
/{tenant-code}/{location}/api/v1/external_shipmentRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"Items": [
{
"nav_line_number": 10000
}
],
"api_key": "<tenant api key>",
"salesorder_id": "SO-1001"
}Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_shipment?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"Items": [
{
"nav_line_number": 10000
}
],
"salesorder_id": "SO-1001"
}'Success response
{
"status": "success"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"status": "error", "message": "Sales order doesn't exist"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Deletes the listed lines of the SO.
Calls are stored in the ERP order log.
Manufacturing Documents (PDF)
Reception Label Cover Page
/{tenant-code}/{location}/api/v1/printing/details/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
job_ids | string | optional | Comma-separated tagging job ids. |
job_id | integer | optional | Single tagging job id (when job_ids is not sent). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/details/<id>.pdf" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Cover page for printed reception/tagging labels.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales Order Pick List
/{tenant-code}/{location}/api/v1/printing/pick-list/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales order process id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/pick-list/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Pick list of a sales order process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales Order Packing List
/{tenant-code}/{location}/api/v1/printing/packing-list/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales order process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/packing-list/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Packing list of a sales order process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales Order Invoice
/{tenant-code}/{location}/api/v1/printing/invoice/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales order process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/invoice/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Invoice of a sales order process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales Order Cover Page (BOL)
/{tenant-code}/{location}/api/v1/printing/so-cover/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales order process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-cover/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Bill-of-lading cover page of a sales order process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Ship-out Cover Page
/{tenant-code}/{location}/api/v1/printing/shipout-cover/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales order process id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/shipout-cover/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Ship-out cover page of a sales order process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Pallet License Plates
/{tenant-code}/{location}/api/v1/printing/pallet-license/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales order process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/pallet-license/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Pallet license plates of a sales order process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales-to-Zone Pick List
/{tenant-code}/{location}/api/v1/printing/so-zone-pick-list/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales-to-zone process id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-pick-list/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Pick list of a sales-to-zone process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales-to-Zone Packing List
/{tenant-code}/{location}/api/v1/printing/so-zone-packing-list/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales-to-zone process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-packing-list/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Packing list of a sales-to-zone process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales-to-Zone Invoice
/{tenant-code}/{location}/api/v1/printing/so-zone-invoice/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales-to-zone process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-invoice/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Invoice of a sales-to-zone process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales-to-Zone Cover Page (BOL)
/{tenant-code}/{location}/api/v1/printing/so-zone-cover/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales-to-zone process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-cover/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Bill-of-lading cover page of a sales-to-zone process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales-to-Zone Ship-out Cover Page
/{tenant-code}/{location}/api/v1/printing/so-zone-shipout-cover/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales-to-zone process id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-shipout-cover/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Ship-out cover page of a sales-to-zone process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Sales-to-Zone Pallet License Plates
/{tenant-code}/{location}/api/v1/printing/so-zone-pallet-license/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Printer id (its document template is used). |
soProcessId | integer | required | Sales-to-zone process id. |
copies | integer | optional | Copies (default 1). |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-pallet-license/<id>.pdf?soProcessId=<soProcessId>" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Pallet license plates of a sales-to-zone process.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Quality Hold Document
/{tenant-code}/{location}/api/v1/printing/quality-hold/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Quality hold id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/quality-hold/<id>.pdf" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Quality hold report.
Returns a PDF (request the
.pdfformat, e.g.…/{id}.pdf?soProcessId=…);.htmlreturns the HTML preview and addingdebugshows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.
Reports
Add ERP Report Card
/{tenant-code}/{location}/api/v1/reports/add-report-cardRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"from_datetime": "2026-10-06 00:00",
"to_datetime": "2026-10-07 00:00",
"entries": [
{
"summary_title": "Units sold",
"erp_value": "412"
},
{
"summary_title": "Units received",
"erp_value": "1200"
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/reports/add-report-card?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"from_datetime": "2026-10-06 00:00",
"to_datetime": "2026-10-07 00:00",
"entries": [
{
"summary_title": "Units sold",
"erp_value": "412"
},
{
"summary_title": "Units received",
"erp_value": "1200"
}
]
}'Success response
{
"message": "ERP Report Card imported"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 200 | — | {"message": "Missing required field \"from_datetime\""} |
| 200 | — | {"message": "Missing required field \"to_datetime\""} |
| 200 | — | {"message": "From and to values are the same"} |
| 200 | — | {"message": "Missing required field \"entries\""} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Stores ERP totals for a period (times in the location's time zone) so the Report Card can compare them with Senitron's numbers.
Validation errors are returned with HTTP 200 and a
message.
Web App APIs
Endpoints called by the Senitron web application itself (CRM, transfer-slip receiving, manufacturing receiving, custom fields, catalog import). Most need a signed-in web session (browser cookie) and are listed so that every route of the app is documented; they are not intended for integrations.
Custom Fields (Web App)
Create Service Field
/{tenant-code}/{location}/api/v1/fieldsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"title": "Warranty (months)",
"data_type": "number"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/fields" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Warranty (months)",
"data_type": "number"
}'Success response
[
{
"id": 4,
"title": "Warranty (months)",
"data_type": "number",
"enabled": true,
"order_number": 3,
"user_id": 110,
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
}
]Custom service fields (additional info fields) shown on service items.
data_type: e.g.string,number,date,boolean. Creating an existing title updates it.Returns the full list after the change.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Update Service Field
/{tenant-code}/{location}/api/v1/fields/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Field id. |
Request body
{
"title": "Warranty (months)",
"data_type": "string"
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/fields/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Warranty (months)",
"data_type": "string"
}'Success response
[
{
"id": 4,
"title": "Warranty (months)",
"data_type": "number",
"enabled": true,
"order_number": 3,
"user_id": 110,
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Also accepted as PATCH. Returns the full list after the change.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Delete Service Field
/{tenant-code}/{location}/api/v1/fields/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Field id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/fields/<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns the remaining list.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Create Requirement Field
/{tenant-code}/{location}/api/v1/requirement_fieldsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"title": "Warranty (months)",
"data_type": "number"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/requirement_fields" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Warranty (months)",
"data_type": "number"
}'Success response
[
{
"id": 4,
"title": "Warranty (months)",
"data_type": "number",
"enabled": true,
"order_number": 3,
"user_id": 110,
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
}
]Requirement fields (custom checklist fields).
data_type: e.g.string,number,date,boolean.Returns the full list after the change.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Update Requirement Field
/{tenant-code}/{location}/api/v1/requirement_fields/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Field id. |
Request body
{
"title": "Warranty (months)",
"data_type": "string"
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/requirement_fields/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Warranty (months)",
"data_type": "string"
}'Success response
[
{
"id": 4,
"title": "Warranty (months)",
"data_type": "number",
"enabled": true,
"order_number": 3,
"user_id": 110,
"created_at": "2026-09-01T08:00:00.000Z",
"updated_at": "2026-09-01T08:00:00.000Z"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Also accepted as PATCH. Returns the full list after the change.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Delete Requirement Field
/{tenant-code}/{location}/api/v1/requirement_fields/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Field id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/requirement_fields/<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns the remaining list.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Transfer Slip Receiving (Web App)
Commit Transfer Slip Receiving
/{tenant-code}/{location}/api/v1/transferslip/receivingRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"source_location": "002",
"transferslip_id": 88,
"from": "002",
"transfer_date": "10/07/2026",
"document_number": "TS-1001",
"reference_number": "",
"reference1": "",
"reference2": "",
"reason": "Restock",
"printer_id": 5,
"copies": 1
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"source_location": "002",
"transferslip_id": 88,
"from": "002",
"transfer_date": "10/07/2026",
"document_number": "TS-1001",
"reference_number": "",
"reference1": "",
"reference2": "",
"reason": "Restock",
"printer_id": 5,
"copies": 1
}'Success response
{
"message": "The transfer receiving data has been received, and a job has been scheduled to process it"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | NOT_FOUND | The source store is not found. Please enter store code |
| 400 | BAD_REQUEST | Set mandatory field(s): DOC#, Reason |
| 404 | NOT_FOUND | Printer not found |
Receives the EPCs collected in the user's receiving session (see Add Receiving Reads). Without
transferslip_ida transfer-out from the source is created first.Mandatory fields follow the location's transfer settings.
printer_idis required when print-after-commit is enabled.Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Start Receiving Reader
/{tenant-code}/{location}/api/v1/transferslip/receiving/startRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"reader_id": 12,
"from": "002",
"sub_zone_id": ""
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving/start" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"reader_id": 12,
"from": "002",
"sub_zone_id": ""
}'Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader does not selected"} |
| 404 | — | {"error": "From does not selected"} |
| 404 | — | {"error": "CDM not found"} |
Starts the fixed/handheld reader (through the location's CDM, or Azure) to stream reads to the receiving screen.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Stop Receiving Reader
/{tenant-code}/{location}/api/v1/transferslip/receiving/stopRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"reader_id": 12
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving/stop" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"reader_id": 12
}'Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "CDM not found"} |
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Get Receiving Summary
/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
from | string | required | Source location code of the transfer. |
transferslip_id | integer | optional | Transfer slip id (receiving an existing slip). |
reader_id | integer | optional | Reader id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets?from=<from>" \
-H "Cookie: $SENITRON_SESSION"Success response
{
"items": [
{
"item_number": "210000047060",
"alu": "CT-BLK-M",
"name": "Classic Tee",
"tags_count": 4,
"received_tags_count": 3,
"sent_qty": 4.0,
"received_qty": 3.0
}
],
"skus_count": 1,
"assets_count": 3.0,
"expected_skus_count": 1,
"expected_assets_count": 4.0
}Per-item sent vs received counts of the current user's receiving session.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Add Receiving Reads
/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"from": "002",
"transferslip_id": 88,
"reader_id": 12,
"unique_field": "epc_id",
"sub_zone_id": "",
"manual": false,
"action_type": "add",
"epcs": [
{
"EPC": "CF19930E4FA6BD4000000432",
"antenna_id": "101",
"sub_zone_id": ""
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"from": "002",
"transferslip_id": 88,
"reader_id": 12,
"unique_field": "epc_id",
"sub_zone_id": "",
"manual": false,
"action_type": "add",
"epcs": [
{
"EPC": "CF19930E4FA6BD4000000432",
"antenna_id": "101",
"sub_zone_id": ""
}
]
}'Success response
{
"items": [
{
"item_number": "210000047060",
"alu": "CT-BLK-M",
"name": "Classic Tee",
"tags_count": 4,
"received_tags_count": 3,
"sent_qty": 4.0,
"received_qty": 3.0
}
],
"skus_count": 1,
"assets_count": 3.0,
"expected_skus_count": 1,
"expected_assets_count": 4.0,
"invalid_epcs": []
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "From does not selected"} |
Adds reads to the receiving session (
action_type: "remove"removes them). Withtransferslip_idonly EPCs of that slip are accepted.Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Get Receiving Assets (HTML)
/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/assetsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
from | string | required | Source location code of the transfer. |
transferslip_id | integer | optional | Transfer slip id (receiving an existing slip). |
reader_id | integer | optional | Reader id. |
item_number | string | optional | Only this item. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets/assets?from=<from>" \
-H "Cookie: $SENITRON_SESSION"Success response
{
"note": "JavaScript/HTML fragment for the web page"
}Used by the web page's assets dialog.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Remove Receiving Asset
/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Temp asset id. |
from | string | required | Source location code of the transfer. |
transferslip_id | integer | optional | Transfer slip id (receiving an existing slip). |
reader_id | integer | optional | Reader id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets/<id>?from=<from>" \
-H "Cookie: $SENITRON_SESSION"Success response
{
"result": "<HTML table of the remaining assets>"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Remove Receiving Item
/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/delete_item/{item_number}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
item_number | path | required | Item number (undefined = reads without item). |
from | string | required | Source location code of the transfer. |
transferslip_id | integer | optional | Transfer slip id (receiving an existing slip). |
reader_id | integer | optional | Reader id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets/delete_item/<item_number>?from=<from>" \
-H "Cookie: $SENITRON_SESSION"Success response
{
"items": [
{
"item_number": "210000047060",
"alu": "CT-BLK-M",
"name": "Classic Tee",
"tags_count": 4,
"received_tags_count": 3,
"sent_qty": 4.0,
"received_qty": 3.0
}
],
"skus_count": 1,
"assets_count": 3.0,
"expected_skus_count": 1,
"expected_assets_count": 4.0
}Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Clear Receiving Session
/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/delete_allRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
from | string | required | Source location code of the transfer. |
transferslip_id | integer | optional | Transfer slip id (receiving an existing slip). |
reader_id | integer | optional | Reader id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets/delete_all?from=<from>" \
-H "Cookie: $SENITRON_SESSION"Success response
{
"items": [],
"skus_count": 0,
"assets_count": 0,
"expected_skus_count": 0,
"expected_assets_count": 0
}Removes all reads of the current user.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Catalog Import (Web App)
Validate Catalog File
/{tenant-code}/api/v1/catalog/validate_catalog_fileRequest headers
| Header | Value |
|---|---|
Content-Type | multipart/form-data |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
file | file | required | Catalog file (multipart/form-data). |
csv_type | string | required | system, simple, lightspeed or coci_catalog_item_part. |
request_type | string | required | Validator: SystemCsv, SimpleJson, LightspeedCsv or CociItemPart. |
refresh | string | optional | on = full refresh (replace catalog); requires pin_number. |
pin_number | string | optional | User PIN (refresh only). |
notification_email | string | optional | Default: the user's email. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog/validate_catalog_file?csv_type=<csv_type>&request_type=<request_type>" \
-H "Cookie: $SENITRON_SESSION" \
-F "file=@catalog.csv"Success response
{
"success": true,
"catalog_id": 912
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "You are not signed in any more"} |
| 400 | — | {"message": "Missing input file."} |
| 403 | — | {"message": "PIN# is wrong"} |
| 200 | — | {"success": false, "catalog_id": 912, "errors": ["<validation errors>"]} |
Step 1 of the web catalog import: stores and validates the file. Pass the returned
catalog_idto Start Catalog Import.Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Start Catalog Import
/{tenant-code}/api/v1/catalogRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"catalog_id": 912,
"csv_type": "system"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"catalog_id": 912,
"csv_type": "system"
}'Success response
{
"note": "HTTP 302 redirect back to the referring page"
}Step 2 of the web catalog import: queues the validated file. Requires the catalog permission.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Generate Catalog Import Report
/{tenant-code}/api/v1/catalog/generate_reportRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Request body
{
"catalog_id": 912
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog/generate_report" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"catalog_id": 912
}'Success response
{
"note": "HTTP 204 (no content)"
}Emails the validation/import report of the catalog file to the signed-in user.
Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.
Manufacturing Receiving (Web App)
Save Reception Labels
/{tenant-code}/{location}/api/v1/manufacturing/receive/save-labelsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"itemId": 55,
"itemNumber": "CTUB-20062",
"receivingItemNumber": "CTUB-20062",
"labels": [
{
"epc": "30340212C8044C4000000401",
"serialNumber": "1025",
"lotNumber": "20261007",
"lotExpDate": "2027-10-07",
"tagType": "case",
"orgUnits": 12,
"currentUnits": 12,
"storageUnit": 12,
"costPerStorageUnit": 1.5,
"palletNumber": "",
"caseNumber": "1",
"receivingId": "PO-7781",
"receivingItemId": 55,
"missingExpDate": false
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/save-labels?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"itemId": 55,
"itemNumber": "CTUB-20062",
"receivingItemNumber": "CTUB-20062",
"labels": [
{
"epc": "30340212C8044C4000000401",
"serialNumber": "1025",
"lotNumber": "20261007",
"lotExpDate": "2027-10-07",
"tagType": "case",
"orgUnits": 12,
"currentUnits": 12,
"storageUnit": 12,
"costPerStorageUnit": 1.5,
"palletNumber": "",
"caseNumber": "1",
"receivingId": "PO-7781",
"receivingItemId": 55,
"missingExpDate": false
}
]
}'Success response
[
{
"id": 40211,
"epc_id": "30340212C8044C4000000401",
"asset_id": "1025",
"item_number": "CTUB-20062",
"status_id": 1012,
"lot_number": "20261007",
"current_units": 12.0,
"expiration_date": "2027-10-07T00:00:00.000-07:00"
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing Ext. Receiving ID"} |
| 400 | — | {"message": "Missing Item Number"} |
| 400 | — | {"message": "Missing labels"} |
| 400 | — | {"message": "Expiration date is invalid"} |
| 400 | — | {"message": "Reception item not found"} |
| 400 | — | {"message": "Reception has already been completed"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Creates one tag per label with status Pending Reception (labels saved before for this line are killed).
lotExpDateisYYYY-MM-DD.Used by the web Receiving module: besides the API key it needs a signed-in web session, because the user is recorded (without one the call fails).
Print Reception Labels
/{tenant-code}/{location}/api/v1/manufacturing/receive/print-labelsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"printerId": 5,
"labels": [
{
"epc": "30340212C8044C4000000401",
"serialNumber": "1025",
"lotNumber": "20261007",
"lotExpDate": "2027-10-07",
"tagType": "case",
"orgUnits": 12,
"currentUnits": 12,
"storageUnit": 12,
"costPerStorageUnit": 1.5,
"palletNumber": "",
"caseNumber": "1",
"receivingId": "PO-7781",
"receivingItemId": 55,
"missingExpDate": false
}
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/print-labels?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"printerId": 5,
"labels": [
{
"epc": "30340212C8044C4000000401",
"serialNumber": "1025",
"lotNumber": "20261007",
"lotExpDate": "2027-10-07",
"tagType": "case",
"orgUnits": 12,
"currentUnits": 12,
"storageUnit": 12,
"costPerStorageUnit": 1.5,
"palletNumber": "",
"caseNumber": "1",
"receivingId": "PO-7781",
"receivingItemId": 55,
"missingExpDate": false
}
]
}'Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing labels"} |
| 400 | — | {"message": "Missing printer id"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Prints the saved labels in the background (and the cover page if the printer has one). Labels flagged
missingExpDatetrigger the Reception Missing Exp. Date email.Used by the web Receiving module: besides the API key it needs a signed-in web session, because the user is recorded (without one the call fails).
Finish Receiving Item
/{tenant-code}/{location}/api/v1/manufacturing/receive/finish-receiving-itemRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"receivingId": "PO-7781",
"itemId": 55,
"postingDate": "2026-10-07",
"manualOverride": false,
"epcs": [
"30340212C8044C4000000401"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/finish-receiving-item?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receivingId": "PO-7781",
"itemId": 55,
"postingDate": "2026-10-07",
"manualOverride": false,
"epcs": [
"30340212C8044C4000000401"
]
}'Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing Ext. Receiving ID"} |
| 400 | — | {"message": "Missing epcs"} |
| 400 | — | {"message": "Reception item not found"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Completes the line (and the reception when all lines are complete), applies expiration dates, records the purchase transactions and posts the receipt to the ERP. The Reception Notification email is sent.
Used by the web Receiving module: besides the API key it needs a signed-in web session, because the user is recorded (without one the call fails).
Undo Receiving Item (Legacy)
/{tenant-code}/{location}/api/v1/manufacturing/receive/undo-receiving-itemRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"receivingId": "PO-7781",
"itemId": 55,
"epcs": [
"30340212C8044C4000000401"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/undo-receiving-item?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receivingId": "PO-7781",
"itemId": 55,
"epcs": [
"30340212C8044C4000000401"
]
}'Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing Ext. Receiving ID"} |
| 400 | — | {"message": "Reception item not found"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Sets the line back to pending and kills its tags. Prefer Undo Receiving.
Used by the web Receiving module: besides the API key it needs a signed-in web session, because the user is recorded (without one the call fails).
Undo Receiving
/{tenant-code}/{location}/api/v1/manufacturing/receiving/undoRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Parameters
| Name | Type | Description | |
|---|---|---|---|
api_key | string | required | Tenant API key. |
Request body
{
"api_key": "<tenant api key>",
"receivingId": "PO-7781",
"itemId": 55,
"call_nav": true,
"epcs": [
"30340212C8044C4000000401"
]
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receiving/undo?api_key=$SENITRON_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"receivingId": "PO-7781",
"itemId": 55,
"call_nav": true,
"epcs": [
"30340212C8044C4000000401"
]
}'Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"message": "Missing Ext. Receiving ID"} |
| 400 | — | {"message": "Reception item not found"} |
| 400 | — | {"message": "<reason>"} |
| 401 | — | {"status": "error", "message": "Invalid API key"} |
Reverses a received line: kills its tags, reverses the transactions and (with
call_nav) posts the reversal to the ERP. Run the Undo checks first.Used by the web Receiving module: besides the API key it needs a signed-in web session, because the user is recorded (without one the call fails).
CRM Users
CRM PIN Login
/{tenant-code}/{location}/api/v1/crm/users/pin_loginRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Request body
{
"pin": "1234"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/users/pin_login" \
-H "Content-Type: application/json" \
-d '{
"pin": "1234"
}'Success response
{
"message": "OK"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 401 | — | {"message": "Unable to authorise user with provided PIN number"} |
| 401 | — | Unauthorized (CRM module disabled) |
Checks that pin belongs to a user of the tenant. It does not create a session; the web app then keeps the PIN in the
pincookie for shipping/return actions.
CRM Customers
Update CRM Customer
/{tenant-code}/{location}/api/v1/crm/customers/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Customer id. |
Request body
{
"company": "Retail Co",
"company_label": "",
"first_name": "Ana",
"last_name": "Ruiz",
"customer_type_id": 2,
"is_parent": false,
"parent_id": null,
"enable": true,
"pay_name": "Retail Co AP",
"billing_country": "US",
"billing_address1": "1660 Winchester Blvd",
"billing_address2": "",
"billing_city": "Campbell",
"billing_state": "CA",
"billing_zip": "95008",
"note": "",
"contacts": [
{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"id": 21
}
],
"additional": {
"4": "24"
}
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/customers/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"company": "Retail Co",
"company_label": "",
"first_name": "Ana",
"last_name": "Ruiz",
"customer_type_id": 2,
"is_parent": false,
"parent_id": null,
"enable": true,
"pay_name": "Retail Co AP",
"billing_country": "US",
"billing_address1": "1660 Winchester Blvd",
"billing_address2": "",
"billing_city": "Campbell",
"billing_state": "CA",
"billing_zip": "95008",
"note": "",
"contacts": [
{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"id": 21
}
],
"additional": {
"4": "24"
}
}'Success response
{
"id": 55,
"company": "Retail Co",
"first_name": "Ana",
"last_name": "Ruiz",
"billing_formatted_address": "1660 Winchester Blvd, Campbell, CA 95008, USA",
"billing_address_valid": true,
"enable": true
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"fields": {"company": "Already taken!"}} |
| 400 | <exception class> | <exception message> |
Also accepted as PATCH. Updates the customer, its existing contacts (by id) and additional service-field values (
{field id: value}). A changed billing address is validated with Google.Changes are logged; with a CRM integration the customer is pushed to it.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Add Customer Contact
/{tenant-code}/{location}/api/v1/crm/customers/{customer_id}/contactsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
customer_id | path | required | Customer id. |
Request body
{
"title": "Receiving"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/customers/<customer_id>/contacts" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Receiving"
}'Success response
[
{
"id": 21,
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"user_id": 110
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Creates a contact with only a title; returns all of them.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Customer Contact
/{tenant-code}/{location}/api/v1/crm/customers/{customer_id}/contacts/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
customer_id | path | required | Customer id. |
id | path | required | Contact id. |
Request body
{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com"
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/customers/<customer_id>/contacts/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com"
}'Success response
[
{
"id": 21,
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"user_id": 110
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Also accepted as PATCH. Returns all of them.
Fields:
title,name,tel1,tel2,fax,email.Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Delete Customer Contact
/{tenant-code}/{location}/api/v1/crm/customers/{customer_id}/contacts/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
customer_id | path | required | Customer id. |
id | path | required | Contact id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/customers/<customer_id>/contacts/<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns the remaining ones.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
CRM Customer Locations
Update CRM Customer Location
/{tenant-code}/{location}/api/v1/crm/locations/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
id | path | required | Customer location id. |
Request body
{
"name": "Retail Co – Store 12",
"code": "RC12",
"location_type_id": 1,
"ship": true,
"enable": true,
"shipping_country": "US",
"shipping_address": "1660 Winchester Blvd",
"shipping_address2": "",
"shipping_city": "Campbell",
"shipping_state": "CA",
"shipping_zip": "95008",
"shipping_gln": "",
"shipping_gps": "37.287,-121.950",
"contacts": [
{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"id": 21
}
],
"holiday_hours": [
{
"id": 8,
"title": "Standard",
"monday": "8-17",
"tuesday": "8-17",
"wednesday": "8-17",
"thursday": "8-17",
"friday": "8-16",
"saturday": "",
"sunday": "",
"bus_of_days": "",
"off_hours": "",
"christmas_day": "closed",
"alt_h1": "",
"alt_h1_hours": "",
"alt_h2": "",
"alt_h2_hours": ""
}
],
"requirement": {
"3": "Dock appointment required"
}
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"name": "Retail Co – Store 12",
"code": "RC12",
"location_type_id": 1,
"ship": true,
"enable": true,
"shipping_country": "US",
"shipping_address": "1660 Winchester Blvd",
"shipping_address2": "",
"shipping_city": "Campbell",
"shipping_state": "CA",
"shipping_zip": "95008",
"shipping_gln": "",
"shipping_gps": "37.287,-121.950",
"contacts": [
{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"id": 21
}
],
"holiday_hours": [
{
"id": 8,
"title": "Standard",
"monday": "8-17",
"tuesday": "8-17",
"wednesday": "8-17",
"thursday": "8-17",
"friday": "8-16",
"saturday": "",
"sunday": "",
"bus_of_days": "",
"off_hours": "",
"christmas_day": "closed",
"alt_h1": "",
"alt_h1_hours": "",
"alt_h2": "",
"alt_h2_hours": ""
}
],
"requirement": {
"3": "Dock appointment required"
}
}'Success response
{
"id": 71,
"name": "Retail Co – Store 12",
"code": "RC12",
"shipping_formatted_address": "1660 Winchester Blvd, Campbell, CA 95008, USA",
"shipping_address_valid": true
}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | — | {"fields": {"name": "Already taken!"}} |
| 404 | — | Unknown id (record not found) |
Also accepted as PATCH. Updates the location, its existing contacts and holiday_hours (by id) and requirement values (
{requirement field id: value}). A changed address is validated with Google.Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Add Location Contact
/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/contactsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location_id | path | required | Location id. |
Request body
{
"title": "Receiving"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/contacts" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Receiving"
}'Success response
[
{
"id": 21,
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"user_id": 110
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Creates a contact with only a title; returns all of them.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Location Contact
/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/contacts/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location_id | path | required | Location id. |
id | path | required | Contact id. |
Request body
{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com"
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/contacts/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com"
}'Success response
[
{
"id": 21,
"title": "Receiving",
"name": "Sam Lee",
"tel1": "+1 408 555 0100",
"tel2": "",
"fax": "",
"email": "receiving@retailco.com",
"user_id": 110
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Also accepted as PATCH. Returns all of them.
Fields:
title,name,tel1,tel2,fax,email.Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Delete Location Contact
/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/contacts/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location_id | path | required | Location id. |
id | path | required | Contact id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/contacts/<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns the remaining ones.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Add Location Holiday Hours
/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/holiday_hoursRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location_id | path | required | Location id. |
Request body
{
"title": "Standard"
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/holiday_hours" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"title": "Standard"
}'Success response
[
{
"id": 8,
"title": "Standard",
"monday": "8-17",
"tuesday": "8-17",
"wednesday": "8-17",
"thursday": "8-17",
"friday": "8-16",
"saturday": "",
"sunday": "",
"bus_of_days": "",
"off_hours": "",
"christmas_day": "closed",
"alt_h1": "",
"alt_h1_hours": "",
"alt_h2": "",
"alt_h2_hours": ""
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Creates a holiday hours with only a title; returns all of them.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Location Holiday Hours
/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/holiday_hours/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
location_id | path | required | Location id. |
id | path | required | Holiday Hours id. |
Request body
{
"id": 8,
"title": "Standard",
"monday": "8-17",
"tuesday": "8-17",
"wednesday": "8-17",
"thursday": "8-17",
"friday": "8-16",
"saturday": "",
"sunday": "",
"bus_of_days": "",
"off_hours": "",
"christmas_day": "closed",
"alt_h1": "",
"alt_h1_hours": "",
"alt_h2": "",
"alt_h2_hours": ""
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/holiday_hours/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"id": 8,
"title": "Standard",
"monday": "8-17",
"tuesday": "8-17",
"wednesday": "8-17",
"thursday": "8-17",
"friday": "8-16",
"saturday": "",
"sunday": "",
"bus_of_days": "",
"off_hours": "",
"christmas_day": "closed",
"alt_h1": "",
"alt_h1_hours": "",
"alt_h2": "",
"alt_h2_hours": ""
}'Success response
[
{
"id": 8,
"title": "Standard",
"monday": "8-17",
"tuesday": "8-17",
"wednesday": "8-17",
"thursday": "8-17",
"friday": "8-16",
"saturday": "",
"sunday": "",
"bus_of_days": "",
"off_hours": "",
"christmas_day": "closed",
"alt_h1": "",
"alt_h1_hours": "",
"alt_h2": "",
"alt_h2_hours": ""
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Also accepted as PATCH. Returns all of them.
Fields:
title,monday–sunday,bus_of_days,off_hours, holiday flags (new_year_eve,new_year_day,good_friday,east_sunday,memorial_day,july_4th,labor_day,thanks_giving,christmas_eve,christmas_day) andalt_h1/alt_h1_hours,alt_h2/alt_h2_hours.Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Delete Location Holiday Hours
/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/holiday_hours/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
location_id | path | required | Location id. |
id | path | required | Holiday Hours id. |
Try it with curl
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/holiday_hours/<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns the remaining ones.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
CRM Orders
Add Order Item
/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
order_id | path | required | Order id. |
Request body
{
"item_id": 597116190
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/orders/<order_id>/items" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"item_id": 597116190
}'Success response
[
{
"id": 301,
"item_number": "000420",
"description": "Finished good",
"ordered_qty": 20,
"shipped_qty": 0,
"unit_price": 10.0
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Adds a catalog item (by record id); returns the item lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Order Item
/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/items/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
order_id | path | required | Order id. |
id | path | required | Line id. |
Request body
{
"ordered_qty": 24,
"unit_price": 9.5
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/orders/<order_id>/items/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"ordered_qty": 24,
"unit_price": 9.5
}'Success response
[
{
"id": 301,
"item_number": "000420",
"description": "Finished good",
"ordered_qty": 20,
"shipped_qty": 0,
"unit_price": 10.0
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
| 400 | — | {"message": "<validation errors>"} |
Also accepted as PATCH. Returns the item lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Remove Order Items
/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
order_id | path | required | Order id. |
id[] | integer | required | Line ids (repeat the parameter). |
Try it with curl
curl -g -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/orders/<order_id>/items?id[]=<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Returns the remaining item lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Order Schedule Item
/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/schedule_items/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
order_id | path | required | Order id. |
id | path | required | Schedule line id. |
Request body
{
"ordered_qty": 12,
"unit_price": 9.5
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/orders/<order_id>/schedule_items/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"ordered_qty": 12,
"unit_price": 9.5
}'Success response
[
{
"id": 301,
"item_number": "000420",
"description": "Finished good",
"ordered_qty": 20,
"shipped_qty": 0,
"unit_price": 10.0
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
| 400 | — | {"message": "<validation errors>"} |
Also accepted as PATCH. Returns the order's scheduled lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Remove Order Schedule Items
/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/schedule_itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
order_id | path | required | Order id. |
id[] | integer | required | Schedule line ids (repeat the parameter). |
Try it with curl
curl -g -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/orders/<order_id>/schedule_items?id[]=<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Returns the remaining scheduled lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
CRM Shipping Schedules
Add Schedule Item
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
Request body
{
"item_id": 597116190
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/items" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"item_id": 597116190
}'Success response
[
{
"id": 301,
"item_number": "000420",
"description": "Finished good",
"ordered_qty": 20,
"shipped_qty": 0,
"unit_price": 10.0
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Adds a catalog item (by record id); returns the item lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Schedule Item
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/items/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
id | path | required | Line id. |
Request body
{
"ordered_qty": 12,
"unit_price": 9.5
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/items/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"ordered_qty": 12,
"unit_price": 9.5
}'Success response
[
{
"id": 301,
"item_number": "000420",
"description": "Finished good",
"ordered_qty": 20,
"shipped_qty": 0,
"unit_price": 10.0
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
| 400 | — | {"message": "<validation errors>"} |
Also accepted as PATCH. Returns the item lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Remove Schedule Items
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
id[] | integer | required | Line ids (repeat the parameter). |
Try it with curl
curl -g -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/items?id[]=<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Returns the remaining item lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Shipping Schedule BOL (PDF)
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/previewRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
printer_id | integer | optional | Printer whose BOL template is used. |
copies | integer | optional | Default 1. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/preview.pdf" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns a PDF (request the
.pdfformat);.htmlreturns the HTML preview,debugshows the PDF as HTML. No user session is checked (the URL is fetched by the CDM print script); only the CRM module must be enabled.
Print Shipping Schedule BOL
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
printer_id | integer | required | Printer id. |
copies | integer | optional | Default 1. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/print?printer_id=<printer_id>" \
-H "Cookie: $SENITRON_SESSION"Success response
{}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | <exception class> | <exception message> |
Sends the BOL PDF to the printer through the location's CDM.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Start Ship-out Reader
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs/startRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie>; pin=<operator CRM PIN> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
reader_id | integer | required | Reader id. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/ship_outs/start?reader_id=<reader_id>" \
-H "Cookie: $SENITRON_SESSION; pin=$CRM_PIN"Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "CDM not found"} |
Starts the reader (and sets its GPIO lights) to scan the shipment.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Also requires the
pincookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.
Stop Ship-out Reader
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs/stopRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie>; pin=<operator CRM PIN> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
reader_id | integer | required | Reader id. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/ship_outs/stop?reader_id=<reader_id>" \
-H "Cookie: $SENITRON_SESSION; pin=$CRM_PIN"Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "CDM not found"} |
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Also requires the
pincookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.
Save Ship-out Progress
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs/snapshotRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie>; pin=<operator CRM PIN> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
Request body
{
"data": {
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
]
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/ship_outs/snapshot" \
-H "Cookie: $SENITRON_SESSION; pin=$CRM_PIN" \
-H "Content-Type: application/json" \
-d '{
"data": {
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
]
}
}'Success response
{}Stores the operator's in-progress scan (any JSON in
data) so it can be resumed (HTTP 201).Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Also requires the
pincookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.
Ship Schedule
/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie>; pin=<operator CRM PIN> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
schedule_id | path | required | Schedule id. |
Request body
{
"reader_id": 12,
"printer_id": 5,
"door_id": 3,
"qty": 1,
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
],
"crm_order_schedule": {
"shipping_zone_id": 14,
"pickup_carrier": "UPS",
"pickup_vehicle_plate_number": "8ABC123",
"pickup_driver_name": "Lee",
"pickup_driver_phone_number": "",
"pickup_vehicle_trailer_number": "",
"carrier_tracking_number": "1Z999",
"seal_number": "S-77"
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/ship_outs" \
-H "Cookie: $SENITRON_SESSION; pin=$CRM_PIN" \
-H "Content-Type: application/json" \
-d '{
"reader_id": 12,
"printer_id": 5,
"door_id": 3,
"qty": 1,
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
],
"crm_order_schedule": {
"shipping_zone_id": 14,
"pickup_carrier": "UPS",
"pickup_vehicle_plate_number": "8ABC123",
"pickup_driver_name": "Lee",
"pickup_driver_phone_number": "",
"pickup_vehicle_trailer_number": "",
"carrier_tracking_number": "1Z999",
"seal_number": "S-77"
}
}'Success response
{}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "Printer not found"} |
| 400 | — | {"error": "Can modify only firmed status"} |
| 400 | — | {"error": "<message>"} |
Ships a firmed schedule: records the shipped tags, optionally transfers them to the configured location, generates the invoice, completes the schedule, sends notifications and prints the BOL (
qtycopies).Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Also requires the
pincookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.
CRM Invoices
Add Invoice Item
/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
invoice_id | path | required | Invoice id. |
Request body
{
"item_id": 597116190
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/items" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"item_id": 597116190
}'Success response
[
{
"id": 401,
"item_number": "000420",
"description": "Finished good",
"qty": 20,
"unit_price": 10.0,
"locked": false
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Adds a catalog item (qty 1, customer price or item price); returns the invoice lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Update Invoice Item
/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/items/{id}Request headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Parameters
| Name | Type | Description | |
|---|---|---|---|
invoice_id | path | required | Invoice id. |
id | path | required | Line id. |
Request body
{
"qty": 20,
"unit_price": 10.0
}Try it with curl
curl -X PUT "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/items/<id>" \
-H "Cookie: $SENITRON_SESSION" \
-H "Content-Type: application/json" \
-d '{
"qty": 20,
"unit_price": 10.0
}'Success response
[
{
"id": 401,
"item_number": "000420",
"description": "Finished good",
"qty": 20,
"unit_price": 10.0,
"locked": false
}
]Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
| 400 | — | {"message": "<validation errors>"} |
Also accepted as PATCH. Returns the invoice lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Remove Invoice Items
/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/itemsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
invoice_id | path | required | Invoice id. |
id[] | integer | required | Line ids (repeat the parameter). |
Try it with curl
curl -g -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/items?id[]=<id>" \
-H "Cookie: $SENITRON_SESSION"Success response
[]
Locked lines are kept. Returns the remaining invoice lines.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
Invoice (PDF)
/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/previewRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
invoice_id | path | required | Invoice id. |
printer_id | integer | optional | Printer whose invoice template is used. |
copies | integer | optional | Default 1. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/preview.pdf" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns a PDF (request the
.pdfformat);.htmlreturns the HTML preview,debugshows the PDF as HTML. No user session is checked (the URL is fetched by the CDM print script); only the CRM module must be enabled.
Print Invoice
/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | <Senitron web session cookie> (signed in to the web app) |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
invoice_id | path | required | Invoice id. |
printer_id | integer | required | Printer id. |
copies | integer | optional | Default 1. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/print?printer_id=<printer_id>" \
-H "Cookie: $SENITRON_SESSION"Success response
{}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | <exception class> | <exception message> |
Sends the invoice PDF to the printer through the location's CDM.
Web-app endpoint (CRM module): requires a signed-in Senitron web session with access to the related CRM page; the CRM module and advanced customers must be enabled for the tenant (otherwise HTTP 401).
CRM Returns
Start Return Reader
/{tenant-code}/{location}/api/v1/crm/returns/startRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | pin=<operator CRM PIN> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
reader_id | integer | required | Reader id. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns/start?reader_id=<reader_id>" \
-H "Cookie: pin=$CRM_PIN"Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "CDM not found"} |
Web-app endpoint (CRM module). Authenticated only by the
pincookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.
Stop Return Reader
/{tenant-code}/{location}/api/v1/crm/returns/stopRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | pin=<operator CRM PIN> |
Parameters
| Name | Type | Description | |
|---|---|---|---|
reader_id | integer | required | Reader id. |
Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns/stop?reader_id=<reader_id>" \
-H "Cookie: pin=$CRM_PIN"Success response
{
"status": 200
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "CDM not found"} |
Web-app endpoint (CRM module). Authenticated only by the
pincookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.
Save Return Progress
/{tenant-code}/{location}/api/v1/crm/returns/snapshotRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | pin=<operator CRM PIN> |
Request body
{
"data": {
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
]
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns/snapshot" \
-H "Cookie: pin=$CRM_PIN" \
-H "Content-Type: application/json" \
-d '{
"data": {
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
]
}
}'Success response
{}Stores the operator's in-progress return scan (HTTP 201).
Web-app endpoint (CRM module). Authenticated only by the
pincookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.
Create CRM Return
/{tenant-code}/{location}/api/v1/crm/returnsRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | pin=<operator CRM PIN> |
Request body
{
"reader_id": 12,
"printer_id": 5,
"door_id": 3,
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
],
"crm_return": {
"receiving_zone_id": 14,
"shipped_from": "Retail Co – Store 12",
"carrier": "UPS",
"vehicle_plate_number": "",
"driver_name": "",
"driver_phone": "",
"vehicle_trailer_number": "",
"carrier_tracking_number": "1Z999",
"seal_number": ""
}
}Try it with curl
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns" \
-H "Cookie: pin=$CRM_PIN" \
-H "Content-Type: application/json" \
-d '{
"reader_id": 12,
"printer_id": 5,
"door_id": 3,
"items": [
{
"item_number": "000420",
"tags": [
"30340212C8044C4000000401"
]
}
],
"crm_return": {
"receiving_zone_id": 14,
"shipped_from": "Retail Co – Store 12",
"carrier": "UPS",
"vehicle_plate_number": "",
"driver_name": "",
"driver_phone": "",
"vehicle_trailer_number": "",
"carrier_tracking_number": "1Z999",
"seal_number": ""
}
}'Success response
{
"id": 18
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | {"error": "Reader not found"} |
| 404 | — | {"error": "Printer not found"} |
| 400 | — | {"error": "<message>"} |
Receives returned tags into zone
receiving_zone_id(transferring them from the shipped-tags location when configured), logs and notifies, and prints the return document.Web-app endpoint (CRM module). Authenticated only by the
pincookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.
Return Document (PDF)
/{tenant-code}/{location}/api/v1/crm/returns/{return_id}/previewRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
return_id | path | required | Return id. |
printer_id | integer | optional | Printer whose template is used. |
copies | integer | optional | Default 1. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns/<return_id>/preview.pdf" \
-o document.pdfSuccess response
{
"note": "PDF document"
}Errors
| HTTP | Type | Message |
|---|---|---|
| 404 | — | Unknown id (record not found) |
Returns a PDF (request the
.pdfformat);.htmlreturns the HTML preview,debugshows the PDF as HTML. No user session is checked (the URL is fetched by the CDM print script); only the CRM module must be enabled.
Print Return Document
/{tenant-code}/{location}/api/v1/crm/returns/{return_id}/printRequest headers
| Header | Value |
|---|---|
Content-Type | application/json |
Cookie | pin=<operator CRM PIN> |
Query parameters
| Name | Type | Description | |
|---|---|---|---|
return_id | path | required | Return id. |
printer_id | integer | required | Printer id. |
Try it with curl
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns/<return_id>/print?printer_id=<printer_id>" \
-H "Cookie: pin=$CRM_PIN"Success response
{}Errors
| HTTP | Type | Message |
|---|---|---|
| 400 | <exception class> | <exception message> |
Sends the return document to the printer through the location's CDM.
Web-app endpoint (CRM module). Authenticated only by the
pincookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.