Developer Documentation

REST API Reference v3.0

Complete reference for the Senitron RFID Inventory & Tracking Cloud API — 404 endpoints, verified against the server code.

404Endpoints
81Resource groups
v3.0Document
October 2026Edition
Introduction

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

https://app.senitron.net/api/v1

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

Handheld token
  1. Register Device returns the tenant api_key once the device is assigned to a tenant.
  2. Login with the Api-Key header returns a session token.
  3. Send Authorization: <token> on every call.
  4. Call Session Ping regularly to keep the session active.
Tenant API key
  1. Get the key from Senitron support, or in the web app under Tenant Admin → Integrations (Super Admin).
  2. General mode: call /{tenant-code}/{location}/api/v1/… with api_key=<key>.
  3. Handheld paths marked Token or API key also accept the key in the Api-Key header or api_key parameter.

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:

Shell
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 send Authorization: $SENITRON_TOKEN.
  • Web App commands need SENITRON_SESSION: copy the _smartadmin_session=… cookie from your browser after signing in to the web app.
  • Add -i to 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:

JSON
{
  "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 error key.
  • Some endpoints return unexpected failures as HTTP 404 with the exception class as type.

Conventions

Paginationpage (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.
BooleansQuery-string flags must be the text true; any other value counts as false.
DatesMost responses use MM/DD/YYYY hh:mm AM/PM; asset fields often use a two-digit year. The format is shown in each sample.
DuplicatesEndpoints that support it accept a Request-Id header; a repeated id returns 409 DUPLICATE_REQUEST.
Async workUploads and imports are queued; a 200 means accepted, not processed. Check the related list endpoint for the result.
Handheld namesSeveral endpoints need device_name as HH-<device id> (from Register Device).

How to read this reference

GET Read
POST Create / submit
PUT Update
DELETE Remove

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.

01

Authentication

Register a handheld, log in to get a session token, and keep the session alive.

3 endpoints · 1 groups
Authentication

Device & Session

POST

Register Device

/api/v1/handhelds/register
Also at POST /{tenant-code}/api/v1/handhelds/register
AuthenticationNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
401STATUS_PENDINGError in user authentication
Notes
  • 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).

POST

Login

/api/v1/handhelds/login
Also at POST /{tenant-code}/api/v1/handhelds/login
AuthenticationApi-Key header

Request headers

HeaderValue
Content-Typeapplication/json
Api-Key<api key from Register Device>

Request body

JSON
{
  "email": "user@example.com",
  "password": "********",
  "mac_address": "6C:EC:A1:FF:0B:8E",
  "serial_number": "K3A01A0819070037"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDYour serial number does not registered.
401UNAUTHORIZEDYour mac address does not registered.
401UNAUTHORIZEDYour username or password is invalid.
401UNAUTHORIZEDThe user is not active.
Notes
  • Send the Api-Key header 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 Authorization header 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 true when the user's role grants that handheld feature.

GET

Session Ping

/api/v1/sessions/ping
Also at POST /api/v1/sessions/ping
AuthenticationToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
device_idintegeroptionalDevice 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_mbnumberoptionalOptional device metrics (MB).
reader_temp_c, battery_temp_cnumberoptionalOptional temperatures (°C).
cpu_percent, app_cpu_percentnumberoptionalOptional CPU usage (%).
android_versionstringoptionalOptional Android version.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/sessions/ping" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Also accepted as POST /api/v1/sessions/ping; a POST body may carry the same metrics as a nested hardware_metrics object (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.

02

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.

155 endpoints · 25 groups
Handheld Mode APIs

Assets

GET

Get Assets

/api/v1/assets
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringoptionalLocation code. Falls back to the tenant's first location when missing or unknown.
querystringoptionalExact match on asset id (serial), record id, item number, EPC or alt serial.
serial_numbersstringoptionalComma-separated asset ids (serial numbers).
statusstringoptionalStatus name, e.g. Live.
zone_idsstringoptionalComma-separated sub-zone ids; matches the last-seen antenna or static zone.
include_in_inventorybooleanoptionaltrue = only assets whose status counts toward inventory.
items_detailsbooleanoptionaltrue adds an item_details object to each asset.
item_partsbooleanoptionalWith items_details, lists item parts (COCI tenants only).
main_attributesbooleanoptionaltrue returns only id, serial_number, item_number, alt_serial, epc, text3 and status.
summarybooleanoptionaltrue adds a summary object.
assetsbooleanoptionalfalse omits the asset list (returns "assets": []).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/assets" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Dates use the location's time zone. first_seen, last_seen, created_at and updated_at use MM/DD/YY hh:mm AM/PM; handheld_last_seen uses a four-digit year.

POST

Merge Assets

/api/v1/assets/merge
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "assets": [
    {
      "epc": "CF19930E4FA6BD4000000432"
    },
    {
      "epc": "CF19930E4FA6BD4000000433"
    },
    {
      "epc": "CF19930E4FA6BD4000000434"
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • 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 type and the exception text as message.

POST

New Asset

/api/v1/assets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The asset info saved successfully"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
400INVALID_ASSETThe asset payload is required
400ERROR<Lightspeed push result>
404<exception class><exception message>
Notes
  • 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.id 0 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: true with a non-zero adjust_qty pushes the quantity change to Lightspeed (Lightspeed tenants only).

POST

Split Asset

/api/v1/assets/split
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "asset": {
    "epc": "CF19930E4FA6BD4000000432"
  },
  "adjustment": -4,
  "new_tags": 2,
  "printer_id": 2
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_CORRECTThere should be correct divide for the each tag quantity for split to work.
404<exception class><exception message>
Notes
  • 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_page paginate the returned list.

PUT

Update Asset

/api/v1/assets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The asset info saved successfully"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
400ERROR<Lightspeed push result>
404ActiveRecord::RecordNotFoundCouldn't find EpcTag with 'id'=32503
Notes
  • 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. Send epc to 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: true pushes a non-zero adjust_qty to Lightspeed.

Handheld Mode APIs

Audits

POST

Audit Zone Upload

/api/v1/audits/inventory_zones
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Audit information received and saved in cloud"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
422ZONE_NOT_FOUNDThe zone Inside not found
422SUB_ZONE_NOT_FOUNDThe following sub zone ids are not found: 5
Notes
  • 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

Get Audit Orders

/api/v1/audits/orders
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
order_idstringoptionalExact sales document id.
querystringoptionalPartial match on document id or date.
itemsbooleanoptionalInclude the items array (default: empty array).
items_detailsbooleanoptionalWith items, add item_details to each item.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/audits/orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
Notes
  • Orders are sales transactions that have a document id, newest first.

  • customer_name is always empty. Each item's epcs lists all EPCs recorded on the order.

POST

Post Audit Data

/api/v1/audits
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Received assets audit data are saved in cloud"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
400INVALID_DATEYour audit date is invalid
Notes
  • 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.

Handheld Mode APIs

Bills of Lading (BOLs)

POST

Audit Bols Pallets

/api/v1/bols/pallets/audit
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "BOL pallets audit-data received and saved in cloud"
}

Errors

HTTPTypeMessage
404Not FoundCould not find Bol with that number
Notes
  • Replaces any previous audit of the same BOL.

  • epcs[].last_seen is required, in MM/DD/YYYY hh:mm AM/PM format.

GET

Get Bols

/api/v1/bols
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
querystringoptionalPartial match on BOL number.
cartonstringoptionalCarton number; returns only the BOL that contains it (overrides query).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/bols?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Sorted by status, then number.

GET

Get Bols Cartons

/api/v1/bols/cartons
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
bol_numberstringrequiredBOL number.
querystringoptionalPartial match on carton number.
itemsbooleanoptionalInclude each carton's items.
items_detailsbooleanoptionalWith items, add item_details to each item.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/bols/cartons?location=$LOCATION&bol_number=<bol_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404Not FoundCould not find Bol with that number
Notes
  • In this endpoint each item's epcs, pallets and cartons arrays are always empty; use Get Bols Items for those.

GET

Get Bols Item Pallets

/api/v1/bols/items/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
bol_numberstringrequiredBOL number.
item_numberstringoptionalOnly pallets containing this item; also switches the response to item totals.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/bols/items/pallets?location=$LOCATION&bol_number=<bol_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404Not FoundCould not find Bol with that number
Notes
  • GET /api/v1/bols/pallets and GET /api/v1/bols/items/pallets are the same endpoint.

  • With item_number, total_items_count/total_assets_count are replaced by that item's expected_count and recorded_count:

    {"pagination": {…}, "expected_count": 8, "recorded_count": 32, "pallets": [ … ]}

GET

Get Bols Items

/api/v1/bols/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
bol_numberstringrequiredBOL number.
filterstringoptionalnone (default), recorded, missing or over.
pallet_numberstringoptionalOnly items on this pallet (0 = all).
carton_numberstringoptionalOnly items in this carton.
querystringoptionalPartial match on item number or description.
items_detailsbooleanoptionalAdd item_details.
epcsbooleanoptionalAdd recorded EPCs.
palletsbooleanoptionalAdd pallets.
cartonsbooleanoptionalAdd cartons.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/bols/items?location=$LOCATION&bol_number=<bol_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404Not FoundCould not find Bol with that number
Notes
  • item_details is null unless items_details is true. epcs[].rssi is always 100.

GET

Get Bols Masters

/api/v1/bols/masters
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
querystringoptionalPartial match on master BOL number.
bolsbooleanoptionalInclude the BOLs of each master BOL.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/bols/masters?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
GET

Get Bols Pallets

/api/v1/bols/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
bol_numberstringrequiredBOL number.
item_numberstringoptionalOnly pallets containing this item; also switches the response to item totals.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/bols/pallets?location=$LOCATION&bol_number=<bol_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404Not FoundCould not find Bol with that number
Notes
  • GET /api/v1/bols/pallets and GET /api/v1/bols/items/pallets are the same endpoint.

  • With item_number, total_items_count/total_assets_count are replaced by that item's expected_count and recorded_count:

    {"pagination": {…}, "expected_count": 8, "recorded_count": 32, "pallets": [ … ]}

POST

Post Bols Pallets

/api/v1/bols/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "BOL pallet data received and saved in cloud"
}

Errors

HTTPTypeMessage
404Exceptions::BolNotFoundBol with the number not found
404Exceptions::PalletNotFoundPallet with the number not found
404Exceptions::BolItemNotFoundYou should provide items to collect in a pallet
404Exceptions::BolCartonNotFoundBol Carton with the number not found
404Exceptions::BolItemNotFoundBol Item in the Carton not found
Notes
  • 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) as type.

POST

Post Master Bols

/api/v1/bols/masters/bols
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The received BOL(s) added to the master BOL"
}

Errors

HTTPTypeMessage
404Exceptions::MasterBolNotFoundMaster Bol not found
404Exceptions::BolNotFoundProvide bols for adding to the master bol
404Exceptions::BolNotFoundBol not found
Notes
  • 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) as type.

DELETE

Remove Bol

/api/v1/bols/masters/bols
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
master_bol_numberstringrequiredMaster BOL number.
bol_numberstringrequiredBOL to remove from it.

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The received BOL removed from the master BOL"
}

Errors

HTTPTypeMessage
404Exceptions::MasterBolNotFoundMaster Bol not found
404Exceptions::BolNotFoundBol not found
DELETE

Remove Pallet

/api/v1/bols/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (selects the tenant data set).
bol_numberstringrequiredBOL number.
pallet_numberstringrequiredPallet to delete.

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "BOL pallet deleted"
}

Errors

HTTPTypeMessage
404NOT_FOUNDCould not find Bol with that number
404NOT_FOUNDCould not find Pallet with that number
Notes
  • Unlinks all EPCs on the pallet from the BOL, deletes the pallet and recalculates the BOL status.

Handheld Mode APIs

Catalog

GET

Get Catalog Attributes

/api/v1/catalogs/attributes
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
attributestringrequiredCatalog column title as configured in UI settings (case-insensitive), e.g. Size or Item Type.
querystringoptionalPartial match on the value.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/catalogs/attributes?attribute=<attribute>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "pagination": {
    "current_page": 1,
    "per_page": 10,
    "total_entries": 3
  },
  "values": [
    {
      "value": "S"
    },
    {
      "value": "M"
    },
    {
      "value": "L"
    }
  ]
}

Errors

HTTPTypeMessage
400ERRORThe chosen field is not a good match
Notes
  • Returns the distinct non-empty values of that catalog column, sorted.

GET

Get Catalog Items Mappings

/api/v1/catalog/items/mappings
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/catalog/items/mappings" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Returns all item-number mappings for the tenant. The location parameter is not applied.

GET

Get Catalogs Location Filtered Items

/api/v1/catalogs/location_filtered_items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/catalogs/location_filtered_items?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "exclude": false,
  "catalog_items_count": 235384,
  "items": [
    "000000006630",
    "000000006638"
  ]
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
Notes
  • 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).

Handheld Mode APIs

Check-Out / Check-In (COCI)

DELETE

COCI: Delete a Transaction

/api/v1/coci/transactions
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
transaction_idintegerrequiredTransaction id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/coci/transactions?location=$LOCATION&transaction_id=<transaction_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "message": "Transaction deleted"
}

Errors

HTTPTypeMessage
404TRANSACTION_NOT_FOUNDThe transaction information does not exist in the system
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Deletes the transaction and all of its items.

GET

COCI: Get CheckIn Data

/api/v1/coci/checkins
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
customer_idintegeroptionalOnly this customer's check-ins.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/coci/checkins?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
GET

COCI: Get CheckOut Data

/api/v1/coci/checkouts
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
customer_idintegeroptionalOnly this customer's check-outs.
active_checkoutsbooleanoptionaltrue = only items that are still checked out.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/coci/checkouts?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
GET

COCI: Get List of Transactions

/api/v1/coci/transactions
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalSearch text (transaction id, customer, etc.).
itemsbooleanoptionaltrue includes each transaction's items.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/coci/transactions?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Newest first. datetime uses MM/DD/YY hh:mm AM/PM; updated_at includes seconds and a four-digit year.

GET

COCI: Get List of Users&Customers

/api/v1/coci/customers
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalExact match on id, first name, last name, company number, email or mobile.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/coci/customers?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Newest first. query must match a field exactly.

POST

COCI: Upload Transactions Data

/api/v1/coci/transactions
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "CheckOut data received and saved in cloud"
}

Errors

HTTPTypeMessage
404CUSTOMER_NOT_FOUNDThe customer information does not exist in the system
422REQUEST_EXISTSThe information for this request has already been saved and is duplicate
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • id is your request id, used to detect duplicates. transaction_type is checkout or checkin.

  • 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_EXISTS is returned. Don't retry with the same id after a success.

Handheld Mode APIs

EOS

GET

Get EOS Transfer Order Data

/api/v1/eos/transfers/orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredSource location code (also accepted as source_location or store_code).
querystringoptionalPartial match on id, document number, reference number, or item fulfillment number (NetSuite item-fulfillment tenants).
order_typestringoptionalTO or RTV.
itemsbooleanoptionalDefault true; false returns empty items arrays.
items_detailsbooleanoptionalAdd item_details to each item.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/eos/transfers/orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDthe location 001 not found
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Returns transfers whose source is location, ordered by status, then newest first.

  • item_details.price is the item's retail price formatted with two decimals; in_stock counts the item's EPCs whose status is included in inventory.

Handheld Mode APIs

EPCs & Tags

POST

Assign EPC List to an Item

/api/v1/epcs/assign
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The tags received and saved in cloud"
}

Errors

HTTPTypeMessage
404ITEM_NOT_EXISTSThis item does not exist in the catalog
404<exception class><exception message>
Notes
  • 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.

POST

Collect Assets by Tags Attributes

/api/v1/epcs/collect_tags
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
Notes
  • 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.

POST

Collect Tags

/api/v1/epcs/collect
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • 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 true to include item_details (otherwise null).

  • An unknown location falls back to the tenant's first location.

POST

Create Marker Tags

/api/v1/epcs/markertags
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The markers tags received and saved in cloud"
}

Errors

HTTPTypeMessage
404INVALIDThe marker tags is not present
404INVALIDThe Epc is not valid
Notes
  • 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.

POST

Encode EPC

/api/v1/epcs/encode
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "item_number": "000000006638",
  "preserve_serial_number": false,
  "epcs": [
    {
      "epc": "FED0000000067B80000002F2",
      "tid": "FED0000000067B80000002F2"
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "epcs": [
    {
      "old_epc": "FED0000000067B80000002F2",
      "new_epc": "FED0000000067B80000002F4",
      "tid": "FED0000000067B80000002F2"
    }
  ]
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Item# is not found, in the Catalog. Please add to catalog and retry
404NOT_FOUNDYour location is not found
Notes
  • 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: true keeps the serial number decoded from the old EPC instead of assigning the next one.

GET

EPC Information

/api/v1/epcs/info
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
epcstringrequiredEPC.
items_detailsbooleanoptionaltrue adds item_details.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/info?location=$LOCATION&epc=<epc>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDThe requested location not found. Please try again
404EPC_NOT_FOUNDThe requested EPC not found. Please try again
Notes
  • last_seen uses the format MM/DD/YY - hh:mm AM/PM. item_details is null unless items_details is true.

  • item_details.in_stock is currently always 0 in this endpoint.

GET

Get EPC Categories

/api/v1/epcs/categories
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
querystringoptionalPartial match on the category name or any parent category name.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 300.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/categories" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • name is 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

Get EPC Statuses

/api/v1/epcs/statuses
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/statuses" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Returns the tenant's statuses sorted by name, excluding statuses hidden from asset details. name is the display name.

GET

Get Whitelist EPC

/api/v1/epcs/whitelist
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
statusstringoptionalStatus name; default Sold.
datedateoptionalOnly tags updated on or after this date; default 6 months ago.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/whitelist?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
[
  "FED0000000067A40000002F1",
  "FED0000000067980000002EF",
  "FED0000000067B80000002F4"
]

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
Notes
  • Returns a plain array of EPCs with the given status (default Sold) updated since date. Used by theft-detection readers to ignore sold items.

POST

Import EPC

/api/v1/epcs/import
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "item_number": "000000006638",
  "alt_serial": "",
  "epcs": [
    {
      "old_epc": "FED0000000067B80000002F2",
      "new_epc": "FED0000000067B80000002F4",
      "tid": "FED0000000067B80000002F2"
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "Items are imported successfully"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Item# is not found, in the Catalog. Please add to catalog and retry
404NOT_FOUNDYour location is not found
Notes
  • 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.

GET

Item Data

/api/v1/epcs/item
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: taken from the URL).
item_numberstringoptionalItem number. Also matches ALU or SKU when the handheld setting item search using main catalog attributes is on.
epcstringoptionalEPC or alt serial (used when item_number is not sent).
show_epcbooleanoptionalInclude the EPC list (epcs).
show_all_epcsbooleanoptionalWith epc: include all in-inventory EPCs of the same item.
include_in_inventorybooleanoptionalWith item_number: only EPCs whose status counts toward inventory.
statusstringoptionalWith item_number: only EPCs with this status name.
detailbooleanoptionalAdd extra EPC fields and a ui_settings object.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/item?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Send item_number or epc.

  • If the item is not in the catalog, item.id is -1 and item.name is Not in Catalog (other text fields contain placeholder values).

  • in_stock is the sum of current_units of the returned EPCs.

GET

Items List

/api/v1/epcs/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringoptionalLocation code; falls back to the first location.
querystringoptionalSpace-separated words; each must partially match number, description, UPC, ALU, SKU, style, size, colour or manufacturer.
item_numberstringoptionalExact item number.
related_itemsbooleanoptionalWith item_number: also return items whose SKU shares the same prefix (before -).
show_epcsbooleanoptionalInclude each item's in-inventory EPCs.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/items" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Sorted by item number. Without query and item_number, all catalog items are returned (paginated).

  • epcs_count and epcs include only EPCs whose status counts toward inventory.

GET

Marker Tags EPCs

/api/v1/epcs/markertags
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringoptionalLocation code; falls back to the first location.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/epcs/markertags" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Sorted by the numeric part of the marker name. item_number is the catalog item whose description is "marker tag" (empty if none).

POST

Update EPC Status

/api/v1/epcs/status_update
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>
Request-IdOptional idempotency key; a repeated value within 10 seconds returns 409 DUPLICATE_REQUEST.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "epc_tags": [
    {
      "id": 3339,
      "epc_id": "FED0000000067B80000002F2",
      "asset_id": "754",
      "status": {
        "id": 7582,
        "name": "Live"
      }
    }
  ]
}

Errors

HTTPTypeMessage
404STATUS_NOT_FOUNDThe Status is not found
404LOCATION_NOT_FOUNDThe Store is not found. Please enter store code
409DUPLICATE_REQUESTA record with this request_id has already been processed
Notes
  • 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_registry flags request this for statuses that allow it).

Handheld Mode APIs

Geiger

GET

Get Handheld Geiger Records

/api/v1/geigers
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
uploadedbooleanoptionaltrue = only lists created by upload; false = only lists created on the handheld.
assetsbooleanoptionalfalse returns empty assets arrays.
items_detailsbooleanoptionaltrue fills item_details (otherwise {}).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/geigers?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
Notes
  • Returns the open Geiger lists (no geiger_date yet) of the calling handheld, newest first. Times use lowercase am/pm.

POST

Upload Geiger Inventory Data

/api/v1/geigers
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Received Geiger data are saved in cloud"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
404NOT_FOUNDThe Geiger is not found. Please enter store code
Notes
  • geiger_id: 0 creates a new list; otherwise the existing list is updated (assets are matched by EPC). geiger_date defaults to now.

  • Each known tag's last_seen is 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

Delete Geiger List

/api/v1/geigers
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
geiger_idintegerrequiredGeiger list id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/geigers?location=$LOCATION&geiger_id=<geiger_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "error": {
    "message": "The Geiger list removed"
  }
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Geiger list not found.
400NOT_FOUNDSomething went wrong, please try again later
Notes
  • On success the confirmation is returned inside an error object with HTTP 200 (as shown).

GET

Get Geiger List Items

/api/v1/geigers/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
geiger_idintegerrequiredOpen Geiger list id of the calling handheld.
items_detailsbooleanoptionalFill item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/geigers/items?location=$LOCATION&geiger_id=<geiger_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
404NOT_FOUNDThe Geiger list not found.
Notes
  • Pages through the assets of one open Geiger list of the calling handheld.

Handheld Mode APIs

Inventory

POST

Audit Inventory Requests

/api/v1/inventories/requests/audits
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "Inventory request audit information received and saved in cloud"
}

Errors

HTTPTypeMessage
404REQUEST_NOT_FOUNDThe request #866375 not found
404HANDHELD_NOT_FOUNDHandheld not found
404ITEMS_BLANKThe array of items is blank
400ITEMS_NOT_MATCHEDNone of the items were matched
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • 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_seen uses MM/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[].override does the same for one item. user (email) is recorded as the auditor; override_user and override_reason are stored with a request-level override.

  • The request becomes completed when every item is complete, otherwise pending. Notification emails are sent, plus an exception email when configured thresholds are exceeded.

POST

Create Inventory Request by Zone Filtering

/api/v1/inventories/requests/create_by_zones
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Inventory request created and saved in cloud"
}

Errors

HTTPTypeMessage
400ZONES_BLANKThe array of zones is blank
400PARENT_ZONE_NOT_FOUNDThe parent zone for sub zone ID 4 not found
400SUB_ZONES_NOT_FOUNDThe sub zones 4, 5, 16 not found
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • 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.

POST

Fix Invalid EPCs

/api/v1/inventories/fix_invalid_epcs
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The invalid tag(s) have been fixed in the inventory"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400INVALID_EPCThe invalid tag(s) C000C30E4F9BA290000015B are invalid
404NOT_FOUNDThe invalid tag(s) C000C30E4F9BA290000005B9 not found in the inventory
400ERROR<exception message>
Notes
  • 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

Get Categories List

/api/v1/inventories/categories
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalPartial match on category name.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 30.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/categories?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
Notes
  • Sorted by name. senitron_total_qty is the in-inventory quantity in Senitron; external_total_qty is the quantity imported from the external system (Lightspeed import); last_validation is the last Upload Inventory Validation Data time (hour without a leading zero).

GET

Get Category Items

/api/v1/inventories/categories/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
categorystringrequiredCategory name (exact).
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 30.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/categories/items?location=$LOCATION&category=<category>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
404CATEGORY_NOT_FOUNDCategory not found!
Notes
  • external_count is the quantity read from the customer's external system; senitron_count is the in-inventory quantity in Senitron.

POST

Get Filtered Inventory Assets

/api/v1/inventories/assets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code (query string or body).
itemsbooleanoptionalDefault true; false returns an empty items array.
items_detailsbooleanoptionalAdd item_details.
orderstringoptionalitem_number (default), name or epc (by last seen).
order_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Request body

JSON
{
  "location": "001",
  "device_name": "HH-53",
  "filters": [
    {
      "name": "Asset ID",
      "values": [
        {
          "value": "2100000003243"
        }
      ]
    },
    {
      "name": "UPC",
      "values": [
        {
          "value": 34300000434
        },
        {
          "value": 77569000219
        }
      ]
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
Notes
  • 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_qty in each entry is the total number of matching assets (same as summary.assets).

POST

Get Filtered Inventory Items

/api/v1/inventories/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code (query string or body).
itemsbooleanoptionalDefault true; false returns an empty items array.
items_detailsbooleanoptionalAdd item_details with quantities.
in_stockbooleanoptionalOnly items that have in-inventory tags.
include_in_inventorybooleanoptionalDefault true; which statuses count (statuses marked display in group always count).
virtual_tagbooleanoptionalCount only virtual tags (alt serial virtual tag).
zone_groupingbooleanoptionalAdd a zones array with quantities per zone.
operatorstringoptionalor = match the first filter's first value against UPC/ALU/SKU/number.
external_systembooleanoptionalAdd the external system's (EOS) quantity to item_details.
integration_typestringoptionalWith external_system: lightspeed, shopify, netsuite, acumatica or vend (default: the tenant's integration).
async_modebooleanoptionalWith external_system: run the quantity download in the background and return a job (see notes).
job_idstringoptionalWith async_mode: your own job id (generated if empty).
device_idstringoptionalWith async_mode: device id stored with the job.
orderstringoptionalitem_number (default), name or epc (by last seen).
order_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
Notes
  • 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 with external_system=true; external_system_zone is {"id", "name"} for Acumatica, otherwise null. zones appears only with zone_grouping=true.

  • With async_mode=true (and external_system=true) the call returns immediately with a job envelope and pushes progress over the EOS::Integration::EventChannel websocket:

    {"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

Get Invalid EPCs

/api/v1/inventories/invalid_epcs
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (or store_code).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/invalid_epcs?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
Notes
  • 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

Get Inventory Adjustments

/api/v1/inventories/reports/adjustments
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
querystringoptionalPartial match on item number, reason, reason details or reference number.
date_fromstringoptionalMM/DD/YYYY or YYYY-MM-DD, in the location's time zone.
date_tostringoptionalMM/DD/YYYY or YYYY-MM-DD (inclusive).
items_detailsbooleanoptionalAdd item_details.
assetsbooleanoptionalAdd the affected assets.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/reports/adjustments?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Newest first. datetime is in the location's time zone. item_details.created_at/updated_at use MM/DD/YYYY hh:mm AM/PM.

GET

Get Inventory Discrepancies

/api/v1/inventories/discrepancies
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/discrepancies?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—Unknown location (HTTP 404, no error body)
Notes
  • Compares Senitron quantities with the last external-system import (Compare page) and always returns these seven groups; pagination is fixed. Use an identifier with Get Inventory Discrepancy Details.

  • Each call recalculates the differences first.

GET

Get Inventory Discrepancy Details

/api/v1/inventories/discrepancy
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
identifierstringrequiredDISCREPANCY, IMPORT, MORE_DISCREPANCY or LESS_DISCREPANCY.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 30.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/discrepancy?location=$LOCATION&identifier=<identifier>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422IDENTIFIER_NOT_FOUNDDiscrepancy Identifier not found. Please try again
404—Unknown location (HTTP 404, no error body)
Notes
  • For IMPORT, items are catalog items with RFID tags that are missing from the import (external_count is 0).

GET

Get Inventory Settings

/api/v1/inventories/settings
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (or store_code).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/settings?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
Notes
  • Returns the tenant's EPC encoding settings: one entry in prefixes per prefix of each enabled EPC profile.

  • stack_epcs is returned inverted from the web setting (true when stacking is disabled there).

  • location_restriction lists the locations (code, name) the profile is limited to; empty means all locations.

GET

Get Inventory Types

/api/v1/inventories/types
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalPartial match on the type name (sorts by name).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/types?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
GET

Get Inventory Uploads List

/api/v1/inventories/reports/uploads
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
statusstringoptionalpending, scheduled, completed or canceled.
created_atdateoptionalMM/DD/YYYY; uploads created on that day.
user_namestringoptionalPartial match on user name.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/reports/uploads?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
Notes
  • 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_qty sums units when storage units are enabled.

  • Use the upload id as process_id in Request an Action on Inventory Upload Files.

GET

Get List of inventory requests

/api/v1/inventories/requests
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
request_numberstringoptionalExact request number.
querystringoptionalPartial match on id, request number, title, note, document number or reference number.
itemsbooleanoptionalDefault true; false returns empty items arrays.
show_epcbooleanoptionalInclude each item's EPCs.
items_detailsbooleanoptionalAdd item_details to each item.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/requests?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Newest first.

POST

Inventory Items Assets by Filter

/api/v1/inventories/items/assets
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
include_in_inventorybooleanoptionaltrue = only tags whose status counts toward inventory.
in_stockbooleanoptionaltrue = only items that have in-inventory tags.
orderstringoptionalitem_number (default) or name.
order_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1 (pages of items).
per_pageintegeroptionalDefault 10.

Request body

JSON
{
  "location": "001",
  "filters": [
    {
      "name": "Asset ID",
      "values": [
        {
          "value": "210000045065"
        },
        {
          "value": "210000027611"
        }
      ]
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key or Token
Notes
  • 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, UPC and SKU. Values match exactly (case-insensitive).

  • summary: skus = matching items, tags_count = their tags, assets = sum of tag units.

POST

Post Inventory Requests Items Scans

/api/v1/inventories/requests/scans
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "The request scan data received successfully"
}

Errors

HTTPTypeMessage
404REQUEST_NOT_FOUNDThe request #6504190 not found
404HANDHELD_NOT_FOUNDHandheld not found
404ITEMS_BLANKThe array of items is blank
400ITEMS_NOT_MATCHEDNone of the items were matched
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • 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_qty becomes 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.

POST

Request a action on inventory upload files

/api/v1/inventories/reports/uploads/action
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "process_id": 10,
  "action_type": "cancel",
  "user": "api@senitron.net",
  "user_name": "API User",
  "device_name": "HH-53"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The requested action accepted"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
404—Unknown process_id (HTTP 404, no error body)
Notes
  • 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.

GET

Return The Inventory Uploads

/api/v1/inventories/uploads
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/uploads?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
Notes
  • Lists V2-processed inventory uploads, newest first. type is full-cyclecount when the upload overrode quantities by category, zone and manufacturer; otherwise cyclecount.

  • processing_time is in seconds. status is Imported once processed, otherwise the upload status (e.g. Pending). datetime includes seconds.

POST

Save Inventory Settings

/api/v1/inventories/settings
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "user": "api@senitron.net",
  "device_name": "HH-53",
  "last_encoded_serial": 1029
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "Inventory settings received and saved in cloud"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
Notes
  • Only last_encoded_serial is saved (tenant-wide). The change is recorded in the event log with user and device_name.

POST

Sync Inventory Items to External System

/api/v1/inventories/items/sync_es
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The item(s) will sync to the external system."
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
404ITEM_NOT_FOUNDThe items not set
404ITEM_NOT_FOUNDThe item(s) not found. [210000002301]
404INTEGRATION_NOT_FOUNDThe integration not found
404INTEGRATION_NOT_FOUNDThe integration type xyz not found
404INTEGRATION_FAILEDAnother sync is in progress
422SYNC_NOT_ENABLEDSync to NetSuite is not enabled
Notes
  • 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, quickbook or acumatica. The integration must be enabled for the tenant.

  • sync_field_name: Asset ID (item number, default) or UPC — which catalog field items[].item_number contains. Every item must exist.

  • zone.name is used by Acumatica only. email_notification: true sends 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.

POST

Upload Inventory Validation Data

/api/v1/inventories/validation
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Inventory validation data received and saved in cloud"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
422EMPTYThe list of items is empty!
Notes
  • category must be an existing category name; an unknown name returns HTTP 404 without an error body.

  • Saves a validation record (shown as last_validation in Get Categories List) and queues an inventory upload of the scanned EPCs, processed in the background.

  • override_quantity_by_category defaults to true: tags of the category that were not scanned are treated as missing.

  • datetime format: MM/DD/YYYY hh:mm AM/PM (ISO 8601 also accepted).

POST

Upload Shelf-Tags

/api/v1/inventories/containertags
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The container tags received and saved in cloud"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message or Lightspeed/NetSuite push results>
Notes
  • 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 send alt_serial (use "" when none); omitting it causes an error.

  • When user (email) is a known user and both qty and adjust_qty are sent, an external-system inventory adjustment is recorded.

  • update_external_system: true pushes qty to Lightspeed, or adjust_qty to NetSuite; push errors return HTTP 400 with the push results.

POST

Upload The Inventory Data

/api/v1/inventories/upload
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "All EPCs are saved in inventory",
  "inventory_log_id": 123
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
403NOT_ACCESSThe handheld doesn't access to the store
400ERROR<exception message>
Notes
  • 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 and segment_number = 1…n. Parts are combined and processed after the last one arrives. Omit segment_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.

GET

Zones List

/api/v1/inventories/zones
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
querystringoptionalPartial match on zone or sub-zone name.
nestedbooleanoptionaltrue returns zones with their sub_zones (see notes).
filtered_zone_idsstringoptionalComma-separated parent zone ids.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault: all rows.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/zones?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
401UNAUTHORIZEDInvalid API key or Token
Notes
  • 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

Get Brands (Manufacturers)

/api/v1/inventories/brands
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalPartial match on manufacturer.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/brands?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "pagination": {
    "current_page": 1,
    "per_page": 10,
    "total_entries": 2
  },
  "brands": [
    {
      "name": "Adidas"
    },
    {
      "name": "Hoka"
    }
  ]
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
Notes
  • Distinct non-empty catalog manufacturers, sorted.

GET

Get Item Type Items

/api/v1/inventories/types/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
idintegerrequiredItem type id (from Get Inventory Types).
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/inventories/types/items?location=$LOCATION&id=<id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
404NOT_FOUNDItem Type with ID not found
Notes
  • senitron_count is the in-inventory quantity; external_count is the last imported external-system quantity.

Handheld Mode APIs

Items

POST

Create New Item

/api/v1/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The item received and saved in catalog"
}

Errors

HTTPTypeMessage
409ITEM_IS_EXISTSThis item already exists with this number!
Notes
  • 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 to Regular.

  • categories: id: 0 creates (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

Get Item Number

/api/v1/items/number
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringoptionalLocation code (default: first location).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/items/number" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "item_number": "10857335004993"
}

Errors

HTTPTypeMessage
404<exception class><exception message>
Notes
  • Returns the next free numeric item number (current maximum + 1), padded to the tenant's item-number length. The number is not reserved.

GET

Get Items Bin List

/api/v1/items/bins
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
bin_number_fieldstringoptionalCatalog column holding the bin number (e.g. attr3); default: the handheld setting Bin number catalog field.
bin_numberstringoptionalExact bin number.
querystringoptionalPartial match on bin number or item number.
sort_typestringoptionalasc or desc (default desc).
itemsbooleanoptionalInclude the items in each bin.
items_detailsbooleanoptionalWith items, add item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/items/bins" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404BIN_NUMBER_NOT_FOUNDBin number field or default column not found
404BIN_NUMBER_NOT_FOUNDBin number field is NOT valid
Notes
  • Lists distinct bin numbers from the bin field. summary.assets counts all tags of the bin's items. item_details is null unless items_details is true.

GET

Get Items List

/api/v1/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringoptionalLocation code (default: first location).
item_numberstringoptionalPartial match on item number.
querystringoptionalSpace-separated words; each must partially match number, UPC, ALU, SKU or description.
main_attributesbooleanoptionaltrue returns only number, upc, alu, sku and non_rfid_item.
sort_fieldstringoptionalCatalog column to sort by (e.g. number, description).
sort_typestringoptionalasc or desc (default desc).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 100.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/items" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • price and cost_price are both the item cost; total_qty sums tag units when storage units are enabled.

  • uom/uoms list the item's storage units (manufacturing tenants only).

DELETE

Remove Item

/api/v1/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringoptionalLocation code (default: first location).
item_numberstringrequiredItem number to delete.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/items?item_number=<item_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "message": "The item deleted"
}

Errors

HTTPTypeMessage
404ITEM_NOT_FOUNDItem not found!
200NOT_DELETEDThe item has an issue in deleting, please try again later!
Notes
  • NOT_DELETED is returned with HTTP 200; check for the error key.

POST

Set Bin For Item

/api/v1/items/bins
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The item(s) assigned to bin# successfully"
}

Errors

HTTPTypeMessage
404ITEM_NOT_FOUNDThe items are empty!
404ITEM_NOT_FOUNDThese item(s) do not exist in catalog [X, Y]
404BIN_NUMBER_NOT_FOUNDBin number field or default column not found
404BIN_NUMBER_NOT_FOUNDBin number field is NOT valid
409CATALOG_UNIQUE_VIOLATIONAssigning this bin would duplicate a catalog number for this client (unique number per client).
Notes
  • 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.

PUT

Update Item

/api/v1/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The item updated and saved in catalog"
}

Errors

HTTPTypeMessage
404NOT_FOUNDCould not find Item with that number
404<exception class><exception message>
Notes
  • Matches the item by item.number. With update_only: true an unknown number returns NOT_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 to Regular.

  • categories: id: 0 creates (or reuses) a category by name; otherwise the id must exist.

  • picture: Base64-encoded JPEG; on update, "0" removes the picture.

DELETE

Delete Bin

/api/v1/items/bins
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
bin_number_fieldstringoptionalCatalog column holding the bin number (e.g. attr3); default: the handheld setting Bin number catalog field.
bin_numberstringrequiredBin number to clear.
locationstringoptionalLocation code (default: first location).

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/items/bins?bin_number=<bin_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "message": "The bin# deleted successfully"
}

Errors

HTTPTypeMessage
404BIN_NUMBER_NOT_FOUNDBin number field or default column not found
404BIN_NUMBER_NOT_FOUNDBin number field is NOT valid
Notes
  • Clears bin_number from every item that has it in the bin field.

GET

Get Warehouse Item Bins

/api/v1/items/warehouse/bins
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
item_numberstringoptionalCatalog search (number, ALU, SKU, …).
bin_numberstringoptionalBin number (% wildcard allowed).
items_detailsbooleanoptionalAdd item_details.
sort_fieldstringoptionalBin field to sort bins by (default bin_number).
sort_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 100.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/items/warehouse/bins?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Lists warehouse bin assignments (multiple bins per item, with pick order), grouped by item.

Handheld Mode APIs

NetSuite

GET

Get Netsuite Transfer-In Data

/api/v1/netsuite/transfers/in
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredDestination location code.
transfer_numberstringoptionalSenitron transfer id (exact).
querystringoptionalPartial match on id, document number, reference number or item fulfillment number.
itemsbooleanoptionalDefault true; false returns empty items arrays.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/netsuite/transfers/in?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDthe location 001 not found
Notes
  • Returns NetSuite transfers coming into the location, newest shipped first. status is always Pending.

  • item_details.price is the retail price formatted with two decimals; in_stock counts in-inventory EPCs of the item.

Handheld Mode APIs

Transfers

POST

Post Audit Transfer Data

/api/v1/transfers/audits
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 3424,
  "message": "Transfer audit information received and saved in cloud"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
422INVALID_ITEM_NUMBER<validation message>
422LOCATION_NOT_FOUND<validation message>
404—Unknown user email (HTTP 404, no error body)
Notes
  • 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

Get a Specific Audit Transfer Data

/api/v1/transfers/audits/{id}
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
idpathrequiredAudit id or transfer number.
locationstringrequiredLocation code.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 100.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfers/audits/<id>?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Returns every audit whose id or transfer number equals id, in the same shape as Get Audit Transfer Data.

  • In epcs, asset_id is the Senitron asset record id (a number, empty when the EPC is unknown), not the serial number.

GET

Get Audit Transfer Data

/api/v1/transfers/audits
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalSearch on id or transfer number.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 100; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfers/audits?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • In epcs, asset_id is the Senitron asset record id (a number, empty when the EPC is unknown), not the serial number.

  • status is the calculated audit result (e.g. matched).

GET

Get LightSpeed Transfer Data

/api/v1/transfers/eos
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code (or source_location).
transfer_numberstringrequiredLightspeed transfer id (digits).
items_detailsbooleanoptionalAdd item_details (catalog fields).
clearbooleanoptionalClear the cached scan state for this transfer.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfers/eos?location=$LOCATION&transfer_number=<transfer_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
200—{"message": "No transfer found!"} (HTTP 200)
404<exception class><exception message>
Notes
  • Reads the transfer live from Lightspeed (the tenant must have a Lightspeed integration). sent/received include 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

Get Transfer-Out Data

/api/v1/transfers/out
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL; also accepted as source_location or store_code).
querystringoptionalPartial match on id, document number or reference.
statusstringoptionalComma-separated: pending, partially_received, received, undo.
sn_idintegeroptionalSenitron transfer id.
items_detailsbooleanoptionalAdd item_details to each asset group.
assetsbooleanoptionalfalse returns empty assets arrays.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfers/out?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Lists transfers whose source is location.

  • Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither query nor status is sent, fully received transfers are left out.

  • status is the display status; api_status is the raw transfer status. transfer_date and received_date are returned as stored (format may vary by source).

GET

Get Transfer-In Data

/api/v1/transfers/in
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL; also accepted as source_location or store_code).
querystringoptionalPartial match on id, document number or reference.
statusstringoptionalComma-separated: pending, partially_received, received, undo.
sn_idintegeroptionalSenitron transfer id.
items_detailsbooleanoptionalAdd item_details to each asset group.
assetsbooleanoptionalfalse returns empty assets arrays.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfers/in?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Lists transfers whose destination is location.

  • Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither query nor status is sent, fully received transfers are left out.

  • status is the display status; api_status is the raw transfer status. transfer_date and received_date are returned as stored (format may vary by source).

POST

Merge the Transfers

/api/v1/transfers/merge
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "user": "api@senitron.net",
  "device_name": "HH-53",
  "base_transfer": 27843,
  "merged_transfers": [
    13654,
    194834
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "messages": "The selected transfers have been merged successfully"
}

Errors

HTTPTypeMessage
404TRANSFER_NOT_FOUNDBase transfer ID not found
404NOT_FOUNDNo valid merged transfers
400BAD_REQUEST<exception message>
Notes
  • 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.

POST

Transfer Receiving

/api/v1/transfers/receiving
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 3424,
  "message": "The transfer receiving data has been received, and a job has been scheduled to process it"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
404NOT_FOUNDThe destination store is not found. Please enter store code
404NOT_FOUNDEPC Tags are not found. Please enter valid EPC Tags
404TRANSFER_EXISTSA transfer exists with the same document and reference number!
422ITEM_FULFILLMENT_REQUIREDThe item fulfillment number (eos_item_fulfillment_number) is required for this transfer.
422ITEM_FULFILLMENT_NOT_FOUNDThe item fulfillment IF-6712 does not belong to this transfer.
Notes
  • One-step transfer: creates the transfer slip from the scanned items and receives it at destination_location; receiving runs in the background.

  • TRANSFER_EXISTS also returns the existing transfer id. 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.

POST

Transfer Zone

/api/v1/transfers/zone
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Transfer assets to new zone is successful"
}

Errors

HTTPTypeMessage
404ZONE_NOT_FOUNDThe zone 1 was not found
404<exception class><exception message>
Notes
  • Moves the tags to sub-zone zone.id (static zone). Unknown EPCs are added to inventory first (last_seen must 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.

POST

Upload Transfer-Out Data

/api/v1/transfers/out
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)
Request-IdOptional idempotency key; repeating it within 5 minutes returns 409 DUPLICATE_REQUEST.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
404NOT_FOUNDThe destination store is not found. Please enter store code
404NOT_FOUNDThe EOS transfer is not found with the reference number: 700007132
422TRANSFER_EXISTSA transfer exists with the same document and reference number!
422INVALID_DATAInvalid Items. All items were marker tags.
404NOT_FOUNDEPC Tags are not found. Please enter valid EPC Tags
409DUPLICATE_REQUESTA record with this request_id has already been processed
Notes
  • 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 FFFFFFFFFFFFFFFFFFFFFFFF with 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_number selects the item fulfillment for NetSuite transfer orders.

POST

Upload Transfer-In Data

/api/v1/transfers/in
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)
Request-IdOptional idempotency key; repeating it within 5 minutes returns 409 DUPLICATE_REQUEST.

Request body

JSON
{
  "id": 68855,
  "device_name": "HH-53",
  "push_qty_to_eos": true,
  "assets": [
    {
      "item_number": "00000000001",
      "epcs": [
        {
          "epc": "EF9C30000000004000000253",
          "qty": 1
        }
      ]
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "Transfer-in confirmed data received and saved in cloud"
}

Errors

HTTPTypeMessage
404TRANSFER_COMPLETEDTransfer-slip has been completed, if you have a problem please contact with support
422TRANSFER_ERROR<exception message>
409DUPLICATE_REQUESTA record with this request_id has already been processed
Notes
  • 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.

POST

Retry Transfer-In Push to External System

/api/v1/transfers/in/retry
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "location": "002",
  "id": 68855,
  "device_name": "HH-53"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "processing",
  "message": "Transfer-in is processing"
}

Errors

HTTPTypeMessage
404TRANSFER_NOT_FOUNDTransfer not found
404LOCATION_NOT_FOUNDLocation not found
Notes
  • 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.

Handheld Mode APIs

Packing

DELETE

Delete Packing Box Items

/api/v1/packings/boxes/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The box item(s)/tag(s) deleted successfully!"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
200USER_NOT_FOUNDUser not found
200HANDHELD_NOT_FOUNDHandheld not found
200SO_NOT_FOUNDThe picking list not exists!
200PACKING_NOT_FOUNDPacking not found
422ITEM_NOT_FOUNDitem# 210000001207 not found
422EPC_NOT_FOUNDitem# 210000001207: EPC … not found
422ERRORbox# 4 not found
Notes
  • 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

Post Packing Box Items

/api/v1/packings/boxes/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The box item(s)/tag(s) received and saved in cloud!"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
200USER_NOT_FOUNDUser not found
200HANDHELD_NOT_FOUNDHandheld not found
200SO_NOT_FOUNDThe picking list not exists!
422PACKING_QTY_EXCEEDEDitem# 210000001207: Packing qty exceeded
422EPC_EXISTSitem# 210000001207: EPC C000C30E4F9B8B7000000453 already exists
422ERROR<exception message>
Notes
  • 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 000000000000000000000000 for 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.

Handheld Mode APIs

Picking

DELETE

Delete Picking SO List

/api/v1/pickings/lists
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
list_idintegerrequiredPick list id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/pickings/lists?location=$LOCATION&list_id=<list_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "message": "The pikcing list is deleted successfully"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
200SO_NOT_FOUNDThe picking list not exists!
200ERRORSomething went wrong, please try again later!
Notes
  • Deletes the pick list and all of its items.

  • The success message is returned exactly as shown (including the spelling pikcing).

GET

Get Pick Lists (Packing)

/api/v1/pickings/packing_lists
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
list_idintegeroptionalExact list id.
querystringoptionalPartial match on id, SO number, shipment number or title.
statusstringoptionalcreated, picking or completed (an unknown value returns no lists).
sort_fieldstringoptionalDefault id.
sort_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.
boxesbooleanoptionalInclude packed boxes (with items and tags).
picked_tagsbooleanoptionalInclude all picked tags (picked_tags).
items_detailsbooleanoptionalAdd item_details to box items.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/pickings/packing_lists?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
Notes
  • Pick lists with their packing progress (expected, picked, packed).

  • Times use MM/DD/YYYY HH:mm AM/PM with a 24-hour hour (e.g. 13:05 PM).

GET

Get Picking Lists

/api/v1/pickings/lists
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
list_idintegeroptionalExact list id.
querystringoptionalPartial match on id, SO number, shipment number or title.
statusstringoptionalcreated, picking or completed (an unknown value returns no lists).
sort_fieldstringoptionalDefault id.
sort_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.
itemsbooleanoptionalInclude items.
tagsbooleanoptionalInclude each item's picked tags.
items_detailsbooleanoptionalAdd item_details.
items_marker_tagsbooleanoptionalAdd item_marker_tags (maker_tag, repeat_count).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/pickings/lists?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
Notes
  • status is derived from the non-overridden items: created (nothing picked), picking, or completed (all picked). Overridden items are counted in overriden.

  • Times use MM/DD/YYYY HH:mm AM/PM with a 24-hour hour (e.g. 13:05 PM).

POST

Post Pick List Items

/api/v1/pickings/items
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "All the pick list item(s)/tag(s) received and saved in cloud"
}

Errors

HTTPTypeMessage
200SO_NOT_FOUNDThe list not found
200ITEM_NOT_FOUNDItem(s) not found in current list: 210000001207
200USER_NOT_FOUNDUser not found
200HANDHELD_NOT_FOUNDHandheld not found
404LOCATION_NOT_FOUNDLocation not found!
200ITEM_PICKEDThe item# 210000001207 picked before and can't be updated with this quantity 10
200EPC_ERROR["item# 210000001207: EPC … is used before"] (with message "Some of the pick list item(s)/tag(s) received and saved in cloud")
Notes
  • Without advanced picking (handheld setting) only items[].qty is used. With advanced picking each tags[] entry is recorded and the quantity is the sum of tags[].qty.

  • The picked quantity cannot exceed the expected quantity (ITEM_PICKED, nothing is saved). override: true clears the item's picked tags and marks it overridden with override_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 the error key.

DELETE

Delete Pick List Item Tags

/api/v1/pickings/items/tags
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Request body

JSON
{
  "location": "001",
  "user": "api@senitron.net",
  "device_name": "HH-53",
  "list_id": 123,
  "items": [
    {
      "item_number": "210000001207",
      "tags": [
        {
          "epc": "C000C30E4F9B8B7000000453"
        }
      ]
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The pick list item tag(s) has been deleted."
}

Errors

HTTPTypeMessage
200SO_NOT_FOUNDThe list not found
200ITEM_NOT_FOUNDItem(s) not found in current list: 210000001207
200USER_NOT_FOUNDUser not found
200HANDHELD_NOT_FOUNDHandheld not found
404LOCATION_NOT_FOUNDLocation not found!
200EPC_ERROR["item# 210000001207: EPC … not found"]
Notes
  • 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 the error key.

Handheld Mode APIs

Purchase Orders

GET

Get List of Purchase Orders

/api/v1/purchase_orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
po_numberstringoptionalExact PO number.
querystringoptionalPartial search on PO number, title, note, document or reference number, vendor.
itemsbooleanoptionalInclude items.
epcsbooleanoptionalWith items, include received EPCs.
items_detailsbooleanoptionalWith items, add item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/purchase_orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Without po_number or query, fully received purchase orders are excluded. Sorted by PO date, newest first.

  • Dates use MM/DD/YY hh:mm AM/PM. total is always 0.0.

  • General mode: /{tenant-code}/{location}/api/v1/purchase_orders/... with api_key; Handheld mode: location parameter and the handheld token.

POST

PO Audit Data

/api/v1/purchase_orders/audits
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Purchase order auditing request queued for processing."
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
404PURCHASE_ORDER_NOT_FOUNDThe purchase order 'PO0011529' could not be found.
422AUDITING_VALIDATION_ERROROne or more data validations failed during auditing.
500AUDITING_PROCESSING_ERRORAn unexpected error occurred during purchase order auditing.
Notes
  • The audit is queued and processed in the background. override: true replaces previous audit results.

  • Validation and processing errors also include a details field.

  • General mode: /{tenant-code}/{location}/api/v1/purchase_orders/... with api_key; Handheld mode: location parameter and the handheld token.

POST

PO Receiving Data

/api/v1/purchase_orders/receivings
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Purchase order receiving request queued for processing."
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
404PURCHASE_ORDER_NOT_FOUNDThe purchase order 'PO0011529' could not be found.
409DUPLICATE_ASSET_RECEIVINGSome of the scanned assets have already been received in another purchase order.
422RECEIVING_VALIDATION_ERROROne or more data validations failed during receiving.
500RECEIVING_PROCESSING_ERRORAn unexpected error occurred during purchase order receiving.
Notes
  • 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 409 with an items array showing the other po_number per 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 details field.

  • General mode: /{tenant-code}/{location}/api/v1/purchase_orders/... with api_key; Handheld mode: location parameter and the handheld token.

Handheld Mode APIs

Sales

POST

Audit Sales

/api/v1/sales/audits
Also at POST /{tenant-code}/{location}/api/v1/sales/audits
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Sales audit information received and saved in cloud"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location #001 not found
404TRANSACTION_NOT_FOUNDThe transaction #866375 not found
Notes
  • 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: true marks the item as overridden instead of audited.

  • The order status becomes Completed when every non-overridden item is fully audited, otherwise Pending.

GET

Get List of sales

/api/v1/sales
Also at GET /{tenant-code}/{location}/api/v1/sales
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
transaction_numberstringoptionalExact transaction number.
querystringoptionalPartial search on transaction number, title, note, document or reference number.
itemsbooleanoptionalInclude items.
epcsbooleanoptionalWith items, include read EPCs.
items_detailsbooleanoptionalWith items, add item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/sales?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location #001 not found
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Returns sales orders (transaction type Sale). Dates use MM/DD/YY hh:mm AM/PM; transaction_date is the record creation time.

Handheld Mode APIs

Shipping

DELETE

Delete a Carton

/api/v1/shipping/inbound/cartons
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
carton_numberstringrequiredCarton number.
userstringrequiredUser email.
device_namestringoptionalHandheld name (logged).

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The carton has been deleted"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETERCarton number is required
400MISSING_PARAMETERUser is required
400NOT_FOUNDCarton with number 10000000004520000044 not found
400INVALID_STATUSCannot update a cancelled receiving order
400INTERNAL_ERROR<exception message>
Notes
  • Deletes the carton and its items from its receiving order (found by carton number). All errors return HTTP 400.

GET

Get New Carton Number

/api/v1/shipping/inbound/carton_number
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
order_idintegerrequiredReceiving order id.
device_namestringoptionalHandheld name (logged).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping/inbound/carton_number?location=$LOCATION&order_id=<order_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "carton": {
    "id": 151,
    "carton_number": "10000000004520000044",
    "carton_sequence_number": 44
  }
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETEROrder ID is required
400NOT_FOUNDReceiving order with ID 452 not found
400INVALID_STATUSCannot update a cancelled receiving order
400INTERNAL_ERROR<exception message>
Notes
  • 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

Get Receiving Orders (Inbound)

/api/v1/shipping/inbound/receiving_orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
asn_numberstringoptionalASN number (exact, % wildcards allowed).
container_numberstringoptionalContainer number.
po_numberstringoptionalPO number.
reference_numberstringoptionalReference number.
querystringoptionalPartial match on ASN, container number, vendor code, vendor name or reference number.
is_openbooleanoptionaltrue hides received orders (ignored when a number filter or query is sent).
itemsbooleanoptionalInclude items.
cartonsbooleanoptionalInclude cartons.
assetsbooleanoptionalInclude received assets.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping/inbound/receiving_orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
Notes
  • Cancelled orders are never returned. Newest first. The top-level summary covers all matching orders, not just the page.

POST

Set or Clear the Non-RFID Item Flag

/api/v1/shipping/inbound/non_rfid_items
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The non-RFID flag was successfully set for the item(s)."
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETEROrder ID is required
400MISSING_PARAMETERUser is required
400MISSING_PARAMETERItems are required
400MISSING_PARAMETERNon-RFID item flag is required
400ORDER_NOT_FOUNDThe specified order does not exist.
400INVALID_STATUSCannot update a cancelled receiving order
400INVALID_STATUSCannot update a completed receiving order
400NOT_FOUNDUser with email api@senitron.net not found
400ITEMS_NOT_FOUNDNone of the specified items exist on the receiving order.
400INTERNAL_ERROR<exception message>
Notes
  • Sets (non_rfid_item: true) or clears (false) the non-RFID flag on the listed item numbers of the order. With false the message says "cleared".

  • All errors return HTTP 400.

POST

Upload Receiving Data

/api/v1/shipping/inbound/receiving_orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Carton data received and saved in cloud"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETEROrder ID is required
400MISSING_PARAMETERCarton number is required
400MISSING_PARAMETERUser is required
400MISSING_PARAMETERItems are required
400NOT_FOUNDReceiving order with ID 24 not found
400INVALID_STATUSCannot update a cancelled receiving order
400INVALID_STATUSCannot update a completed receiving order
400NOT_FOUNDUser with email api@senitron.net not found
400INTERNAL_ERROR<exception message>
Notes
  • Records the scanned items of one carton (carton_number or carton_sequence_number). Non-RFID items use EPC FFFFFFFFFFFFFFFFFFFFFFFF with 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

Get Shipping Methods

/api/v1/shipping_methods
Also at GET /{tenant-code}/{location}/api/v1/shipping_methods
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (or store_code).
integration_typestringrequiredMust be netsuite; other values return an empty list.
querystringoptionalPartial match on the shipping method name.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping_methods?location=$LOCATION&integration_type=<integration_type>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Client is not found. Please enter API Key
404NOT_FOUNDThe Store is not found. Please enter store code
Notes
  • Reads the shipping methods (ship items) live from NetSuite for the location's subsidiary. total_entries is the number of methods on the returned page.

Handheld Mode APIs

Temp Transfers

POST

Upload Temp Transfer Order Data

/api/v1/temp_transfers
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 23213,
  "message": "Temporary transfer information has been saved successfully."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERNo assets to transfer
422MISSING_PARAMETERdevice_name is required
422NOT_FOUNDUser is required
422NOT_FOUNDThe source location 001 not found
422NOT_FOUNDThe destination location 002 not found
422FORBIDDENUser does not belong to this client
422PROCESSING_ERROR<exception message>
Notes
  • 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 id returned. 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.

Handheld Mode APIs

Transfer Orders

GET

Get Carton Number

/api/v1/transfer_orders/cartons/new_number
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfer_orders/cartons/new_number?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "number": "3366",
  "epc": "F11C00000000000000003366"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Reserves and returns the tenant's next carton number. epc is F11C followed by the number padded to 20 digits.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

GET

Get Container Number

/api/v1/transfer_orders/containers/new_number
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfer_orders/containers/new_number?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "number": "72491",
  "epc": "F11A00000000000000072491"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Reserves and returns the tenant's next container number. epc is F11A followed by the number padded to 20 digits.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

GET

Get Pallet Number

/api/v1/transfer_orders/pallets/new_number
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfer_orders/pallets/new_number?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "number": "5598",
  "epc": "F11B00000000000000005598"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Reserves and returns the tenant's next pallet number. epc is F11B followed by the number padded to 20 digits.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

GET

Get Transfers Orders

/api/v1/transfer_orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).
transfer_typestringoptionalIN or OUT relative to the location.
transfer_idintegeroptionalTransfer id.
querystringoptionalPartial search on id, document number, reference number.
from_locationstringoptionalSource location code.
to_locationstringoptionalDestination location code.
shipped_date_fromdateoptionalMM/DD/YYYY.
shipped_date_todateoptionalMM/DD/YYYY.
statusstringoptionale.g. pending, partially_received, received.
is_openbooleanoptionaltrue hides received/closed transfers.
transfer_detailsbooleanoptionalInclude containers/pallets/cartons/items.
items_detailsbooleanoptionalAdd item_details.
assets_detailsbooleanoptionalInclude assets.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10, maximum 100.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/transfer_orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422INTERNAL_ERROR flatInternal server error
Notes
  • Newest first. per_page is capped at 100.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

POST

Get/Print Carton Labels

/api/v1/transfer_orders/cartons/print_labels
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
422PRINTER_NOT_FOUNDThe printer not found
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Builds the ZPL label for the carton on printer printer_id and returns it in payload. With print: true the label is also sent to the printer; with false the handheld can print the payload itself.

  • When called with the API key, user (email) identifies the user.

POST

Upload Transfer Order Data

/api/v1/transfer_orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe source location 001 not found
422LOCATION_NOT_FOUND flatThe destination location 002 not found
422TRANSFER_ORDER_EXISTSA transfer order with the same DOC# or REF# already exists
422DUPLICATE_TRANSFER_IDThe Transfer ID 72491 already exists, and the transfer could not be created.
422PERMISSION_DENIED flatYou have view-only access. Import is not permitted.
422PROCESSING_ERROR flat<message>
422INTERNAL_ERROR flatInternal server error
Notes
  • 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_number and at least one transfer order with containers. Invalid payloads currently return INTERNAL_ERROR.

  • pdf is returned when printer_id is set; carton_labels when carton_label.printer_id is set (with carton_label.print: true the labels are also printed).

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

POST

Upload Transfer Order Receiving Data

/api/v1/transfer_orders/receivings
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Transfer order receiving information has been saved successfully"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location #001 not found
422TRANSFER_NOT_FOUND flatThe transfer #3423 not found
422TRANSFER_ALREADY_RECEIVED flatThis transfer has already been completely received and cannot be processed again
422INTERNAL_ERROR flatInternal server error
Notes
  • Receives transfer id at location; processing runs in the background.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

POST

Merge the Transfer Orders

/api/v1/transfer_orders/merge
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "user": "api@senitron.net",
  "device_name": "HH-53",
  "base_transfer": 27843,
  "merged_transfers": [
    13654,
    194834
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The selected transfers have been merged successfully"
}

Errors

HTTPTypeMessage
422INVALID_PARAMS flatbase_transfer is required
422INVALID_PARAMS flatAt least one merged_transfer is required
422TRANSFER_NOT_FOUND flatBase transfer #27843 not found
422NO_VALID_TRANSFERS flatNo valid transfers to merge. Invalid transfers are ignored.
422INVALID_PARAMS flatuser is required (provide user email when using API key authentication)
422PERMISSION_DENIED flatYou have view-only access. Import is not permitted.
422PROCESSING_ERROR flatFailed to merge transfer orders
Notes
  • 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 error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

Handheld Mode APIs

Wave Orders & Picking (WOP)

POST

Assign a Wave Order to an User

/api/v1/wop/picking/orders/assign
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "location": "001",
  "user": "api@senitron.net",
  "user_name": "API User",
  "device_name": "HH-53",
  "wave_id": 28
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The wave order has been assigned to the specified user."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422VALIDATION_ERRORThe 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.
422INTERNAL_ERRORFailed to assign wave order
Notes
  • Assigns wave order wave_id to user. Allowed only while the order is created or firmed, 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

Delete Pick List Item Assets

/api/v1/wop/picking/orders/items/assets
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The wave order picking asset(s) have been deleted."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422MISSING_PARAMETERitems array is required
422INTERNAL_ERRORFailed to delete picking assets
Notes
  • 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

Delete Wave Orders Picking Items

/api/v1/wop/picking/orders/items
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Item(s) removed from wave order successfully."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422MISSING_PARAMETERitems array is required
422VALIDATION_ERRORWave order status must be created or firmed or picking
422INTERNAL_ERRORFailed to remove item from wave order
Notes
  • Removes items from a wave order in status created, firmed or picking. remove_action defaults to add_to_chase_list when add_to_chase_list: true, otherwise undo_wave; items[].reason is 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

Get Wave Orders Picking List

/api/v1/wop/picking/orders
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).
wave_idintegeroptionalExact wave order id.
querystringoptionalPartial match on id, title or reference number.
statusstringoptionalcreated, firmed, picking, picked, …
assigned_tostringoptionalUser email, or nobody for unassigned orders.
is_openbooleanoptionaltrue = only firmed or picking orders.
itemsbooleanoptionalInclude items.
assetsbooleanoptionalWith items, include picked assets.
items_zonesbooleanoptionalWith items, include item_zones.
items_detailsbooleanoptionalWith items, add item_details.
sort_fieldstringoptionalDefault id.
sort_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10, maximum 100; 0 = 100.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/wop/picking/orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422LOCATION_NOT_FOUNDThe location 001 not found
422INVALID_STATUSInvalid status: done
422INVALID_EMAILInvalid email format: abc
422USER_NOT_FOUNDUser not found with email: x@example.com
422INTERNAL_ERRORInternal server error
Notes
  • Each order adds bulk_customer and a customer object (id, code, name). Transfer-mode wave orders also include reference_details with 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_page is capped at 100.

GET

Get WOP Settings

/api/v1/wop/settings
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Query parameters

NameTypeDescription
locationstringrequiredLocation code (General mode: from the URL).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/wop/settings?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Returns the tenant's Wave Order Picking settings and modes. Missing statuses or zones are returned with id 0 and empty names.

POST

POST Wave Orders Picking Items

/api/v1/wop/picking/orders/items
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The wave order picking item(s)/asset(s) have been received and saved in the cloud."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422MISSING_PARAMETERitems array is required
422VALIDATION_ERRORWave order has already been picked
422EPC_ALREADY_PICKEDThe EPC has already been picked in WO# 27 for item# 210000006265
422INTERNAL_ERRORFailed to save picking data
Notes
  • Records picked assets for the wave order items. Unknown EPCs are created from the EPC profile. assets[].last_seen and assets[].zone.id update 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.

Handheld Mode APIs

Settings

GET

Get Handheld Settings

/api/v1/settings
Handheld modeToken + API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)
Api-Key<tenant api key>

Query parameters

NameTypeDescription
locationstringoptionalLocation code; selects location-specific values (e.g. main integration).
device_idintegeroptionalDevice id; selects the app build for current_version.
modelstringoptionalHandheld model key (overrides device_id).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/settings" \
  -H "Authorization: $SENITRON_TOKEN" \
  -H "Api-Key: $SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key
401UNAUTHORIZEDInvalid Token
Notes
  • Requires both the Api-Key header and the Authorization token.

  • 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

Get Locations

/api/v1/settings/locations
Also at GET /{tenant-code}/api/v1/settings/locations
Handheld modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login) — or Api-Key: <tenant api key>

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/settings/locations" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
Notes
  • With a token: the locations assigned to the calling handheld. With api_key: all locations of the tenant. Sorted by code.

  • assigned_to_user is true when the logged-in user has access to the location; eos_location_id is the external-system location id.

GET

Get UI Settings (Column Labels)

/api/v1/settings/ui
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/settings/ui" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • 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

Get App Version

/api/v1/version
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
device_idintegeroptionalDevice id; selects the app build for the device model.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/version" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Returns the latest handheld app version for the device's model and whether the app should check for updates.

Handheld Mode APIs

Users

GET

Get Users

/api/v1/users
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringoptionalLocation code.
user_idintegeroptionalExact user id.
user_emailstringoptionalExact email.
pin_numberstringoptionalExact PIN.
querystringoptionalMatch on email, first or last name (use % as a wildcard).
permissionsbooleanoptionalAdd warehouse-role permissions.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/users" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • Lists the tenant's users. Only one filter is applied, in this order: user_id, user_email, pin_number, query. permissions is null unless requested.

Handheld Mode APIs

External System Quantities

POST

Request External Quantities Download

/api/v1/external/inventory/quantities
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "location": "001",
  "device_id": 51,
  "item_number": [
    "210000047060"
  ],
  "category": [
    "Tops"
  ],
  "brand": [],
  "style": [],
  "type": []
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "OK",
  "job_id": "ext_quantity_download_67_12_51_1791320000"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
404NO_INTEGRATIONThe client has no external integration
422BLANK_REQUESTNo values in payload
500SYSTEM<exception message>
Notes
  • 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).

POST

Compare External Quantities with Scan

/api/v1/external/inventory/quantities/compare
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "location": "001",
  "job_id": "ext_quantity_download_67_12_51_1791320000",
  "inventory_log_id": 86877
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "OK",
  "job_id": "ext_quantity_download_67_12_51_1791320000"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
404NO_INTEGRATIONThe client has no external integration
200—{"status": "DOES_NOT_EXIST", "job_id": "…"}
500SYSTEM<exception message>
Notes
  • 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 item sn_quantity, ext_quantity, difference and scan_quantity. The Compare-page import table is updated too.

  • Lightspeed tenants only (the tenant must have a Lightspeed integration).

GET

Get External Quantities Job Status

/api/v1/external/inventory/quantities/status
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
job_idstringrequiredJob id (also accepted as id).

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/external/inventory/quantities/status?location=$LOCATION&job_id=<job_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
200SYSTEM<exception message>
Notes
  • status is Not Found for unknown job ids.

POST

Sync Quantities to External System

/api/v1/external/inventory/sync
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "location": "001",
  "job_id": "ext_quantity_download_67_12_51_1791320000",
  "item_numbers": [
    "210000047060",
    "210000047061"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "OK",
  "sync_id": "ls_sync_1791320100",
  "message": "Initiated"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
200—{"status": "busy", "message": "Another Job in progress, try later"}
200SYSTEM<sync errors or exception message>
Notes
  • 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).

Handheld Mode APIs

Pallet Build

POST

Pallet Build EPCs Info

/api/v1/shipping/pb/epcs/info
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "location": "001",
  "epcs": [
    "C000C30E4F9B40200000063F",
    "C000C30E4F9B402000000640"
  ],
  "page": 1,
  "per_page": 100
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Returns the listed EPCs that are currently packed in a Pallet Build carton (not returned), with their carton.

POST

Pallet Build Return and Unallocate

/api/v1/shipping/pb/epcs/return
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The EPCs received successfully as return and unallocate"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • 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

Get Pallet Build Purchase Orders

/api/v1/shipping/pb/purchase_orders
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
po_numberstringoptionalExact PO number.
bol_numberstringoptionalExact BOL number.
querystringoptionalExact PO, BOL, master BOL, reference or DC number, or partial carton number.
cartonsbooleanoptionalInclude each PO's cartons.
carton_numberstringoptionalWith po_number/bol_number: filter cartons.
dc_numberstringoptionalWith po_number/bol_number: filter by DC.
alias_carton_numberstringoptionalWith po_number/bol_number: filter by alias carton number.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping/pb/purchase_orders?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • Pallet Build purchase orders (from imported carton waves), most recently updated first, with BOL, DC and carton progress.

GET

Get Pallet Build Cartons

/api/v1/shipping/pb/cartons
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
carton_numberstringoptionalCarton or alias carton number.
cartons_in_same_pobooleanoptionalWith carton_number: return all cartons of that carton's PO.
pallet_idintegeroptionalCartons on this pallet.
alias_carton_numberstringoptionalAlias carton number.
querystringoptionalExact carton, BOL, PO, master BOL, reference, DC number or pallet id.
po_numberstringoptionalPO number.
dc_numberstringoptionalDC number.
upcstringoptionalCartons containing this UPC.
statusstringoptionalincomplete, completed, deleted, …
updated_from_last_minsintegeroptionalOnly cartons updated in the last N minutes.
itemsbooleanoptionalInclude carton items.
items_epcsbooleanoptionalWith items: include recorded EPCs.
items_detailsbooleanoptionalWith items: add item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping/pb/cartons?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • po_cartons, bol_cartons and dc_cartons counts are filled only when searching by carton_number (or by po_number + dc_number + upc).

POST

Upload Pallet Build Carton

/api/v1/shipping/pb/cartons
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Carton Data received and saved in cloud"
}

Errors

HTTPTypeMessage
404CARTON_NOT_FOUNDNo carton exists with carton number: 00008879860012617423
404Exceptions::CartonDeletedErrorThis Carton is deleted, You can not upload content
404Exceptions::CountMatchErrorTags Count do not match the Carton Expected quantity
404Exceptions::DuplicateEpcErrorThere is a duplicate epc which is recorded before: C000C30E4F9B40200000063F
404<exception class><exception message>
Notes
  • 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, or manager_user_id).

  • check_duplicate_epcs: true rejects 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

Delete Pallet Build Carton

/api/v1/shipping/pb/cartons
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
carton_numberstringrequiredCarton number.
handheld_namestringoptionalHandheld name (logged).

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/shipping/pb/cartons?location=$LOCATION&carton_number=<carton_number>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "message": "Carton Deleted"
}

Errors

HTTPTypeMessage
404<exception class><exception message> (e.g. unknown carton)
Notes
  • Marks the carton as deleted and logs it.

GET

Create Pallet

/api/v1/shipping/pb/pallets/new
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping/pb/pallets/new?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "pallet": {
    "id": 32
  }
}

Errors

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Creates a new empty pallet (status incomplete) and returns its id. Note: this is a GET that creates data.

GET

Get Pallets

/api/v1/shipping/pb/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
pallet_idintegeroptionalPallet id.
querystringoptionalExact pallet id or BOL/PO/master BOL/reference/carton number of a carton on it.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/shipping/pb/pallets?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404<exception class><exception message>
Notes
  • Pallets that are not deleted, most recently updated first.

POST

Upload Pallet

/api/v1/shipping/pb/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Pallet Data received and saved in cloud"
}

Errors

HTTPTypeMessage
404<exception class><exception message> (e.g. unknown pallet)
Notes
  • Adds cartons with action: "new" to the pallet and removes cartons with action: "delete".

DELETE

Delete Pallet

/api/v1/shipping/pb/pallets
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
pallet_idintegerrequiredPallet id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/api/v1/shipping/pb/pallets?location=$LOCATION&pallet_id=<pallet_id>" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "message": "Pallet Deleted"
}

Errors

HTTPTypeMessage
404<exception class><exception message>
Notes
  • Removes all cartons from the pallet and marks it deleted.

POST

Move Cartons Between Pallets

/api/v1/shipping/pb/pallets/move
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The carton(s) moved successfully"
}

Errors

HTTPTypeMessage
404PalletNotFoundSource pallet 31 not found
404PalletNotFoundDestination pallet 40 not found
404<exception class><exception message>
Notes
  • destination_pallet_id: 0 creates a new pallet. With remove_empty_source_pallet: true an emptied source pallet is deleted.

POST

Print Pallet Label

/api/v1/shipping/pb/pallets/print
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "location": "001",
  "pallet_id": 31,
  "printer_id": 5,
  "count": 1,
  "add_to_inventory": true
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "Pallet label printed"
}

Errors

HTTPTypeMessage
404Exceptions::PalletNotFoundPallet with the number not found
404<exception class><exception message>
Notes
  • Prints count (default 1) pallet labels in the background. add_to_inventory (default true) adds the pallet's EPC to inventory as Live.

Handheld Mode APIs

Scan & Print

GET

Get Printers (Scan & Print)

/api/v1/scanprints/printers
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalPartial match on printer name.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/scanprints/printers?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Visible printers of the location, sorted by name. template is the printer's ZPL label template.

POST

Scan & Print Labels

/api/v1/scanprints/print
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)
Request-IdOptional idempotency key; a repeated id returns 409 DUPLICATE_REQUEST.

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404ITEM_NOT_FOUNDThe item was not found. Please enter correct item number / alu / sku / upc / ean / custom_sku
422PRINTING_DISABLEDThe printing functionality has been disabled for this item
404PRINTER_NOT_FOUNDPrinter not found. Please enter correct printer id
422NON_RFID_ITEMThis item is marked as Non-RFID and cannot be printed
400PRINTER_TEMPLATE_ERRORError generating ZPL from template, check template code: …
400INTERNAL_ERROR<exception message>
409DUPLICATE_REQUESTA record with this request_id has already been processed
Notes
  • 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_number is stored as the alt serial.

  • print: true (or a CDM printer) sends the job to the printer; print: false only returns the payload so the handheld can print it.

  • add_to_inventory: true creates 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" with serial_number_from / serial_number_to.

GET

Get Print History

/api/v1/scanprints/history
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Query parameters

NameTypeDescription
locationstringrequiredLocation code.
querystringoptionalPartial match on item number or alt serial.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/scanprints/history?location=$LOCATION" \
  -H "Authorization: $SENITRON_TOKEN"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid Token
Notes
  • Serial print jobs of the location, newest first. datetime is ISO 8601.

POST

Bulk Print Labels

/api/v1/scanprints/bulk_print
Handheld modeToken

Request headers

HeaderValue
Content-Typeapplication/json
Authorization<token> (from Login)

Parameters

NameTypeDescription
locationstringrequiredLocation code.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found
404PRINTER_NOT_FOUNDThe selected printer is not valid. Please select a new printer
400ITEMS_NOT_FOUNDNo item sent
400USER_NOT_FOUNDUser not found
400ITEMS_NOT_FOUNDNone of the sent items exist. Please try agian
422—{"message": "Something went wrong, Please try again later!"}
Notes
  • Prints qty labels for each item (item number, ALU, SKU, …) on printer_id. user must be an existing user email.

  • Without result: true the response is {"message": "The print job scheduled successfully"}. With result: true and print: false the jobs run in the background (same message).

  • With result: true and print: true the labels are printed now and the response lists each job's tags and ZPL payloads (this can take a while for large quantities).

03

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.

186 endpoints · 44 groups
General Mode APIs

EPCs & Tags

GET

Item Data

/{tenant-code}/{location}/api/v1/epcs/item
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: taken from the URL).
item_numberstringoptionalItem number. Also matches ALU or SKU when the handheld setting item search using main catalog attributes is on.
epcstringoptionalEPC or alt serial (used when item_number is not sent).
show_epcbooleanoptionalInclude the EPC list (epcs).
show_all_epcsbooleanoptionalWith epc: include all in-inventory EPCs of the same item.
include_in_inventorybooleanoptionalWith item_number: only EPCs whose status counts toward inventory.
statusstringoptionalWith item_number: only EPCs with this status name.
detailbooleanoptionalAdd extra EPC fields and a ui_settings object.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epcs/item?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store is not found. Please enter store code
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Send item_number or epc.

  • If the item is not in the catalog, item.id is -1 and item.name is Not in Catalog (other text fields contain placeholder values).

  • in_stock is the sum of current_units of the returned EPCs.

GET

Decoding EPC and Return Asset and Item Info

/{tenant-code}/api/v1/epcs/decode
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
epcstringrequiredEPC to decode.
item_detailsbooleanoptionaltrue adds item_details (when the item exists).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/epcs/decode?api_key=$SENITRON_API_KEY&epc=<epc>"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
400INVALID_EPCThe provided EPC is not valid
400MISSING_EPC_PROFILEThere is no matching profile for the provided EPC
Notes
  • 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_mapping reflects the Shopify integration's custom price mapping setting.

POST

Update EPC Status

/{tenant-code}/{location}/api/v1/epcs/status_update
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json
Request-IdOptional idempotency key; a repeated value within 10 seconds returns 409 DUPLICATE_REQUEST.

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "epc_tags": [
    {
      "id": 3339,
      "epc_id": "FED0000000067B80000002F2",
      "asset_id": "754",
      "status": {
        "id": 7582,
        "name": "Live"
      }
    }
  ]
}

Errors

HTTPTypeMessage
404STATUS_NOT_FOUNDThe Status is not found
404LOCATION_NOT_FOUNDThe Store is not found. Please enter store code
409DUPLICATE_REQUESTA record with this request_id has already been processed
Notes
  • 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_registry flags request this for statuses that allow it).

General Mode APIs

Alerts

GET

Get an alert result based on EPC status

/{tenant-code}/{location}/api/v1/alerts/epc_status
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
epcstringrequiredEPC read at the exit.
device_idstringoptionalReader/antenna id; numeric values are used as the antenna id when marking the tag stolen (default 101).
strictbooleanoptionaltrue: unknown EPCs do not alarm.
timestringoptionalRead time (logged only).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/alerts/epc_status?api_key=$SENITRON_API_KEY&epc=<epc>"

Success response

JSONHTTP 200
{
  "alert": false
}

Errors

HTTPTypeMessage
404—{"alert": true} — alarm (HTTP 404 by design)
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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"}.

POST

Send Theft Email Alert

/{tenant-code}/{location}/api/v1/theft/email_alert
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "theft_epc_tags": [
    "CF19930E4FA6BD4000000432"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "response": "OK"
}

Errors

HTTPTypeMessage
404—{"response": "Alert Emails not set"}
200—{"response": "No tags with statuses to be present in invetory"}
Notes
  • Emails the location's Stolen alert recipients about the listed EPCs that are in inventory.

  • No authentication is checked.

General Mode APIs

Assets

GET

Get Assets

/{tenant-code}/{location}/api/v1/assets
Also at GET /{tenant-code}/{location}/api/v1/epcs/assets
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringoptionalLocation code. Falls back to the tenant's first location when missing or unknown.
querystringoptionalExact match on asset id (serial), record id, item number, EPC or alt serial.
serial_numbersstringoptionalComma-separated asset ids (serial numbers).
statusstringoptionalStatus name, e.g. Live.
zone_idsstringoptionalComma-separated sub-zone ids; matches the last-seen antenna or static zone.
include_in_inventorybooleanoptionaltrue = only assets whose status counts toward inventory.
items_detailsbooleanoptionaltrue adds an item_details object to each asset.
item_partsbooleanoptionalWith items_details, lists item parts (COCI tenants only).
main_attributesbooleanoptionaltrue returns only id, serial_number, item_number, alt_serial, epc, text3 and status.
summarybooleanoptionaltrue adds a summary object.
assetsbooleanoptionalfalse omits the asset list (returns "assets": []).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Dates use the location's time zone. first_seen, last_seen, created_at and updated_at use MM/DD/YY hh:mm AM/PM; handheld_last_seen uses a four-digit year.

POST

New Asset

/{tenant-code}/{location}/api/v1/assets
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"status": "error", "message": "The item number is not valid"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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 the error object.

GET

Get Asset

/{tenant-code}/{location}/api/v1/assets/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredAsset record id (in-inventory assets only).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets/<id>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"status": "error", "message": "The asset ID is not valid"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Same fields as New Asset (General).

PUT

Update Asset

/{tenant-code}/{location}/api/v1/assets/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredAsset record id (in-inventory assets only).

Request body

JSON
{
  "api_key": "<tenant api key>",
  "current_units": 2,
  "alt_serial": "1212-B",
  "attr1": "Room 4",
  "device_name": "HH-53"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
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"}
Notes
  • 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

Delete Asset (Kill Tag)

/{tenant-code}/{location}/api/v1/assets/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredAsset record id (in-inventory assets only).
device_namestringoptionalDevice name (logged).

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/assets/<id>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "message": "The asset deleted (tag killed) successfully"
}

Errors

HTTPTypeMessage
404—{"status": "error", "message": "The asset ID is not valid"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • The asset is not removed: its status is set to Tag Killed.

POST

Upload Asset Reads (State)

/{tenant-code}/{location}/api/v1/assets/update_state
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The asset state updates enqueued successfully"
}

Errors

HTTPTypeMessage
400—{"error": {"message": "<exception message>"}}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Queues raw reader reads (epc, rssi, antenna, timestamp) from reader devip for background processing (last seen / zone updates).

General Mode APIs

Catalog

GET

Get Catalog Items Mappings

/{tenant-code}/api/v1/catalog/items/mappings
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/catalog/items/mappings?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Returns all item-number mappings for the tenant. The location parameter is not applied.

General Mode APIs

EOS

GET

Get EOS Transfer Order Data

/{tenant-code}/{location}/api/v1/eos/transfers/orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredSource location code (also accepted as source_location or store_code).
querystringoptionalPartial match on id, document number, reference number, or item fulfillment number (NetSuite item-fulfillment tenants).
order_typestringoptionalTO or RTV.
itemsbooleanoptionalDefault true; false returns empty items arrays.
items_detailsbooleanoptionalAdd item_details to each item.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/eos/transfers/orders?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDthe location 001 not found
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Returns transfers whose source is location, ordered by status, then newest first.

  • item_details.price is the item's retail price formatted with two decimals; in_stock counts the item's EPCs whose status is included in inventory.

POST

Import Items QTY in Compare Page

/{tenant-code}/{location}/api/v1/eos/import_qty
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "user": "api@senitron.net",
  "device_name": "",
  "override": false,
  "items": [
    {
      "item_number": "210000043012",
      "qty": 10
    },
    {
      "item_number": "210000056398",
      "qty": 4
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The item quantities have been imported successfully."
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key
Notes
  • Imports external-system quantities into the Compare page in the background (the response confirms the file was queued).

  • override: true replaces the whole Compare-page import table with these items; otherwise the listed items are added/updated.

General Mode APIs

EPC Settings

GET

Get EPC information

/{tenant-code}/{location}/api/v1/epc_settings
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_settings?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
401UNAUTHORIZEDInvalid API key
400ERROR<exception message>
Notes
  • Same EPC profile data as the handheld Get Inventory Settings, without the location restrictions: one entry per prefix of each enabled EPC profile.

POST

Update EPC information

/{tenant-code}/{location}/api/v1/epc_settings
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "item_number_padding": 12,
  "last_encoded_serial": 1115
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "Inventory settings received and saved in cloud"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
401UNAUTHORIZEDInvalid API key
400ERROR<exception message>
Notes
  • 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.

General Mode APIs

ERC

GET

Get list of the purchase orders

/{tenant-code}/{location}/api/v1/erc/purchase_orders
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
po_numberstringoptionalExact PO number.
querystringoptionalPartial match on PO number, vendor or zone name, or a status name.
date_fromstringoptionalYYYY-MM-DD or MM/DD/YYYY (PO date).
date_tostringoptionalYYYY-MM-DD or MM/DD/YYYY (inclusive).
itemsbooleanoptionalInclude items.
items_detailsbooleanoptionalAdd item_details.
assetsbooleanoptionalInclude received assets.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/erc/purchase_orders?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
401UNAUTHORIZEDInvalid API key
Notes
  • Returns ERC purchase-order receivings, newest PO date first.

General Mode APIs

Inventory

GET

Export items QTY in Compare Page

/{tenant-code}/{location}/api/v1/inventories/quantities
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
querystringoptionalPartial catalog search (item number, ALU, SKU, name …).
item_numberstringoptionalExact match on item number, ALU, SKU, UPC or EAN.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/quantities?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key
Notes
  • Returns in-inventory quantities per item at the location: tags_count (number of tags) and qty (sum of units).

GET

Get Assets

/{tenant-code}/{location}/api/v1/inventories/assets
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
querystringoptionalExact match on record id, asset id (serial), alt serial, item number or EPC.
item_numberstringoptionalExact item number.
alt_serialstringoptionalExact alt serial.
date_fromstringoptionalYYYY-MM-DD or MM/DD/YYYY; assets updated on/after.
date_tostringoptionalYYYY-MM-DD or MM/DD/YYYY; assets updated on/before.
main_attributesbooleanoptionalOnly id, serial_number, item_number, alt_serial, epc, text3, status.
manufacturingbooleanoptionalManufacturing view (qty, master tag, source, user…).
items_detailsbooleanoptionalWith manufacturing, add item_details.
historybooleanoptionalAdd the last zone movement and status change.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Returns only in-inventory assets of the location, ordered by id. Times are in the location's time zone.

GET

Get Inventory Adjustments

/{tenant-code}/{location}/api/v1/inventories/reports/adjustments
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
querystringoptionalPartial match on item number, reason, reason details or reference number.
date_fromstringoptionalMM/DD/YYYY or YYYY-MM-DD, in the location's time zone.
date_tostringoptionalMM/DD/YYYY or YYYY-MM-DD (inclusive).
items_detailsbooleanoptionalAdd item_details.
assetsbooleanoptionalAdd the affected assets.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/reports/adjustments?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Newest first. datetime is in the location's time zone. item_details.created_at/updated_at use MM/DD/YYYY hh:mm AM/PM.

GET

Inventory Assets Status Logs

/{tenant-code}/{location}/api/v1/inventories/assets/statuses/logs
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
querystringoptionalSearch on asset fields (id, serial, alt serial, item number, EPC).
filter_hoursintegeroptionalOnly changes in the last N hours.
sort_typestringoptionalasc (default) or desc by change time.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets/statuses/logs?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Each entry is one status change: last_status → current_status, with the user and reason.

POST

Inventory Items Assets by Filter

/{tenant-code}/{location}/api/v1/inventories/items/assets
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
include_in_inventorybooleanoptionaltrue = only tags whose status counts toward inventory.
in_stockbooleanoptionaltrue = only items that have in-inventory tags.
orderstringoptionalitem_number (default) or name.
order_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1 (pages of items).
per_pageintegeroptionalDefault 10.

Request body

JSON
{
  "location": "001",
  "filters": [
    {
      "name": "Asset ID",
      "values": [
        {
          "value": "210000045065"
        },
        {
          "value": "210000027611"
        }
      ]
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDLocation not found!
401UNAUTHORIZEDInvalid API key or Token
Notes
  • 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, UPC and SKU. Values match exactly (case-insensitive).

  • summary: skus = matching items, tags_count = their tags, assets = sum of tag units.

POST

New Assets

/{tenant-code}/{location}/api/v1/inventories/assets
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "The asset info saved successfully"
}

Errors

HTTPTypeMessage
404ASSET_NOT_FOUNDThe asset not found
404USER_NOT_FOUNDThe user api@senitron.net not found
404STATUS_NOT_FOUNDThe status Damaged not found
404ITEM_NOT_FOUNDThe item# not found
400SAVING_ERROR<validation messages>
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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: id 0 (or missing) = Live; otherwise matched by id, then by name.

  • asset.last_zone (sub-zone name) sets the last-seen antenna; asset.static_zone (<zone> <sub-zone>) sets the static zone.

POST

Push Request for Inventory to SN

/{tenant-code}/{location}/api/v1/inventories/requests
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "The request data saved successfully"
}

Errors

HTTPTypeMessage
400REQUEST_BLANKThe request number is blank
400ITEMS_BLANKThe array of items is blank
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

GET

Zones List

/{tenant-code}/{location}/api/v1/inventories/zones
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
querystringoptionalPartial match on zone or sub-zone name.
nestedbooleanoptionaltrue returns zones with their sub_zones (see notes).
filtered_zone_idsstringoptionalComma-separated parent zone ids.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault: all rows.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/zones?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe Store# is not found
400ERROR<exception message>
401UNAUTHORIZEDInvalid API key or Token
Notes
  • 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

Export Inventory (Email)

/{tenant-code}/api/v1/inventory_export
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringrequiredTenant API key (named key here).
emailstringrequiredRecipient of the export file.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/inventory_export?key=$SENITRON_API_KEY&email=<email>"

Success response

JSONHTTP 200
{
  "note": "HTTP 302 redirect back to the referring page"
}

Errors

HTTPTypeMessage
200—{"data": "No key provided"}
Notes
  • 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

Get Alt Serials

/{tenant-code}/{location}/api/v1/inventories/assets/alt_serials
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
include_in_inventorybooleanoptionalDefault true; false includes all statuses.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/assets/alt_serials?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  "1212",
  "A-1001",
  "virtual tag"
]

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Distinct non-empty alt serials of the location's assets (in-inventory only by default).

GET

Get Item Quantities by Bin

/{tenant-code}/{location}/api/v1/inventories/bin_item_qty
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
bin_groupingbooleanoptionaltrue groups by item and bin (static zone).
querystringoptionalWith grouping: bin name filter; otherwise catalog search.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventories/bin_item_qty?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • In-inventory tag count and quantity per item (and per bin with bin_grouping). bin is empty without grouping.

POST

Inventory Update (Bralco, gzip CSV)

/{tenant-code}/{location}/api/v1/inventory/inventory_update_bralco
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/gzip

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
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.gz

Success response

JSONHTTP 200
{
  "message": "Import enqueued"
}

Errors

HTTPTypeMessage
422—{"error": "<exception message>"}
401UNAUTHORIZEDInvalid API key
Notes
  • Customer-specific import. The body is a gzip-compressed CSV; it is processed in the background.

General Mode APIs

Lightspeed POS

GET

Get EPC info for POS

/{tenant-code}/{location}/api/v1/lightspeed/epc_tags/pos_show
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
epc_idstringrequiredEPC to look up.

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"status": "not_found", "message": "EPC Tag not in inventory"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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 the error object.

General Mode APIs

Transfer Orders

GET

Get Pallet Number

/{tenant-code}/{location}/api/v1/transfer_orders/pallets/new_number
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/pallets/new_number?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "number": "5598",
  "epc": "F11B00000000000000005598"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Reserves and returns the tenant's next pallet number. epc is F11B followed by the number padded to 20 digits.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

GET

Get Carton Number

/{tenant-code}/{location}/api/v1/transfer_orders/cartons/new_number
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/cartons/new_number?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "number": "3366",
  "epc": "F11C00000000000000003366"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Reserves and returns the tenant's next carton number. epc is F11C followed by the number padded to 20 digits.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

GET

Get Container Number

/{tenant-code}/{location}/api/v1/transfer_orders/containers/new_number
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders/containers/new_number?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "number": "72491",
  "epc": "F11A00000000000000072491"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Reserves and returns the tenant's next container number. epc is F11A followed by the number padded to 20 digits.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

GET

Get Transfers Orders

/{tenant-code}/{location}/api/v1/transfer_orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL; also accepted as store_code).
transfer_typestringoptionalIN or OUT relative to the location.
transfer_idintegeroptionalTransfer id.
querystringoptionalPartial search on id, document number, reference number.
from_locationstringoptionalSource location code.
to_locationstringoptionalDestination location code.
shipped_date_fromdateoptionalMM/DD/YYYY.
shipped_date_todateoptionalMM/DD/YYYY.
statusstringoptionale.g. pending, partially_received, received.
is_openbooleanoptionaltrue hides received/closed transfers.
transfer_detailsbooleanoptionalInclude containers/pallets/cartons/items.
items_detailsbooleanoptionalAdd item_details.
assets_detailsbooleanoptionalInclude assets.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10, maximum 100.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfer_orders?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422INTERNAL_ERROR flatInternal server error
Notes
  • Newest first. per_page is capped at 100.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

POST

Get/Print Carton Labels

/{tenant-code}/{location}/api/v1/transfer_orders/cartons/print_labels
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
422PRINTER_NOT_FOUNDThe printer not found
422LOCATION_NOT_FOUND flatThe location 001 not found
422INTERNAL_ERROR flatInternal server error
Notes
  • Builds the ZPL label for the carton on printer printer_id and returns it in payload. With print: true the label is also sent to the printer; with false the handheld can print the payload itself.

  • When called with the API key, user (email) identifies the user.

POST

Upload Transfer Order Data

/{tenant-code}/{location}/api/v1/transfer_orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe source location 001 not found
422LOCATION_NOT_FOUND flatThe destination location 002 not found
422TRANSFER_ORDER_EXISTSA transfer order with the same DOC# or REF# already exists
422DUPLICATE_TRANSFER_IDThe Transfer ID 72491 already exists, and the transfer could not be created.
422PERMISSION_DENIED flatYou have view-only access. Import is not permitted.
422PROCESSING_ERROR flat<message>
422INTERNAL_ERROR flatInternal server error
Notes
  • 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_number and at least one transfer order with containers. Invalid payloads currently return INTERNAL_ERROR.

  • pdf is returned when printer_id is set; carton_labels when carton_label.printer_id is set (with carton_label.print: true the labels are also printed).

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

POST

Upload Transfer Order Receiving Data

/{tenant-code}/{location}/api/v1/transfer_orders/receivings
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Transfer order receiving information has been saved successfully"
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUND flatThe location #001 not found
422TRANSFER_NOT_FOUND flatThe transfer #3423 not found
422TRANSFER_ALREADY_RECEIVED flatThis transfer has already been completely received and cannot be processed again
422INTERNAL_ERROR flatInternal server error
Notes
  • Receives transfer id at location; processing runs in the background.

  • Errors from this endpoint are returned without the error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

POST

Merge the Transfer Orders

/{tenant-code}/{location}/api/v1/transfer_orders/merge
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "user": "api@senitron.net",
  "device_name": "HH-53",
  "base_transfer": 27843,
  "merged_transfers": [
    13654,
    194834
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The selected transfers have been merged successfully"
}

Errors

HTTPTypeMessage
422INVALID_PARAMS flatbase_transfer is required
422INVALID_PARAMS flatAt least one merged_transfer is required
422TRANSFER_NOT_FOUND flatBase transfer #27843 not found
422NO_VALID_TRANSFERS flatNo valid transfers to merge. Invalid transfers are ignored.
422INVALID_PARAMS flatuser is required (provide user email when using API key authentication)
422PERMISSION_DENIED flatYou have view-only access. Import is not permitted.
422PROCESSING_ERROR flatFailed to merge transfer orders
Notes
  • 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 error wrapper: {"type": "LOCATION_NOT_FOUND", "message": "…"} (HTTP 422), except where shown with the wrapper below.

General Mode APIs

Purchase Orders

GET

Get List of Purchase Orders

/{tenant-code}/{location}/api/v1/purchase_orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
po_numberstringoptionalExact PO number.
querystringoptionalPartial search on PO number, title, note, document or reference number, vendor.
itemsbooleanoptionalInclude items.
epcsbooleanoptionalWith items, include received EPCs.
items_detailsbooleanoptionalWith items, add item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/purchase_orders?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Without po_number or query, fully received purchase orders are excluded. Sorted by PO date, newest first.

  • Dates use MM/DD/YY hh:mm AM/PM. total is always 0.0.

  • General mode: /{tenant-code}/{location}/api/v1/purchase_orders/... with api_key; Handheld mode: location parameter and the handheld token.

POST

PO Audit Data

/{tenant-code}/{location}/api/v1/purchase_orders/audits
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Purchase order auditing request queued for processing."
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
404PURCHASE_ORDER_NOT_FOUNDThe purchase order 'PO0011529' could not be found.
422AUDITING_VALIDATION_ERROROne or more data validations failed during auditing.
500AUDITING_PROCESSING_ERRORAn unexpected error occurred during purchase order auditing.
Notes
  • The audit is queued and processed in the background. override: true replaces previous audit results.

  • Validation and processing errors also include a details field.

  • General mode: /{tenant-code}/{location}/api/v1/purchase_orders/... with api_key; Handheld mode: location parameter and the handheld token.

POST

PO Receiving Data

/{tenant-code}/{location}/api/v1/purchase_orders/receivings
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Purchase order receiving request queued for processing."
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found or is not associated with your account.
404PURCHASE_ORDER_NOT_FOUNDThe purchase order 'PO0011529' could not be found.
409DUPLICATE_ASSET_RECEIVINGSome of the scanned assets have already been received in another purchase order.
422RECEIVING_VALIDATION_ERROROne or more data validations failed during receiving.
500RECEIVING_PROCESSING_ERRORAn unexpected error occurred during purchase order receiving.
Notes
  • 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 409 with an items array showing the other po_number per 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 details field.

  • General mode: /{tenant-code}/{location}/api/v1/purchase_orders/... with api_key; Handheld mode: location parameter and the handheld token.

General Mode APIs

Sales

POST

Push Sales Orders

/{tenant-code}/{location}/api/v1/sales
Also at POST /api/v1/sales
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Sales order information has been received and will be saved in the cloud"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location #001 not found
200—{"message": "The sales order #45001 already exists and has been completed; it can no longer be updated!"}
Notes
  • 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.

General Mode APIs

Manufacturing

POST

Create Sales Orders to Zones in Senitron

/{tenant-code}/{location}/api/v1/mf/sales_to_zones
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The sales order information has been received and will be stored in the cloud."
}

Errors

HTTPTypeMessage
422LOCATION_NOT_FOUNDThe location 001 not found
422VALIDATION_ERRORso_number is required; due_date is required; Item 1: Item not found: CTUB-20062
422PROCESSING_ERROR<messages>
422INTERNAL_ERRORAn unexpected error occurred while processing the request
401UNAUTHORIZEDInvalid API key
Notes
  • Required: so_number, due_date (MM/DD/YYYY), zone (id, or name when id is 0), customer (id, or name when 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 CS unit of measure. unit_weight can 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.

General Mode APIs

Shipping

DELETE

Delete a Carton

/{tenant-code}/{location}/api/v1/shipping/inbound/cartons
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
carton_numberstringrequiredCarton number.
userstringrequiredUser email.
device_namestringoptionalHandheld name (logged).

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The carton has been deleted"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETERCarton number is required
400MISSING_PARAMETERUser is required
400NOT_FOUNDCarton with number 10000000004520000044 not found
400INVALID_STATUSCannot update a cancelled receiving order
400INTERNAL_ERROR<exception message>
Notes
  • Deletes the carton and its items from its receiving order (found by carton number). All errors return HTTP 400.

GET

Get New Carton Number

/{tenant-code}/{location}/api/v1/shipping/inbound/carton_number
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
order_idintegerrequiredReceiving order id.
device_namestringoptionalHandheld name (logged).

Try it with curl

Shell
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

JSONHTTP 200
{
  "carton": {
    "id": 151,
    "carton_number": "10000000004520000044",
    "carton_sequence_number": 44
  }
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETEROrder ID is required
400NOT_FOUNDReceiving order with ID 452 not found
400INVALID_STATUSCannot update a cancelled receiving order
400INTERNAL_ERROR<exception message>
Notes
  • 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

Get Receiving Orders (Inbound)

/{tenant-code}/{location}/api/v1/shipping/inbound/receiving_orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
asn_numberstringoptionalASN number (exact, % wildcards allowed).
container_numberstringoptionalContainer number.
po_numberstringoptionalPO number.
reference_numberstringoptionalReference number.
querystringoptionalPartial match on ASN, container number, vendor code, vendor name or reference number.
is_openbooleanoptionaltrue hides received orders (ignored when a number filter or query is sent).
itemsbooleanoptionalInclude items.
cartonsbooleanoptionalInclude cartons.
assetsbooleanoptionalInclude received assets.
items_detailsbooleanoptionalAdd item_details.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/inbound/receiving_orders?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
Notes
  • Cancelled orders are never returned. Newest first. The top-level summary covers all matching orders, not just the page.

POST

Set or Clear the Non-RFID Item Flag

/{tenant-code}/{location}/api/v1/shipping/inbound/non_rfid_items
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The non-RFID flag was successfully set for the item(s)."
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETEROrder ID is required
400MISSING_PARAMETERUser is required
400MISSING_PARAMETERItems are required
400MISSING_PARAMETERNon-RFID item flag is required
400ORDER_NOT_FOUNDThe specified order does not exist.
400INVALID_STATUSCannot update a cancelled receiving order
400INVALID_STATUSCannot update a completed receiving order
400NOT_FOUNDUser with email api@senitron.net not found
400ITEMS_NOT_FOUNDNone of the specified items exist on the receiving order.
400INTERNAL_ERROR<exception message>
Notes
  • Sets (non_rfid_item: true) or clears (false) the non-RFID flag on the listed item numbers of the order. With false the message says "cleared".

  • All errors return HTTP 400.

POST

Upload Receiving Data

/{tenant-code}/{location}/api/v1/shipping/inbound/receiving_orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Carton data received and saved in cloud"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe specified location '001' could not be found.
400MISSING_PARAMETEROrder ID is required
400MISSING_PARAMETERCarton number is required
400MISSING_PARAMETERUser is required
400MISSING_PARAMETERItems are required
400NOT_FOUNDReceiving order with ID 24 not found
400INVALID_STATUSCannot update a cancelled receiving order
400INVALID_STATUSCannot update a completed receiving order
400NOT_FOUNDUser with email api@senitron.net not found
400INTERNAL_ERROR<exception message>
Notes
  • Records the scanned items of one carton (carton_number or carton_sequence_number). Non-RFID items use EPC FFFFFFFFFFFFFFFFFFFFFFFF with 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.

General Mode APIs

Temp Transfers

POST

Upload Temp Transfer Order Data

/{tenant-code}/{location}/api/v1/temp_transfers
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 23213,
  "message": "Temporary transfer information has been saved successfully."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERNo assets to transfer
422MISSING_PARAMETERdevice_name is required
422NOT_FOUNDUser is required
422NOT_FOUNDThe source location 001 not found
422NOT_FOUNDThe destination location 002 not found
422FORBIDDENUser does not belong to this client
422PROCESSING_ERROR<exception message>
Notes
  • 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 id returned. 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.

General Mode APIs

Tenant Validation

GET

Tenant Code and Key Validation API

/api/v1/tenant_validate
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringrequiredSenitron integration key (provided by Senitron support).
tenant_codestringrequiredTenant code.
tenant_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/tenant_validate?key=$SENITRON_API_KEY&tenant_code=<tenant_code>&tenant_key=<tenant_key>"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
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"}}
Notes
  • Checks that a tenant code and API key belong together. valid is true when the tenant is enabled and its key has not expired.

  • Errors use a code field (not type); the code/key mismatch is returned with HTTP 200.

General Mode APIs

CDM

GET

Assigning CDM to a Tenant/Location Pair

/api/v1/cdm/assign
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
cdm_macstringrequiredCDM MAC address (case-insensitive).
tenant_codestringrequiredTenant code (must own the API key).
locationstringrequiredLocation code.

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The CDM was successfully assigned to the specified tenant/location"
}

Errors

HTTPTypeMessage
404TENANT_NOT_FOUNDThe specified tenant does not exist.
401UNAUTHORIZEDInvalid API key
404LOCATION_NOT_FOUNDThe specified location does not exist.
404CDM_NOT_REGISTERThe specified CDM is not registered in the cloud.
422ASSIGNMENT_FAILED<validation messages>
Notes
  • Assigns a registered CDM (reader controller) to the location. A different CDM previously assigned to that location is unassigned.

General Mode APIs

Utilities

GET

Get Client IP Address

/api/v1/getip
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringrequiredSenitron integration key (provided by Senitron support).
formatstringoptionaljson returns {"ip": …}; otherwise a JSON string.

Try it with curl

Shell
curl "https://app.senitron.net/api/v1/getip?key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "ip": "82.159.79.16"
}

Errors

HTTPTypeMessage
401—{"message": "Please provide correct key"}
Notes
  • Returns the public IP address the request came from (useful for allow-listing). Without format=json the body is just the IP as a JSON string, e.g. "82.159.79.16".

General Mode APIs

Sale / Return Transactions

POST

Upload Transactions [Sale/Return] Data V1

/{tenant-code}/{location}/api/v1/arbitrary
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "response": "OK"
}
Notes
  • 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.

POST

Upload Transactions [Sale/Return] Data V2

/{tenant-code}/{location}/api/v1/sale
Also at POST /{tenant-code}/{location}/api/v1/transactions
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "response": "OK"
}

Errors

HTTPTypeMessage
500—{"response": "Unexpected type"}
Notes
  • Name selects the processor: Sale, Return, Transfer In or Transfer Out. A body with Reads (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.

POST

Create or Update Transaction

/{tenant-code}/{location}/api/v1/transactions/update
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Transaction updated successfully"
}

Errors

HTTPTypeMessage
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"}
Notes
  • 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 with count new lines.

  • Validation errors are returned with HTTP 200 and a message; check the message, not the status.

POST

Upload Return Data (Legacy)

/{tenant-code}/{location}/api/v1/return
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
"sale-v2"

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/return" \
  -H "Content-Type: application/json" \
  -d '"sale-v2"'

Success response

JSONHTTP 200
{
  "response": "OK"
}
Notes
  • 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.

POST

Upload Shipment Data (Legacy)

/{tenant-code}/{location}/api/v1/shipment
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
"sale-v2"

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipment" \
  -H "Content-Type: application/json" \
  -d '"sale-v2"'

Success response

JSONHTTP 200
{
  "response": "OK"
}
Notes
  • Legacy endpoint: the body is queued to the sales processor (same format as Upload Transactions [Sale/Return] Data V2).

  • No authentication is checked.

POST

Import Sale Orders as Transactions (CSV)

/{tenant-code}/{location}/api/v1/sale/import-sale-orders
General modeNo auth

Request headers

HeaderValue
Content-Typemultipart/form-data

Parameters

NameTypeDescription
filefilerequiredCSV file (multipart/form-data).

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/sale/import-sale-orders" \
  -F "file=@file.csv"

Success response

JSONHTTP 200
{
  "note": "HTTP 200 with an empty body"
}

Errors

HTTPTypeMessage
400—{"message": ""} (no file)
Notes
  • Uploads a CSV of sale orders that is imported as sale transactions in the background.

  • No authentication is checked.

General Mode APIs

Transfers

GET

Getting the Transfer Assets

/{tenant-code}/api/v1/transfers/assets
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
transfer_idintegeroptionalSenitron transfer id.
document_numberstringoptionalExact document number.
reference_numberstringoptionalExact reference number.
querystringoptionalPartial match on id, document or reference number.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/transfers/assets?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Searches all of the tenant's transfers, newest first, with every EPC on each transfer. Dates are ISO 8601.

  • status is one of PENDING, PARTIALLY_RECEIVED, RECEIVED or UNDO.

GET

Get Transfer-Out Data

/{tenant-code}/{location}/api/v1/transfers/out
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL; also accepted as source_location or store_code).
querystringoptionalPartial match on id, document number or reference.
statusstringoptionalComma-separated: pending, partially_received, received, undo.
sn_idintegeroptionalSenitron transfer id.
items_detailsbooleanoptionalAdd item_details to each asset group.
assetsbooleanoptionalfalse returns empty assets arrays.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfers/out?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Lists transfers whose source is location.

  • Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither query nor status is sent, fully received transfers are left out.

  • status is the display status; api_status is the raw transfer status. transfer_date and received_date are returned as stored (format may vary by source).

GET

Get Transfer-In Data

/{tenant-code}/{location}/api/v1/transfers/in
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL; also accepted as source_location or store_code).
querystringoptionalPartial match on id, document number or reference.
statusstringoptionalComma-separated: pending, partially_received, received, undo.
sn_idintegeroptionalSenitron transfer id.
items_detailsbooleanoptionalAdd item_details to each asset group.
assetsbooleanoptionalfalse returns empty assets arrays.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transfers/in?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
401UNAUTHORIZEDInvalid API key or Token
Notes
  • Lists transfers whose destination is location.

  • Newest (most recently updated) first. When the handheld setting Hide completed transfers in API is on and neither query nor status is sent, fully received transfers are left out.

  • status is the display status; api_status is the raw transfer status. transfer_date and received_date are returned as stored (format may vary by source).

POST

Merge the Transfers

/{tenant-code}/api/v1/transfers/merge
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "user": "api@senitron.net",
  "device_name": "HH-53",
  "base_transfer": 27843,
  "merged_transfers": [
    13654,
    194834
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "messages": "The selected transfers have been merged successfully"
}

Errors

HTTPTypeMessage
404TRANSFER_NOT_FOUNDBase transfer ID not found
404NOT_FOUNDNo valid merged transfers
400BAD_REQUEST<exception message>
Notes
  • 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.

POST

Transfer Receiving

/{tenant-code}/{location}/api/v1/transfers/receiving
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 3424,
  "message": "The transfer receiving data has been received, and a job has been scheduled to process it"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
404NOT_FOUNDThe destination store is not found. Please enter store code
404NOT_FOUNDEPC Tags are not found. Please enter valid EPC Tags
404TRANSFER_EXISTSA transfer exists with the same document and reference number!
422ITEM_FULFILLMENT_REQUIREDThe item fulfillment number (eos_item_fulfillment_number) is required for this transfer.
422ITEM_FULFILLMENT_NOT_FOUNDThe item fulfillment IF-6712 does not belong to this transfer.
Notes
  • One-step transfer: creates the transfer slip from the scanned items and receives it at destination_location; receiving runs in the background.

  • TRANSFER_EXISTS also returns the existing transfer id. 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.

POST

Transfer Zone

/{tenant-code}/{location}/api/v1/transfers/zone
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Transfer assets to new zone is successful"
}

Errors

HTTPTypeMessage
404ZONE_NOT_FOUNDThe zone 1 was not found
404<exception class><exception message>
Notes
  • Moves the tags to sub-zone zone.id (static zone). Unknown EPCs are added to inventory first (last_seen must 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.

POST

Create Transfer Slip (Legacy)

/{tenant-code}/{location}/api/v1/transfer-slip
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
keystringrequiredTenant API key (named key, query string).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "status": "success"
}

Errors

HTTPTypeMessage
400—{"error": "Invalid API key"}
400—{"error": "No epcs sent in slip"}
Notes
  • 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.

General Mode APIs

Wave Orders & Picking (WOP)

POST

Assign a Wave Order to an User

/{tenant-code}/{location}/api/v1/wop/picking/orders/assign
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "location": "001",
  "user": "api@senitron.net",
  "user_name": "API User",
  "device_name": "HH-53",
  "wave_id": 28
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The wave order has been assigned to the specified user."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422VALIDATION_ERRORThe 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.
422INTERNAL_ERRORFailed to assign wave order
Notes
  • Assigns wave order wave_id to user. Allowed only while the order is created or firmed, 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

Delete Pick List Item Assets

/{tenant-code}/{location}/api/v1/wop/picking/orders/items/assets
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The wave order picking asset(s) have been deleted."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422MISSING_PARAMETERitems array is required
422INTERNAL_ERRORFailed to delete picking assets
Notes
  • 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

Delete Wave Orders Picking Items

/{tenant-code}/{location}/api/v1/wop/picking/orders/items
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "Item(s) removed from wave order successfully."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422MISSING_PARAMETERitems array is required
422VALIDATION_ERRORWave order status must be created or firmed or picking
422INTERNAL_ERRORFailed to remove item from wave order
Notes
  • Removes items from a wave order in status created, firmed or picking. remove_action defaults to add_to_chase_list when add_to_chase_list: true, otherwise undo_wave; items[].reason is 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

Get Wave Orders Picking List

/{tenant-code}/{location}/api/v1/wop/picking/orders
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).
wave_idintegeroptionalExact wave order id.
querystringoptionalPartial match on id, title or reference number.
statusstringoptionalcreated, firmed, picking, picked, …
assigned_tostringoptionalUser email, or nobody for unassigned orders.
is_openbooleanoptionaltrue = only firmed or picking orders.
itemsbooleanoptionalInclude items.
assetsbooleanoptionalWith items, include picked assets.
items_zonesbooleanoptionalWith items, include item_zones.
items_detailsbooleanoptionalWith items, add item_details.
sort_fieldstringoptionalDefault id.
sort_typestringoptionalasc (default) or desc.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10, maximum 100; 0 = 100.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/picking/orders?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422LOCATION_NOT_FOUNDThe location 001 not found
422INVALID_STATUSInvalid status: done
422INVALID_EMAILInvalid email format: abc
422USER_NOT_FOUNDUser not found with email: x@example.com
422INTERNAL_ERRORInternal server error
Notes
  • Each order adds bulk_customer and a customer object (id, code, name). Transfer-mode wave orders also include reference_details with 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_page is capped at 100.

GET

Get WOP Settings

/{tenant-code}/{location}/api/v1/wop/settings
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).
locationstringrequiredLocation code (General mode: from the URL).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/wop/settings?api_key=$SENITRON_API_KEY&location=$LOCATION"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
Notes
  • Returns the tenant's Wave Order Picking settings and modes. Missing statuses or zones are returned with id 0 and empty names.

POST

POST Wave Orders Picking Items

/{tenant-code}/{location}/api/v1/wop/picking/orders/items
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The wave order picking item(s)/asset(s) have been received and saved in the cloud."
}

Errors

HTTPTypeMessage
422MISSING_PARAMETERLocation is required
422LOCATION_NOT_FOUNDThe location 001 not found
422MISSING_PARAMETERwave_id is required
422MISSING_PARAMETERuser (email) is required
422NOT_FOUNDWave order with id 28 not found
422NOT_FOUNDUser with email api@senitron.net not found
422MISSING_PARAMETERitems array is required
422VALIDATION_ERRORWave order has already been picked
422EPC_ALREADY_PICKEDThe EPC has already been picked in WO# 27 for item# 210000006265
422INTERNAL_ERRORFailed to save picking data
Notes
  • Records picked assets for the wave order items. Unknown EPCs are created from the EPC profile. assets[].last_seen and assets[].zone.id update 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.

General Mode APIs

Settings

GET

Get UI Settings (API key)

/{tenant-code}/{location}/api/v1/settings/ui
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/settings/ui?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "attributes": [
    {
      "default_label": "Asset ID",
      "name": "col_asset_id",
      "user_label": "Item #"
    },
    {
      "default_label": "ALU",
      "name": "col_alu",
      "user_label": "ALU"
    }
  ]
}

Errors

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key
Notes
  • Same response as Get UI Settings (Column Labels), authenticated with the tenant API key.

General Mode APIs

Catalog (Tenant)

GET

List Catalog Items

/{tenant-code}/api/v1/catalogs
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
querystringoptionalExact number/SKU/custom SKU/ALU/UPC (case-insensitive) or partial description.
inventory_databooleanoptionalAdd inventory (in-inventory tags and quantity per location).
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 100.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/catalogs?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Tenant-wide catalog (not tied to a location). inventory appears only with inventory_data=true.

  • Response quirks: the preferred unit of measure is returned under the key preferred_unit_of_mea22sure; created_at/updated_at use a 24-hour hour with AM/PM.

GET

Get Catalog Item

/{tenant-code}/api/v1/catalogs/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredItem number (padding is added automatically).
inventory_databooleanoptionalAdd inventory.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/catalogs/<id>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"error": {"status": "error", "code": 102, "message": "Item not found"}}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Same item fields as List Catalog Items.

POST

Create or Update Catalog Item

/{tenant-code}/api/v1/catalogs
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "number": "000000197634",
  "message": "The catalog item created successfully"
}

Errors

HTTPTypeMessage
400—{"error": {"status": "error", "code": 104, "message": "Description not sent"}}
400—{"error": {"status": "error", "message": "<validation messages>"}}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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) or cloud_picture_url, and categories (nested name/children, created if new).

PUT

Update Catalog Item

/{tenant-code}/api/v1/catalogs/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredCurrent item number.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "number": "000000197634",
  "description": "Hoka Bondi 8 (2026)",
  "retail_price": 89.0
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The catalog item updated successfully"
}

Errors

HTTPTypeMessage
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"}
Notes
  • 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) or cloud_picture_url, and categories (nested name/children, created if new).

DELETE

Delete Catalog Item

/{tenant-code}/api/v1/catalogs/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredItem number.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/catalogs/<id>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "message": "The catalog item removed successfully"
}

Errors

HTTPTypeMessage
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"}
General Mode APIs

Manufacturing Catalog

POST

Bulk Save Units of Measure

/{tenant-code}/api/v1/manufacturing/uoms
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
delete_missing_uomsbooleanoptionaltrue deletes storage units that are not in the payload.

Request body

JSON
[
  {
    "item_number": "CTUB-20062",
    "name": "CS",
    "units": 12,
    "default": true
  },
  {
    "item_number": "CTUB-20062",
    "name": "EA",
    "units": 1,
    "default": false
  }
]

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The UOM data saved in cloud"
}

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • The body is a JSON array of storage units; it is stored and processed in the background (HTTP 201).

  • Pass api_key (and delete_missing_uoms) in the query string, because the body is an array.

GET

List Manufacturing Catalog

/{tenant-code}/api/v1/manufacturing/catalogs
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
numberstringoptionalExact item number.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/catalogs?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Catalog items ordered by number (all columns, shortened here).

POST

Create or Update Manufacturing Item

/{tenant-code}/api/v1/manufacturing/catalogs
Also at PATCH /{tenant-code}/api/v1/manufacturing/catalogs
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"status": "error", "message": "No ALU Present"}
400—{"status": "error", "message": "Item is locked for update/delete"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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 (or unit_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: true queues the save and returns HTTP 201 "ok".

  • Returns HTTP 201 with the item. Calls are stored in the catalog log.

POST

Bulk Upsert Manufacturing Items

/{tenant-code}/api/v1/manufacturing/catalogs/bulk
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
delete_missing_itemsbooleanoptionaltrue removes items missing from the payload.

Request body

JSON
[
  {
    "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

Shell
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

JSONHTTP 200
{
  "message": "The catalog item data saved in cloud"
}

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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 (and delete_missing_items) in the query string.

DELETE

Delete Manufacturing Item

/{tenant-code}/api/v1/manufacturing/catalogs
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
alustringrequiredERP item number (ALU).
permanentbooleanoptionaltrue deletes permanently; default: soft delete (discard).

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/manufacturing/catalogs?api_key=$SENITRON_API_KEY&alu=<alu>"

Success response

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
404—{"message": "The catalog number is not found"}
200—{"message": "Discarded before"}
400—{"message": "Error destroy catalog"}
401—{"status": "error", "message": "Invalid API key"}
GET

List BOM Lines

/{tenant-code}/{location}/api/v1/bom_data
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bom_data?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • All bill-of-materials lines.

POST

Create or Update BOM Line

/{tenant-code}/{location}/api/v1/bom_data
Also at PATCH /{tenant-code}/{location}/api/v1/bom_data
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"status": "error", "message": "<errors>"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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: true queues the save and returns HTTP 201 "ok".

  • Returns HTTP 201 with the line. Calls are stored in the BOM log.

DELETE

Disable BOM Line

/{tenant-code}/{location}/api/v1/bom_data
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
parent_item_nostringrequiredParent item ALU.
line_nointegerrequiredLine number.

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "success"
}

Errors

HTTPTypeMessage
400—{"status": "error", "message": "Error saving Bom data"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Marks the line as disabled (it is kept). Unknown lines also return success.

POST

Bulk Upsert BOM Lines

/{tenant-code}/api/v1/manufacturing/boms
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
delete_missing_bomsbooleanoptionaltrue disables lines missing from the payload.

Request body

JSON
[
  {
    "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

Shell
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

JSONHTTP 200
{
  "message": "The BOM data saved in cloud"
}

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • The body is a JSON array of BOM lines, processed in the background. Pass api_key in the query string.

General Mode APIs

Locations

GET

List Locations (Destinations)

/{tenant-code}/api/v1/locations/destinations
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/locations/destinations"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
500—Unknown tenant code (server error)
Notes
  • Returns every location of the tenant with all its stored attributes (shortened here). No authentication is checked.

General Mode APIs

Inventory Compare

POST

Import Quantities (PSPY, gzip CSV)

/{tenant-code}/api/v1/inventory_compare/import_qty_pspy
General modeToken or API key

Request headers

HeaderValue
Content-Typeapplication/gzip

Parameters

NameTypeDescription
api_keystringrequiredTenant API key (or send it in the Api-Key header).

Try it with curl

Shell
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.gz

Success response

JSONHTTP 200
{
  "message": "Import enqueued"
}

Errors

HTTPTypeMessage
422—{"error": "<exception message>"}
401UNAUTHORIZEDInvalid API key or Token
Notes
  • The request body is a gzip-compressed CSV (send Content-Type: application/gzip and 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>' …

POST

Import Lightspeed Inventory File

/{tenant-code}/{location}/api/v1/lightspeed/import_template
General modeNo auth

Request headers

HeaderValue
Content-Typemultipart/form-data

Parameters

NameTypeDescription
keystringrequiredTenant API key (named key).
filefilerequiredLightspeed CSV export (multipart/form-data).
create_nil_qty_itemsbooleanoptionalAny value: also create items whose quantity is empty.

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/lightspeed/import_template?key=$SENITRON_API_KEY" \
  -F "file=@file.csv"

Success response

JSONHTTP 200
{
  "message": "Catalog file will be imported soon"
}

Errors

HTTPTypeMessage
401—{"message": "No key provided"}
Notes
  • Imports a Lightspeed inventory CSV into the catalog and the Compare page in the background.

General Mode APIs

Webhooks

POST

Shopify Inventory Levels Webhook

/{tenant-code}/api/v1/webhooks/shopify/inventory_levels/update
Also at POST /{tenant-code}/api/v1/webhooks/shopify/inventory_levels/connect, POST /{tenant-code}/api/v1/webhooks/shopify/inventory_levels/disconnect
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "inventory_item_id": 49148385,
  "location_id": 655441491,
  "available": 6,
  "updated_at": "2026-10-07T09:00:00-04:00"
}

Try it with curl

Shell
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

JSONHTTP 200
{}

Errors

HTTPTypeMessage
200—{"status": "error", "message": "<message>"} (unknown Shopify location)
Notes
  • Receiver for Shopify inventory_levels/update, /connect and /disconnect webhooks (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 {}.

POST

Lightspeed Sale Webhook

/{tenant-code}/{location}/api/v1/sale/lightspeed
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "saleID": "18342",
  "completed": "true",
  "SaleLines": {
    "SaleLine": [
      {
        "itemID": "771",
        "unitQuantity": "1"
      }
    ]
  }
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "note": "HTTP 200 with an empty body"
}
Notes
  • Receiver for Lightspeed Retail sale events (configured in Lightspeed). The payload is processed in the background.

  • No authentication is checked.

POST

Lightspeed Work Order Webhook

/{tenant-code}/{location}/api/v1/workorder/lightspeed
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "workorderID": "512",
  "WorkorderItems": {
    "WorkorderItem": [
      {
        "itemID": "771",
        "saleLineID": "0"
      }
    ]
  }
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "note": "HTTP 200 with an empty body"
}
Notes
  • Receiver for Lightspeed Retail work-order events. The payload is processed in the background.

  • No authentication is checked.

General Mode APIs

Items & Tag Metadata (Legacy POS)

GET

Get Items with Live Quantity

/{tenant-code}/api/v1/item/{id}
Also at GET /{tenant-code}/{location}/api/v1/item/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredOne item number, or several separated by commas.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/item/<id>"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
500—Unknown item number (server error)
Notes
  • 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.

GET

Export Catalog CSV

/{tenant-code}/api/v1/items.csv
Also at GET /{tenant-code}/{location}/api/v1/items.csv
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringoptionalTenant API key (required unless time is sent).
timestringoptionalReturn only items changed since this time (no key needed).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/items.csv?key=$SENITRON_API_KEY" \
  -o export.csv

Success response

JSONHTTP 200
{
  "note": "CSV file (text/csv)"
}

Errors

HTTPTypeMessage
200—{"data": "No key provided"}
Notes
  • Request the .csv format. With time, returns the items changed since then; otherwise the full catalog CSV (requires key). Used by the Senitron POS integration.

POST

Get Items by Item Number

/{tenant-code}/api/v1/tags/metadata
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
[
  "000000197634",
  "000000197635"
]

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/metadata" \
  -H "Content-Type: application/json" \
  -d '[
  "000000197634",
  "000000197635"
]'

Success response

JSONHTTP 200
[
  {
    "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
  }
]
Notes
  • The body is a JSON array of item numbers. Unknown numbers are skipped. Includes item_type, item_categories, category_name and total_qty.

  • Records are returned with all of their database columns (shortened here).

  • No authentication is checked; the tenant comes from the URL.

POST

Get Items by Item Number (All Locations)

/{tenant-code}/api/v1/tags/item_metadata
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
[
  "000000197634"
]

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/tags/item_metadata" \
  -H "Content-Type: application/json" \
  -d '[
  "000000197634"
]'

Success response

JSONHTTP 200
[
  {
    "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"
  }
]
Notes
  • 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.

POST

Get Items by Item Number (Simple)

/{tenant-code}/api/v1/items/by_item_number
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
[
  "000000197634",
  "000000197635"
]

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/items/by_item_number" \
  -H "Content-Type: application/json" \
  -d '[
  "000000197634",
  "000000197635"
]'

Success response

JSONHTTP 200
[
  {
    "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"
  }
]
Notes
  • 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.

POST

Get Tags by EPC

/{tenant-code}/api/v1/tags/tag_metadata
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
store_codestringrequiredLocation code whose tags are searched (query string).
addbooleanoptionaltrue adds unknown EPCs to inventory with status Unknown.
reasonstringoptionalWith add: reason written to the tag history.

Request body

JSON
[
  "CF19930E4FA6BD4000000432",
  "CF19930E4FA6BD4000000433"
]

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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
  }
]
Notes
  • 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.

POST

Get Items by EPC

/{tenant-code}/api/v1/tags/metadata-by-epc
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
store_codestringrequiredLocation code whose tags are searched (query string).
ignore_presencebooleanoptionalInclude tags whose item is not in the catalog.

Request body

JSON
[
  "CF19930E4FA6BD4000000432"
]

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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
  }
]
Notes
  • 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.

POST

Decode Tags by EPC

/{tenant-code}/api/v1/tags/metadata-by-tag
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
store_codestringrequiredLocation code whose tags are searched (query string).

Request body

JSON
[
  "CF19930E4FA6BD4000000432",
  "FFFF00000000000000000001"
]

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "item_number": "210000047060",
    "asset_id": "1024",
    "epc": "CF19930E4FA6BD4000000432",
    "item_name": "Classic Tee"
  },
  {
    "item_number": "4294967295",
    "asset_id": "1",
    "epc": "FFFF00000000000000000001",
    "item_name": "-"
  }
]
Notes
  • 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

Get Item Units of Measure

/{tenant-code}/api/v1/items/uoms
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
numberstringrequiredItem number.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/items/uoms?number=<number>"

Success response

JSONHTTP 200
[
  {
    "id": 15,
    "item_number": "CTUB-20062",
    "name": "CS",
    "units": 12.0,
    "default": true
  }
]
Notes
  • Storage units (UOMs) of the item, or null if 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.

General Mode APIs

EPC Tags (Readers & POS)

GET

Export EPC Tags CSV

/{tenant-code}/{location}/api/v1/epc_tags.csv
Also at GET /{tenant-code}/api/v1/epc_tags.csv
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringoptionalTenant API key (required unless time is sent).
timestringoptionalReturn only tags changed since this time (no key needed).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_tags.csv?key=$SENITRON_API_KEY" \
  -o export.csv

Success response

JSONHTTP 200
{
  "note": "CSV file (text/csv)"
}

Errors

HTTPTypeMessage
200—{"data": "No key provided"}
Notes
  • Request the .csv format. With time, returns the tags changed since then; otherwise all tags (requires key). Used by the Senitron POS integration.

POST

Mark Tag Stolen (Exit Read)

/{tenant-code}/{location}/api/v1/epc_tags/mark-stolen
Also at POST /{tenant-code}/{location}/api/v1/epc_tags/mark_stolen
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "epc": "CF19930E4FA6BD4000000432",
  "antenna_id": "101",
  "rssi": -50
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "gpio": false
}

Errors

HTTPTypeMessage
400—{"message": "Missing EPC"}
400—{"message": "EPC could not be decoded, malformed epc"}
Notes
  • 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.

POST

Mark Tags Killed

/{tenant-code}/{location}/api/v1/epc_tags/mark-killed
Also at POST /{tenant-code}/{location}/api/v1/epc_tags/mark_killed
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "find_by": "epc_id",
  "tags": [
    "CF19930E4FA6BD4000000432",
    "CF19930E4FA6BD4000000433"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "done",
  "tags": [
    "CF19930E4FA6BD4000000432",
    "CF19930E4FA6BD4000000433"
  ]
}

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Sets the listed tags to Tag Killed. find_by: epc_id (default) or item_number (kills every tag of each item number). tags lists the EPCs that were changed.

  • An empty tags array returns an empty response.

POST

Preview Tags from EPCs

/{tenant-code}/{location}/api/v1/epc_tags/init-by-epcs
Also at POST /{tenant-code}/{location}/api/v1/epc_tags/init_by_epcs
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "epcs": [
    "CF19930E4FA6BD4000000499"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": null,
    "epc_id": "CF19930E4FA6BD4000000499",
    "asset_id": "1177",
    "item_number": "210000047060"
  }
]
Notes
  • 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.

POST

Record Printed Tags

/{tenant-code}/{location}/api/v1/epc_tags/print
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "epc": "CF19930E4FA6BD4000000432",
  "item_number": "210000047060",
  "serial_number": "1024",
  "printer": "Zebra Front Desk"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "data": "Insertion scheduled"
}
Notes
  • Queues the posted print data (any JSON) for insertion as printed tags at the location (used by print stations). No authentication is checked.

General Mode APIs

Readers & Devices

POST

ATS Beacon Reads

/{tenant-code}/{location}/api/v1/ats/reads
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "msg": "advData",
  "gmac": "AC233FC0A1B2",
  "obj": [
    {
      "dmac": "AC233FA0B1C2",
      "rssi": -61
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
400—{"errors": "<exception message>"}
401UNAUTHORIZEDInvalid API key
Notes
  • 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.

POST

Inject Reader Data (EPC States)

/{tenant-code}/{location}/api/v1/epc_states/injector
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "response": "OK"
}
Notes
  • Queues fixed-reader read data for background processing (EPC state / last seen). Used by CDM/reader software. No authentication is checked.

POST

Publish Live Reads

/{tenant-code}/{location}/api/v1/epc_states/read
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "DeviceId": "RRD-12",
  "LocationId": "acme_001",
  "reader_id": "12",
  "Reads": [
    {
      "EPC": "CF19930E4FA6BD4000000432",
      "RSSI": -44,
      "antenna_id": "101"
    }
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "response": "OK"
}
Notes
  • 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.

POST

Simulate Reader Reads (Testing)

/{tenant-code}/{location}/api/v1/epc_states/mock_insert
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "asset_id": "1024, 1025",
  "device_id": "RRD-12",
  "antenna_id": "101"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "response": "{\"response\":\"OK\"}",
  "tags_send": 2,
  "tag_ids": 2,
  "check_tag_id": false
}
Notes
  • Testing helper: builds reads for the given asset ids and posts them to Publish Live Reads for the same location. check_tag_id is true when some asset ids were not found.

GET

Get EPCs by Asset IDs

/{tenant-code}/{location}/api/v1/epc_states/epc_ids
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
assets[]stringrequiredAsset ids (repeat the parameter).

Try it with curl

Shell
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/epc_states/epc_ids?assets[]=<assets>"

Success response

JSONHTTP 200
{
  "epcs": [
    "CF19930E4FA6BD4000000432"
  ]
}
Notes
  • Returns the EPCs of the given asset ids. No authentication is checked.

POST

Instant RFID Event

/{tenant-code}/{location}/api/v1/rfid/instant
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
[
  {
    "epc": "CF19930E4FA6BD4000000432",
    "antenna_id": "101",
    "rssi": -45
  }
]

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": true,
  "alert": true,
  "command_type": "",
  "options": ""
}

Errors

HTTPTypeMessage
400—{"message": "EpcID prefix is not defined for this tenant"}
400—{"message": "The EPC prefix is not valid for this tenant"}
Notes
  • 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.

General Mode APIs

Bills of Lading (BOLs)

GET

Import BOLs from File

/{tenant-code}/{location}/api/v1/bols/import
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredURL of the BOL file to import.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bols/import?api_key=$SENITRON_API_KEY&file=<file>"

Success response

JSONHTTP 200
{
  "message": "BOL(s) created successfully"
}

Errors

HTTPTypeMessage
404NOT_FOUNDCould not find Store with that code
401UNAUTHORIZEDInvalid API key
Notes
  • Downloads the file at file and creates the BOLs it contains.

GET

Import BOL Cartons from File

/{tenant-code}/{location}/api/v1/bols/import_cartons
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredURL of the carton file to import.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/bols/import_cartons?api_key=$SENITRON_API_KEY&file=<file>"

Success response

JSONHTTP 200
{
  "message": "BOL(s) created successfully"
}

Errors

HTTPTypeMessage
404NOT_FOUNDCould not find Store with that code
404NOT_FOUNDUrl should be filled
401UNAUTHORIZEDInvalid API key
General Mode APIs

IITS Tracking

GET

Get IITS Tracking Events

/{tenant-code}/{location}/api/v1/iits/events
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
event_numberintegeroptionalEvent id.
from_datestringoptionalMM/DD/YYYY.
to_datestringoptionalMM/DD/YYYY (inclusive).
last_eventsintegeroptionalOnly events of the last N hours.
directionstringoptionalEvent direction (e.g. in, out).
employeestringoptionalPartial match on employee details.
vehiclestringoptionalPartial match on vehicle details.
only_item_assetsbooleanoptionalOnly events with item assets.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 10; 0 returns all rows.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/iits/events?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401UNAUTHORIZEDInvalid API key
Notes
  • 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.

General Mode APIs

Inbound Imports

GET

Import Inbound Avery Assets

/{tenant-code}/{location}/api/v1/inbound/avery/import_pn
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredURL of the file to import.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inbound/avery/import_pn?api_key=$SENITRON_API_KEY&file=<file>"

Success response

JSONHTTP 200
{
  "message": "Inbound avery asset import enqueued"
}

Errors

HTTPTypeMessage
400—{"message": "Missing catalog file."}
401—{"status": "error", "message": "Invalid API key"}
GET

Import Inbound Receiving Orders

/{tenant-code}/{location}/api/v1/inbound/receiving_orders/import_pn
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredURL of the file to import.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inbound/receiving_orders/import_pn?api_key=$SENITRON_API_KEY&file=<file>"

Success response

JSONHTTP 200
{
  "message": "Inbound receiving order import enqueued"
}

Errors

HTTPTypeMessage
400—{"message": "Missing catalog file."}
401—{"status": "error", "message": "Invalid API key"}
General Mode APIs

Inventory Export (Legacy)

GET

Get Inventory (Legacy)

/{tenant-code}/{location}/api/v1/inventory_details
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringrequiredTenant API key (named key).
pageintegeroptionalDefault 1 (100 tags per page).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventory_details?key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "id": 32503,
    "epc_id": "CF19930E4FA6BD4000000432",
    "asset_id": "1024",
    "item_number": "210000047060",
    "status": {
      "id": 1000,
      "name": "Live"
    },
    "item": {
      "number": "210000047060",
      "description": "Classic Tee"
    }
  }
]

Errors

HTTPTypeMessage
200—{"data": "No key provided"}
Notes
  • All tags of the location (100 per page) with their status and item records (all columns, shortened here).

GET

Export Inventory Log CSV

/{tenant-code}/{location}/api/v1/inventory_log.csv
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
keystringrequiredTenant API key (named key).
appstringoptionalQBPOS (QuickBooks POS format) or COMCACH; default: standard log.
fieldsstringoptionalOptional list of fields to export (standard format).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/inventory_log.csv?key=$SENITRON_API_KEY" \
  -o export.csv

Success response

JSONHTTP 200
{
  "note": "CSV file (text/csv)"
}

Errors

HTTPTypeMessage
200—{"data": "No key provided"}
Notes
  • Request the .csv format (e.g. …/inventory_log.csv).

POST

Download Inventory CSV (Fields & Filters)

/{tenant-code}/{location}/api/v1/inventory_download.csv
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
keystringrequiredTenant API key (named key).

Request body

JSON
{
  "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

Shell
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.csv

Success response

JSONHTTP 200
{
  "note": "CSV file (text/csv)"
}

Errors

HTTPTypeMessage
200INVALID_DATAplease provide fields and filters
404INVALID_FIELDplease input valid fields or filters
200INVALID_KEYplease provide valid key
Notes
  • Request the .csv format (e.g. …/inventory_log.csv).

  • fields[].name and filters[].name must be catalog column names; unknown names are dropped.

General Mode APIs

Printing

GET

List Printers

/{tenant-code}/{location}/api/v1/printers
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printers"

Success response

JSONHTTP 200
[
  {
    "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"
  }
]
Notes
  • All printers of the tenant ordered by name, with all their stored settings (shortened here). No authentication is checked.

GET

Barcode Image

/{tenant-code}/{location}/api/v1/printing/barcode
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
textstringrequiredText to encode.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/barcode.png?text=<text>" \
  -o image.png

Success response

JSONHTTP 200
{
  "note": "PNG image (image/png)"
}
Notes
  • Request the .png format (…/printing/barcode.png?text=…).

GET

QR Code Image

/{tenant-code}/{location}/api/v1/printing/qr_code
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
textstringrequiredText to encode.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/qr_code.png?text=<text>" \
  -o image.png

Success response

JSONHTTP 200
{
  "note": "PNG image (image/png)"
}
Notes
  • Request the .png format (…/printing/qr_code.png?text=…).

GET

Marker Tag Cover Page

/{tenant-code}/{location}/api/v1/printing/marker_tag_cover_page/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its cover-page template and paper size are used).
tag_idsstringrequiredComma-separated tag (asset record) ids.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/marker_tag_cover_page/<id>.pdf?tag_ids=<tag_ids>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown printer or tags (record not found)
Notes
  • Returns a PDF document (request the .pdf format); .html returns the HTML preview and adding debug shows the PDF as HTML.

GET

Employee Badge Cover Page (ELC)

/{tenant-code}/{location}/api/v1/elc/printing/{id}/employee
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (cover-page template).
employee_ids[]integerrequiredELC employee ids (repeat the parameter).

Try it with curl

Shell
curl -g "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/elc/printing/<id>/employee.pdf?employee_ids[]=<employee_ids>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}
Notes
  • Returns a PDF document (request the .pdf format); .html returns the HTML preview and adding debug shows the PDF as HTML.

  • Employee life-cycle (ELC) module.

POST

Print Item Label

/{tenant-code}/{location}/api/v1/itemprint
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404LOCATION_NOT_FOUNDThe location 001 not found
404ITEM_NOT_FOUNDNo item_number specified
404PRINTER_NOT_FOUNDThe Printer is not valid
422PRINTER_DISABLEDThe printer is disabled (not visible) and print jobs cannot be sent to it
404ITEM_NOT_FOUNDThe item 210000047060 not found
422PRINTING_DISABLEDThe printing functionality has been disabled for this item
422NON_RFID_ITEMThis item is marked as Non-RFID and cannot be printed
400PRINTER_TEMPLATE_ERRORError generating ZPL from template, check template code: <message>
400INTERNAL_ERROR<exception message>
401UNAUTHORIZEDInvalid API key
Notes
  • Encodes one new EPC (next serial) and prints it count times (copies). print: true sends the job to the printer; otherwise only the ZPL is returned.

  • unique_print: true reprints the item's latest live tag instead of encoding a new one. An alt_serial already used by the item reuses that tag's EPC.

  • add_to_inventory: true adds 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; payload is the ZPL.

  • The Api-Key header can be used instead of the api_key parameter.

POST

Print Item Labels V2

/{tenant-code}/{location}/api/v1/itemprint_v2
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
400DUPLICATE_ITEM<database message>
404LOCATION_NOT_FOUNDThe location 001 not found
404ITEM_NOT_FOUNDNo item_number specified
404PRINTER_NOT_FOUNDThe Printer is not valid
422PRINTER_DISABLEDThe printer is disabled (not visible) and print jobs cannot be sent to it
404ITEM_NOT_FOUNDThe item 210000047060 not found
422PRINTING_DISABLEDThe printing functionality has been disabled for this item
422NON_RFID_ITEMThis item is marked as Non-RFID and cannot be printed
400PRINTER_TEMPLATE_ERRORError generating ZPL from template, check template code: <message>
400INTERNAL_ERROR<exception message>
401UNAUTHORIZEDInvalid API key
Notes
  • Encodes count new EPCs (one label each, number_of_copy copies) 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) and last_zone/last_seen_antenna. epc.serial_number forces 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; payload is the ZPL.

  • The Api-Key header can be used instead of the api_key parameter.

General Mode APIs

Imports

POST

Upload File (Items / Assets / Image)

/{tenant-code}/{location}/api/v1/uploader
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "action_type": "item",
  "file_extension": "csv",
  "file": "<Base64 file content>"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The upload is queued"
}

Errors

HTTPTypeMessage
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"}
Notes
  • action_type: item (catalog import), item_asset (catalog + assets import) — both queued — or item_image (sets the picture of item_number; returns {"message": "The image saved"}).

  • file is the Base64-encoded file and file_extension its type (e.g. csv, xlsx, png).

General Mode APIs

Pallet Build

GET

Import Pallet Build Cartons from File

/{tenant-code}/{location}/api/v1/shipping/pallet_build/import_cartons
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredURL of the carton (wave) file.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/shipping/pallet_build/import_cartons?api_key=$SENITRON_API_KEY&file=<file>"

Success response

JSONHTTP 200
{
  "message": "Carton(s) created successfully"
}

Errors

HTTPTypeMessage
404NOT_FOUNDCould not find Store with that code
404NOT_FOUNDURL should be filled
401UNAUTHORIZEDInvalid API key
Notes
  • Downloads the file and imports its cartons in the background.

  • The Api-Key header can be used instead of the api_key parameter.

POST

Import Order Cartons (JSON)

/{tenant-code}/{location}/api/v1/shipping/pallet_build/import_order_cartons
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
order_typestringoptionalWhen set, the request is rejected unless order.order_type matches (case-insensitive).

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The order cartons and items have been imported successfully."
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDThe location code is invalid.
400BAD_REQUESTMissing order.id
400BAD_REQUESTInvalid order type
400BAD_REQUESTInvalid gzip body
401UNAUTHORIZEDInvalid API key
Notes
  • 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-Key header can be used instead of the api_key parameter.

GET

Import ASN Cartons from File

/{tenant-code}/{location}/api/v1/shipping/pb/import_asn_cartons
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredURL of the ASN file.
data_typeintegerrequired1 = ASN header file, 2 = ASN details file.

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The data has been successfully received and will be processed shortly"
}

Errors

HTTPTypeMessage
400LOCATION_NOT_FOUNDThe location 001 not found
404NOT_FOUNDURL should be filled
404NOT_FOUNDData Type should be filled
401UNAUTHORIZEDInvalid API key
Notes
  • Imports ASN (advance ship notice) header or detail files into Pallet Build cartons in the background.

  • The Api-Key header can be used instead of the api_key parameter.

General Mode APIs

Catalog Import

POST

Import Catalog File

/{tenant-code}/api/v1/catalog/import
General modeAPI key

Request headers

HeaderValue
Content-Typemultipart/form-data

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
attachmentfilerequiredCatalog file (multipart/form-data).
import_typestringoptionalsystem (Senitron CSV, default), lightspeed, simple (JSON) or coci_catalog_item_part.

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog/import?api_key=$SENITRON_API_KEY" \
  -F "attachment=@catalog.csv"

Success response

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
200—{"message": "No File", "status": 406}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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 with status: 406.

POST

Import Catalog File (Verbose)

/{tenant-code}/api/v1/catalog/import_verbose
General modeAPI key

Request headers

HeaderValue
Content-Typemultipart/form-data

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
attachmentfilerequiredCatalog file (multipart/form-data).

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/api/v1/catalog/import_verbose?api_key=$SENITRON_API_KEY" \
  -F "attachment=@catalog.csv"

Success response

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
200—{"message": "No File", "status": 406}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Same as Import Catalog File (Senitron CSV) with detailed per-row logging of the import.

GET

Import Catalog (Patricia Nash)

/{tenant-code}/api/v1/catalog/import_pn
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
filestringrequiredCatalog file content (CSV text).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/catalog/import_pn?api_key=$SENITRON_API_KEY&file=<file>"

Success response

JSONHTTP 200
{
  "message": "Catalog import enqueued"
}

Errors

HTTPTypeMessage
400—{"message": "Missing catalog file."}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Customer-specific catalog import format.

GET

Download Catalog Sample File

/{tenant-code}/api/v1/catalog/sample_file
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
typestringrequiredsystem, lightspeed or coci_catalog_item_part.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/catalog/sample_file?type=<type>" \
  -o export.csv

Success response

JSONHTTP 200
{
  "note": "CSV file (text/csv)"
}
Notes
  • Template CSV for catalog imports. For system and lightspeed, the tenant's custom attribute columns (and for system the PUOM, UOM, Measure Unit columns) are added. Unknown types return an empty response.

General Mode APIs

Manufacturing Tags

POST

Generate & Print Manufacturing Tags

/{tenant-code}/{location}/api/v1/manufacturing/tags/generate
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The tags are scheduled for creation and printing"
}

Errors

HTTPTypeMessage
404ITEM_NOT_FOUNDThe item 210000047060 not found
404PRINTER_NOT_FOUNDThe printer is not valid
404ZONE_NOT_FOUNDThe zone not found
422PRINTING_DISABLEDThe printing functionality has been disabled for this item
422MAX_PRINT_UNITS_EXCEEDEDPrint blocked: units per tag (240 EA) exceeds the maximum allowed limit of 200 EA.
422MAX_PRINT_VALUE_EXCEEDEDPrint blocked: value per tag ($1200.0) exceeds the maximum allowed limit of $1000.
422MASTER_TAG_EXISTSA master tag (#1024) already exists for this item in this master tag zone. …
422NORMAL_TAG_IN_MASTER_ZONEThis zone already contains a normal tag (#1024) for this item. …
422MISSING_UOM<message>
422EPC_LENGTH_ERROR<message>
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Creates new tags for an item in zone zone.id and prints their labels in the background. Label count: pallet_count if set, else box_count, else unit_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.

POST

Adjust Tag Quantity

/{tenant-code}/{location}/api/v1/manufacturing/tags/adjustment
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "The tag scheduled for the cycle count"
}

Errors

HTTPTypeMessage
404ITEM_NOT_FOUNDThe item 210000047060 not found
404TAG_NOT_FOUNDThe tag 1024 not found
400TAG_HARD_ALLOCATEDTag has been HARD ALLOCATED to an SO can't be qty Adjusted
404UOM_NOT_FOUNDThe UOM CS not found
404REASON_NOT_FOUNDThe reason damaged not found
404ISSUE<message>
401—{"status": "error", "message": "Invalid API key"}
Notes
  • action_type: adj (set quantity, default), inc (add) or dec (subtract); qty is converted from uom to the item's base unit.

  • reason: cycle count, sample, prod adj, return to vendor or legacy disposition. A quantity of 0 kills the tag; a killed tag set above 0 becomes Live. zone.id also 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.

POST

Confirm Tag (Physical Audit)

/{tenant-code}/{location}/api/v1/manufacturing/tags/confirm
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "item_number": "CTUB-20062",
  "serial_number": "1024",
  "user": "operator@acme.com",
  "device_name": "HH-53"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "messages": "The tag has been confirmed successfully"
}

Errors

HTTPTypeMessage
404ITEM_NOT_FOUNDThe item 210000047060 not found
404TAG_NOT_FOUNDThe tag 1024 not found
404ISSUE<message>
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

POST

Merge Tags

/{tenant-code}/{location}/api/v1/manufacturing/tags/merge
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "item_number": "CTUB-20062",
  "serial_number": "1024",
  "tags": [
    "1025",
    "1026"
  ],
  "user": "operator@acme.com"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "The tags has been merged successfully"
}

Errors

HTTPTypeMessage
404TAG_NOT_FOUNDThe tag 1024 not found
404ITEM_NOT_FOUNDThe item 210000047060 not found
404ITEM_NOT_VALIDItem number is not valid for tag# 1024
404TAGS_NOT_FOUNDThe tags is empty
404TAGS_NOT_FOUNDThe tag(s) 1026 not found
422—{"error": "<message>"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

POST

Split Tag

/{tenant-code}/{location}/api/v1/manufacturing/tags/split
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "The tag has been splitted successfully"
}

Errors

HTTPTypeMessage
404ITEM_NOT_FOUNDThe item 210000047060 not found
404TAG_NOT_FOUNDThe tag 1024 not found
404UOM_NOT_FOUNDThe UOM CS not found
404PRINTER_NOT_FOUNDThe Printer 5 not found
400ISSUE<message>
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

POST

Transfer Tag to Location

/{tenant-code}/{location}/api/v1/manufacturing/tags/transfer
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "messages": "The tag has been transferred successfully"
}

Errors

HTTPTypeMessage
404LOCATION_NOT_FOUNDThe location 002 not found
404ITEM_NOT_FOUNDThe item 210000047060 not found
404TAG_NOT_FOUNDThe tag 1024 not found
400TAG_IN_TRANSITThe tag is not active to be marked as in transit - change status or duplicate to mark as In Transit
400TAG_QUALITY_HOLDThe tag is placed under quality hold, not authorized to transfer
404ISSUE<message>
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

POST

Create Tagging Request

/{tenant-code}/{location}/api/v1/manufacturing/tagging_requests
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

General Mode APIs

Manufacturing Receiving

GET

Get Item Encoding Info

/{tenant-code}/{location}/api/v1/manufacturing/receive/item-info/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredItem ALU.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/item-info/<id>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"message": "Couldn't find item"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • EPC encoding settings, last encoded serial and the item record (all columns, shortened here).

GET

Get Item Storage Units

/{tenant-code}/{location}/api/v1/manufacturing/receive/storage-units/{item_number}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
item_numberpathrequiredItem number.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/storage-units/<item_number>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "id": 15,
    "item_number": "CTUB-20062",
    "name": "CS",
    "units": 12.0,
    "default": true
  }
]

Errors

HTTPTypeMessage
400—{"message": "Missing item_number"}
401—{"status": "error", "message": "Invalid API key"}
GET

Reserve Serial Numbers

/{tenant-code}/{location}/api/v1/manufacturing/receive/last-encoded-serial
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
incrementSerialCountintegerrequiredNumber of serials to reserve.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/last-encoded-serial?api_key=$SENITRON_API_KEY&incrementSerialCount=<incrementSerialCount>"

Success response

JSONHTTP 200
{
  "lastEncodedSerial": 1025
}

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Atomically advances the tenant's last encoded serial by incrementSerialCount and returns the first reserved serial. Note: this GET changes data.

POST

Set Last Encoded Serial

/{tenant-code}/{location}/api/v1/manufacturing/receive/save-last-encoded-serial
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "lastEncodedSerial": 1100
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"message": "Missing last encoded serial"}
400—{"message": "Error saving last encoded serial"}
401—{"status": "error", "message": "Invalid API key"}
POST

Cancel Reception (Reset to Pending)

/{tenant-code}/{location}/api/v1/manufacturing/receive/cancel-reception/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathrequiredExternal receive (reception) id.

Try it with curl

Shell
curl -X POST "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/manufacturing/receive/cancel-reception/<id>?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "id": 41,
  "receiving_id": "PO-7781",
  "vendor_name": "Acme Supplies",
  "status": "pending"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Sets the reception back to pending and returns it (all columns, shortened here).

POST

Kill Cancelled Reception Tags

/{tenant-code}/{location}/api/v1/manufacturing/receive/kill-tags
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "epcs": [
    "30340212C8044C4000000401"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "Cancelled tags have been killed"
}

Errors

HTTPTypeMessage
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"}
Notes
  • Sets the EPCs of a cancelled reception to Tag Killed (refused if any of them is Live).

GET

Undo Check: Tags Live

/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_tags_live_status
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
epcs[]stringrequiredEPCs (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"tags": [{"asset_id": "1025", "status": "Quality Hold"}]}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • OK when every EPC is Live; otherwise lists the tags that are not.

GET

Undo Check: Tag Quantities Unchanged

/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_tags_quantities
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
epcs[]stringrequiredEPCs (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"tags": [<tag records whose quantity changed>]}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • OK when every tag still has its initial quantity.

GET

Undo Check: SO Allocations

/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_so_allocations
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
epcs[]stringrequiredEPCs (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
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"}
Notes
  • OK when none of the EPCs is allocated to a sales order.

GET

Undo Check: ERP API Errors

/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo/check_api_error
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
epcs[]stringrequiredEPCs (repeat the parameter).
po_numberstringrequiredPurchase order number.

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "No API Error"
}

Errors

HTTPTypeMessage
200—{"message": "All API Error"}
400—{"message": "Not allowed"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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). Otherwise Not allowed.

General Mode APIs

Manufacturing Integration (ERP)

GET

Get Manufacturing Settings

/{tenant-code}/api/v1/manufacturing/integration/settings
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/settings?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
{
  "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Tenant manufacturing settings (created with defaults on first call; more columns than shown).

PATCH

Update Receiving Posting Date Range

/{tenant-code}/api/v1/manufacturing/integration/settings
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"message": "Error saving settings"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Sets the allowed posting date range for receiving orders. Both fields are written (an omitted one is cleared).

GET

List Integration Users

/{tenant-code}/api/v1/manufacturing/integration/users
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/users?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Calls are stored in the integration log.

POST

Create or Update Integration User

/{tenant-code}/api/v1/manufacturing/integration/users
Also at PUT /{tenant-code}/api/v1/manufacturing/integration/users
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "username": "DOMAIN\\jdoe",
  "full_name": "Jane Doe",
  "email": "jdoe@acme.com"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
406—{"status": "error", "message": {"email": ["is invalid"]}}
406—{"status": "error", "message": "Error updating user"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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

Delete Integration User

/{tenant-code}/api/v1/manufacturing/integration/users/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathoptionalNot used (optional).
emailstringrequiredEmail of the user to delete.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/users/<id>?api_key=$SENITRON_API_KEY&email=<email>"

Success response

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"status": "error", "message": {}}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Deletes the Senitron user and the integration user with this email. The /{id} segment is optional.

  • Calls are stored in the integration log.

GET

List Storage Units (UOMs)

/{tenant-code}/api/v1/manufacturing/integration/storage-units
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/api/v1/manufacturing/integration/storage-units?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • All storage units (units of measure) of the tenant.

  • Calls are stored in the integration log.

POST

Create or Update Storage Unit

/{tenant-code}/api/v1/manufacturing/integration/storage-units
Also at PUT /{tenant-code}/api/v1/manufacturing/integration/storage-units
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "item_number": "CTUB-20062",
  "name": "CS",
  "measure_unit": "12",
  "background_job": false
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"message": "Error saving storage unit: <errors>"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Upserts the storage unit name of item_number (measure_unit = base units per storage unit). background_job: true queues it and returns HTTP 201 "ok".

  • heartbeat: true only checks connectivity and returns {"message": "ok"}.

  • Calls are stored in the integration log.

DELETE

Delete Storage Unit

/{tenant-code}/api/v1/manufacturing/integration/storage-units/{id}
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
idpathoptionalNot used (optional).
item_numberstringrequiredItem number.
namestringrequiredStorage unit name.

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"message": "Error deleting storage unit"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Calls are stored in the integration log.

POST

Apply Item Charge to Lot

/{tenant-code}/{location}/api/v1/manufacturing/receive/charge_items
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 77,
  "nav_lot_number": "L-20261007",
  "item_number": "CTUB-20062",
  "source_reference": "PO-7781",
  "unit_cost": 1.55
}

Errors

HTTPTypeMessage
406—{"message": "<validation errors>"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

POST

Revalue Lot Cost

/{tenant-code}/{location}/api/v1/manufacturing/lot_revaluation
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "lot_no": "L-20261007",
  "item_number": "CTUB-20062",
  "cost_per_unit": 1.62
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "id": 77,
  "nav_lot_number": "L-20261007",
  "item_number": "CTUB-20062",
  "source_reference": "PO-7781",
  "unit_cost": 1.62
}

Errors

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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.

General Mode APIs

Manufacturing ERP Orders

GET

List ERP Purchase Orders

/{tenant-code}/{location}/api/v1/external_receive
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_receive?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Purchase orders received from the ERP for manufacturing receiving (all columns, shortened here).

  • Calls are stored in the ERP order log.

POST

Create or Update ERP Purchase Order

/{tenant-code}/{location}/api/v1/external_receive
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"status": "error", "message": "Error saving receive data"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Upserts the PO by receiving_id and its lines by nav_line_number. A completed PO only has invoiced updated. send_api_time is YYYY-MM-DD HH:MM; locked: YES/NO.

  • Calls are stored in the ERP order log.

PUT

Update ERP Purchase Order

/{tenant-code}/{location}/api/v1/external_receive
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"status": "error", "message": "INVALID LOCATION CODE"}
400—{"status": "error", "message": "Error saving receive data"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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

Delete ERP Purchase Order Lines

/{tenant-code}/{location}/api/v1/external_receive
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "Items": [
    {
      "nav_line_number": 10000
    }
  ],
  "api_key": "<tenant api key>",
  "receiving_id": "PO-7781"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "success"
}

Errors

HTTPTypeMessage
404—{"status": "error", "message": "Purchase order doesn't exist"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Deletes the listed lines (by nav_line_number) of the PO.

  • Calls are stored in the ERP order log.

GET

List ERP Sales Orders

/{tenant-code}/{location}/api/v1/external_shipment
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.
pageintegeroptionalDefault 1.
per_pageintegeroptionalDefault 20.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/external_shipment?api_key=$SENITRON_API_KEY"

Success response

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Sales orders received from the ERP for picking/shipping (all columns, shortened here).

  • Calls are stored in the ERP order log.

POST

Create or Update ERP Sales Order

/{tenant-code}/{location}/api/v1/external_shipment
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"status": "error", "message": "Error saving shipment data"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Upserts the SO by salesorder_id and its lines by nav_line_number; line item_number is the item's ALU. scan_based_trading: yes enables auto-pick; so_in_transit: yes marks it in transit.

  • Calls are stored in the ERP order log.

PUT

Update ERP Sales Order

/{tenant-code}/{location}/api/v1/external_shipment
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"status": "error", "message": "INVALID LOCATION CODE"}
400—{"status": "error", "message": "<errors>"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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

Delete ERP Sales Order Lines

/{tenant-code}/{location}/api/v1/external_shipment
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "Items": [
    {
      "nav_line_number": 10000
    }
  ],
  "api_key": "<tenant api key>",
  "salesorder_id": "SO-1001"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": "success"
}

Errors

HTTPTypeMessage
404—{"status": "error", "message": "Sales order doesn't exist"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Deletes the listed lines of the SO.

  • Calls are stored in the ERP order log.

General Mode APIs

Manufacturing Documents (PDF)

GET

Reception Label Cover Page

/{tenant-code}/{location}/api/v1/printing/details/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
job_idsstringoptionalComma-separated tagging job ids.
job_idintegeroptionalSingle tagging job id (when job_ids is not sent).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/details/<id>.pdf" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Cover page for printed reception/tagging labels.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales Order Pick List

/{tenant-code}/{location}/api/v1/printing/pick-list/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales order process id.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/pick-list/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Pick list of a sales order process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales Order Packing List

/{tenant-code}/{location}/api/v1/printing/packing-list/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales order process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/packing-list/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Packing list of a sales order process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales Order Invoice

/{tenant-code}/{location}/api/v1/printing/invoice/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales order process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/invoice/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Invoice of a sales order process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales Order Cover Page (BOL)

/{tenant-code}/{location}/api/v1/printing/so-cover/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales order process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-cover/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Bill-of-lading cover page of a sales order process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Ship-out Cover Page

/{tenant-code}/{location}/api/v1/printing/shipout-cover/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales order process id.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/shipout-cover/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Ship-out cover page of a sales order process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Pallet License Plates

/{tenant-code}/{location}/api/v1/printing/pallet-license/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales order process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/pallet-license/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Pallet license plates of a sales order process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales-to-Zone Pick List

/{tenant-code}/{location}/api/v1/printing/so-zone-pick-list/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales-to-zone process id.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-pick-list/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Pick list of a sales-to-zone process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales-to-Zone Packing List

/{tenant-code}/{location}/api/v1/printing/so-zone-packing-list/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales-to-zone process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-packing-list/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Packing list of a sales-to-zone process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales-to-Zone Invoice

/{tenant-code}/{location}/api/v1/printing/so-zone-invoice/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales-to-zone process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-invoice/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Invoice of a sales-to-zone process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales-to-Zone Cover Page (BOL)

/{tenant-code}/{location}/api/v1/printing/so-zone-cover/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales-to-zone process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-cover/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Bill-of-lading cover page of a sales-to-zone process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales-to-Zone Ship-out Cover Page

/{tenant-code}/{location}/api/v1/printing/so-zone-shipout-cover/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales-to-zone process id.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-shipout-cover/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Ship-out cover page of a sales-to-zone process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Sales-to-Zone Pallet License Plates

/{tenant-code}/{location}/api/v1/printing/so-zone-pallet-license/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredPrinter id (its document template is used).
soProcessIdintegerrequiredSales-to-zone process id.
copiesintegeroptionalCopies (default 1).

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/so-zone-pallet-license/<id>.pdf?soProcessId=<soProcessId>" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Pallet license plates of a sales-to-zone process.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

GET

Quality Hold Document

/{tenant-code}/{location}/api/v1/printing/quality-hold/{id}
General modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
idpathrequiredQuality hold id.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/printing/quality-hold/<id>.pdf" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Quality hold report.

  • Returns a PDF (request the .pdf format, e.g. …/{id}.pdf?soProcessId=…); .html returns the HTML preview and adding debug shows the PDF as HTML. No authentication is checked — these URLs are fetched by the CDM print script.

General Mode APIs

Reports

POST

Add ERP Report Card

/{tenant-code}/{location}/api/v1/reports/add-report-card
General modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "ERP Report Card imported"
}

Errors

HTTPTypeMessage
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"}
Notes
  • 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.

04

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.

60 endpoints · 11 groups
Web App APIs

Custom Fields (Web App)

POST

Create Service Field

/{tenant-code}/{location}/api/v1/fields
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "title": "Warranty (months)",
  "data_type": "number"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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"
  }
]
Notes
  • 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.

PUT

Update Service Field

/{tenant-code}/{location}/api/v1/fields/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
idpathrequiredField id.

Request body

JSON
{
  "title": "Warranty (months)",
  "data_type": "string"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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

Delete Service Field

/{tenant-code}/{location}/api/v1/fields/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
idpathrequiredField id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/fields/<id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
[]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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.

POST

Create Requirement Field

/{tenant-code}/{location}/api/v1/requirement_fields
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "title": "Warranty (months)",
  "data_type": "number"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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"
  }
]
Notes
  • 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.

PUT

Update Requirement Field

/{tenant-code}/{location}/api/v1/requirement_fields/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
idpathrequiredField id.

Request body

JSON
{
  "title": "Warranty (months)",
  "data_type": "string"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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

Delete Requirement Field

/{tenant-code}/{location}/api/v1/requirement_fields/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
idpathrequiredField id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/requirement_fields/<id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
[]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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.

Web App APIs

Transfer Slip Receiving (Web App)

POST

Commit Transfer Slip Receiving

/{tenant-code}/{location}/api/v1/transferslip/receiving
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "The transfer receiving data has been received, and a job has been scheduled to process it"
}

Errors

HTTPTypeMessage
404NOT_FOUNDThe source store is not found. Please enter store code
400BAD_REQUESTSet mandatory field(s): DOC#, Reason
404NOT_FOUNDPrinter not found
Notes
  • Receives the EPCs collected in the user's receiving session (see Add Receiving Reads). Without transferslip_id a transfer-out from the source is created first.

  • Mandatory fields follow the location's transfer settings. printer_id is 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.

POST

Start Receiving Reader

/{tenant-code}/{location}/api/v1/transferslip/receiving/start
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "reader_id": 12,
  "from": "002",
  "sub_zone_id": ""
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
404—{"error": "Reader does not selected"}
404—{"error": "From does not selected"}
404—{"error": "CDM not found"}
Notes
  • 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.

POST

Stop Receiving Reader

/{tenant-code}/{location}/api/v1/transferslip/receiving/stop
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "reader_id": 12
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "CDM not found"}
Notes
  • Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.

GET

Get Receiving Summary

/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
fromstringrequiredSource location code of the transfer.
transferslip_idintegeroptionalTransfer slip id (receiving an existing slip).
reader_idintegeroptionalReader id.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets?from=<from>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
{
  "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
}
Notes
  • 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.

POST

Add Receiving Reads

/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "From does not selected"}
Notes
  • Adds reads to the receiving session (action_type: "remove" removes them). With transferslip_id only 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

Get Receiving Assets (HTML)

/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/assets
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
fromstringrequiredSource location code of the transfer.
transferslip_idintegeroptionalTransfer slip id (receiving an existing slip).
reader_idintegeroptionalReader id.
item_numberstringoptionalOnly this item.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets/assets?from=<from>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
{
  "note": "JavaScript/HTML fragment for the web page"
}
Notes
  • 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.

DELETE

Remove Receiving Asset

/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
idpathrequiredTemp asset id.
fromstringrequiredSource location code of the transfer.
transferslip_idintegeroptionalTransfer slip id (receiving an existing slip).
reader_idintegeroptionalReader id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/transferslip/receiving_temp_assets/<id>?from=<from>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
{
  "result": "<HTML table of the remaining assets>"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.

DELETE

Remove Receiving Item

/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/delete_item/{item_number}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
item_numberpathrequiredItem number (undefined = reads without item).
fromstringrequiredSource location code of the transfer.
transferslip_idintegeroptionalTransfer slip id (receiving an existing slip).
reader_idintegeroptionalReader id.

Try it with curl

Shell
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

JSONHTTP 200
{
  "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
}
Notes
  • Web-app endpoint: requires a signed-in Senitron web session (browser cookie). It is not usable with a token or API key.

DELETE

Clear Receiving Session

/{tenant-code}/{location}/api/v1/transferslip/receiving_temp_assets/delete_all
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
fromstringrequiredSource location code of the transfer.
transferslip_idintegeroptionalTransfer slip id (receiving an existing slip).
reader_idintegeroptionalReader id.

Try it with curl

Shell
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

JSONHTTP 200
{
  "items": [],
  "skus_count": 0,
  "assets_count": 0,
  "expected_skus_count": 0,
  "expected_assets_count": 0
}
Notes
  • 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.

Web App APIs

Catalog Import (Web App)

POST

Validate Catalog File

/{tenant-code}/api/v1/catalog/validate_catalog_file
Web App modeWeb session

Request headers

HeaderValue
Content-Typemultipart/form-data
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
filefilerequiredCatalog file (multipart/form-data).
csv_typestringrequiredsystem, simple, lightspeed or coci_catalog_item_part.
request_typestringrequiredValidator: SystemCsv, SimpleJson, LightspeedCsv or CociItemPart.
refreshstringoptionalon = full refresh (replace catalog); requires pin_number.
pin_numberstringoptionalUser PIN (refresh only).
notification_emailstringoptionalDefault: the user's email.

Try it with curl

Shell
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

JSONHTTP 200
{
  "success": true,
  "catalog_id": 912
}

Errors

HTTPTypeMessage
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>"]}
Notes
  • Step 1 of the web catalog import: stores and validates the file. Pass the returned catalog_id to 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.

POST

Start Catalog Import

/{tenant-code}/api/v1/catalog
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "catalog_id": 912,
  "csv_type": "system"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "note": "HTTP 302 redirect back to the referring page"
}
Notes
  • 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.

POST

Generate Catalog Import Report

/{tenant-code}/api/v1/catalog/generate_report
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Request body

JSON
{
  "catalog_id": 912
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "note": "HTTP 204 (no content)"
}
Notes
  • 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.

Web App APIs

Manufacturing Receiving (Web App)

POST

Save Reception Labels

/{tenant-code}/{location}/api/v1/manufacturing/receive/save-labels
Web App modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
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"}
Notes
  • Creates one tag per label with status Pending Reception (labels saved before for this line are killed). lotExpDate is YYYY-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).

POST

Print Reception Labels

/{tenant-code}/{location}/api/v1/manufacturing/receive/print-labels
Web App modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"message": "Missing labels"}
400—{"message": "Missing printer id"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • Prints the saved labels in the background (and the cover page if the printer has one). Labels flagged missingExpDate trigger 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).

POST

Finish Receiving Item

/{tenant-code}/{location}/api/v1/manufacturing/receive/finish-receiving-item
Web App modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "receivingId": "PO-7781",
  "itemId": 55,
  "postingDate": "2026-10-07",
  "manualOverride": false,
  "epcs": [
    "30340212C8044C4000000401"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"message": "Missing Ext. Receiving ID"}
400—{"message": "Missing epcs"}
400—{"message": "Reception item not found"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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).

POST

Undo Receiving Item (Legacy)

/{tenant-code}/{location}/api/v1/manufacturing/receive/undo-receiving-item
Web App modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "receivingId": "PO-7781",
  "itemId": 55,
  "epcs": [
    "30340212C8044C4000000401"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"message": "Missing Ext. Receiving ID"}
400—{"message": "Reception item not found"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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).

POST

Undo Receiving

/{tenant-code}/{location}/api/v1/manufacturing/receiving/undo
Web App modeAPI key

Request headers

HeaderValue
Content-Typeapplication/json

Parameters

NameTypeDescription
api_keystringrequiredTenant API key.

Request body

JSON
{
  "api_key": "<tenant api key>",
  "receivingId": "PO-7781",
  "itemId": 55,
  "call_nav": true,
  "epcs": [
    "30340212C8044C4000000401"
  ]
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
400—{"message": "Missing Ext. Receiving ID"}
400—{"message": "Reception item not found"}
400—{"message": "<reason>"}
401—{"status": "error", "message": "Invalid API key"}
Notes
  • 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).

Web App APIs

CRM Users

POST

CRM PIN Login

/{tenant-code}/{location}/api/v1/crm/users/pin_login
Web App modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Request body

JSON
{
  "pin": "1234"
}

Try it with curl

Shell
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

JSONHTTP 200
{
  "message": "OK"
}

Errors

HTTPTypeMessage
401—{"message": "Unable to authorise user with provided PIN number"}
401—Unauthorized (CRM module disabled)
Notes
  • 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 pin cookie for shipping/return actions.

Web App APIs

CRM Customers

PUT

Update CRM Customer

/{tenant-code}/{location}/api/v1/crm/customers/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
idpathrequiredCustomer id.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "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

HTTPTypeMessage
400—{"fields": {"company": "Already taken!"}}
400<exception class><exception message>
Notes
  • 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).

POST

Add Customer Contact

/{tenant-code}/{location}/api/v1/crm/customers/{customer_id}/contacts
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
customer_idpathrequiredCustomer id.

Request body

JSON
{
  "title": "Receiving"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 21,
    "title": "Receiving",
    "name": "Sam Lee",
    "tel1": "+1 408 555 0100",
    "tel2": "",
    "fax": "",
    "email": "receiving@retailco.com",
    "user_id": 110
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

PUT

Update Customer Contact

/{tenant-code}/{location}/api/v1/crm/customers/{customer_id}/contacts/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
customer_idpathrequiredCustomer id.
idpathrequiredContact id.

Request body

JSON
{
  "title": "Receiving",
  "name": "Sam Lee",
  "tel1": "+1 408 555 0100",
  "tel2": "",
  "fax": "",
  "email": "receiving@retailco.com"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 21,
    "title": "Receiving",
    "name": "Sam Lee",
    "tel1": "+1 408 555 0100",
    "tel2": "",
    "fax": "",
    "email": "receiving@retailco.com",
    "user_id": 110
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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

Delete Customer Contact

/{tenant-code}/{location}/api/v1/crm/customers/{customer_id}/contacts/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
customer_idpathrequiredCustomer id.
idpathrequiredContact id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/customers/<customer_id>/contacts/<id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
[]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

Web App APIs

CRM Customer Locations

PUT

Update CRM Customer Location

/{tenant-code}/{location}/api/v1/crm/locations/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
idpathrequiredCustomer location id.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 71,
  "name": "Retail Co – Store 12",
  "code": "RC12",
  "shipping_formatted_address": "1660 Winchester Blvd, Campbell, CA 95008, USA",
  "shipping_address_valid": true
}

Errors

HTTPTypeMessage
400—{"fields": {"name": "Already taken!"}}
404—Unknown id (record not found)
Notes
  • 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).

POST

Add Location Contact

/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/contacts
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
location_idpathrequiredLocation id.

Request body

JSON
{
  "title": "Receiving"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 21,
    "title": "Receiving",
    "name": "Sam Lee",
    "tel1": "+1 408 555 0100",
    "tel2": "",
    "fax": "",
    "email": "receiving@retailco.com",
    "user_id": 110
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

PUT

Update Location Contact

/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/contacts/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
location_idpathrequiredLocation id.
idpathrequiredContact id.

Request body

JSON
{
  "title": "Receiving",
  "name": "Sam Lee",
  "tel1": "+1 408 555 0100",
  "tel2": "",
  "fax": "",
  "email": "receiving@retailco.com"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 21,
    "title": "Receiving",
    "name": "Sam Lee",
    "tel1": "+1 408 555 0100",
    "tel2": "",
    "fax": "",
    "email": "receiving@retailco.com",
    "user_id": 110
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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

Delete Location Contact

/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/contacts/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
location_idpathrequiredLocation id.
idpathrequiredContact id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/contacts/<id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
[]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

POST

Add Location Holiday Hours

/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/holiday_hours
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
location_idpathrequiredLocation id.

Request body

JSON
{
  "title": "Standard"
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

PUT

Update Location Holiday Hours

/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/holiday_hours/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
location_idpathrequiredLocation id.
idpathrequiredHoliday Hours id.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
[
  {
    "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

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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) and alt_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

Delete Location Holiday Hours

/{tenant-code}/{location}/api/v1/crm/locations/{location_id}/holiday_hours/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
location_idpathrequiredLocation id.
idpathrequiredHoliday Hours id.

Try it with curl

Shell
curl -X DELETE "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/locations/<location_id>/holiday_hours/<id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
[]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

Web App APIs

CRM Orders

POST

Add Order Item

/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
order_idpathrequiredOrder id.

Request body

JSON
{
  "item_id": 597116190
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 301,
    "item_number": "000420",
    "description": "Finished good",
    "ordered_qty": 20,
    "shipped_qty": 0,
    "unit_price": 10.0
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

PUT

Update Order Item

/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/items/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
order_idpathrequiredOrder id.
idpathrequiredLine id.

Request body

JSON
{
  "ordered_qty": 24,
  "unit_price": 9.5
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 301,
    "item_number": "000420",
    "description": "Finished good",
    "ordered_qty": 20,
    "shipped_qty": 0,
    "unit_price": 10.0
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
400—{"message": "<validation errors>"}
Notes
  • 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).

DELETE

Remove Order Items

/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
order_idpathrequiredOrder id.
id[]integerrequiredLine ids (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
[]
Notes
  • 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).

PUT

Update Order Schedule Item

/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/schedule_items/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
order_idpathrequiredOrder id.
idpathrequiredSchedule line id.

Request body

JSON
{
  "ordered_qty": 12,
  "unit_price": 9.5
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 301,
    "item_number": "000420",
    "description": "Finished good",
    "ordered_qty": 20,
    "shipped_qty": 0,
    "unit_price": 10.0
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
400—{"message": "<validation errors>"}
Notes
  • 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).

DELETE

Remove Order Schedule Items

/{tenant-code}/{location}/api/v1/crm/orders/{order_id}/schedule_items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
order_idpathrequiredOrder id.
id[]integerrequiredSchedule line ids (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
[]
Notes
  • 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).

Web App APIs

CRM Shipping Schedules

POST

Add Schedule Item

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.

Request body

JSON
{
  "item_id": 597116190
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 301,
    "item_number": "000420",
    "description": "Finished good",
    "ordered_qty": 20,
    "shipped_qty": 0,
    "unit_price": 10.0
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

PUT

Update Schedule Item

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/items/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.
idpathrequiredLine id.

Request body

JSON
{
  "ordered_qty": 12,
  "unit_price": 9.5
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 301,
    "item_number": "000420",
    "description": "Finished good",
    "ordered_qty": 20,
    "shipped_qty": 0,
    "unit_price": 10.0
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
400—{"message": "<validation errors>"}
Notes
  • 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).

DELETE

Remove Schedule Items

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.
id[]integerrequiredLine ids (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
[]
Notes
  • 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).

GET

Shipping Schedule BOL (PDF)

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/preview
Web App modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.
printer_idintegeroptionalPrinter whose BOL template is used.
copiesintegeroptionalDefault 1.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/preview.pdf" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Returns a PDF (request the .pdf format); .html returns the HTML preview, debug shows 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.

GET

Print Shipping Schedule BOL

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/print
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.
printer_idintegerrequiredPrinter id.
copiesintegeroptionalDefault 1.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/schedules/<schedule_id>/print?printer_id=<printer_id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
{}

Errors

HTTPTypeMessage
400<exception class><exception message>
Notes
  • 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).

POST

Start Ship-out Reader

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs/start
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie>; pin=<operator CRM PIN>

Parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.
reader_idintegerrequiredReader id.

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "CDM not found"}
Notes
  • 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 pin cookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.

POST

Stop Ship-out Reader

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs/stop
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie>; pin=<operator CRM PIN>

Parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.
reader_idintegerrequiredReader id.

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "CDM not found"}
Notes
  • 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 pin cookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.

POST

Save Ship-out Progress

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs/snapshot
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie>; pin=<operator CRM PIN>

Parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.

Request body

JSON
{
  "data": {
    "items": [
      {
        "item_number": "000420",
        "tags": [
          "30340212C8044C4000000401"
        ]
      }
    ]
  }
}

Try it with curl

Shell
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

JSONHTTP 200
{}
Notes
  • 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 pin cookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.

POST

Ship Schedule

/{tenant-code}/{location}/api/v1/crm/schedules/{schedule_id}/ship_outs
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie>; pin=<operator CRM PIN>

Parameters

NameTypeDescription
schedule_idpathrequiredSchedule id.

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "Printer not found"}
400—{"error": "Can modify only firmed status"}
400—{"error": "<message>"}
Notes
  • 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 (qty copies).

  • 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 pin cookie holding the operator's CRM PIN (see CRM PIN Login); the operator is recorded on the shipment/return.

Web App APIs

CRM Invoices

POST

Add Invoice Item

/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
invoice_idpathrequiredInvoice id.

Request body

JSON
{
  "item_id": 597116190
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 401,
    "item_number": "000420",
    "description": "Finished good",
    "qty": 20,
    "unit_price": 10.0,
    "locked": false
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • 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).

PUT

Update Invoice Item

/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/items/{id}
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Parameters

NameTypeDescription
invoice_idpathrequiredInvoice id.
idpathrequiredLine id.

Request body

JSON
{
  "qty": 20,
  "unit_price": 10.0
}

Try it with curl

Shell
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

JSONHTTP 200
[
  {
    "id": 401,
    "item_number": "000420",
    "description": "Finished good",
    "qty": 20,
    "unit_price": 10.0,
    "locked": false
  }
]

Errors

HTTPTypeMessage
404—Unknown id (record not found)
400—{"message": "<validation errors>"}
Notes
  • 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).

DELETE

Remove Invoice Items

/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/items
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
invoice_idpathrequiredInvoice id.
id[]integerrequiredLine ids (repeat the parameter).

Try it with curl

Shell
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

JSONHTTP 200
[]
Notes
  • 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).

GET

Invoice (PDF)

/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/preview
Web App modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
invoice_idpathrequiredInvoice id.
printer_idintegeroptionalPrinter whose invoice template is used.
copiesintegeroptionalDefault 1.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/preview.pdf" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Returns a PDF (request the .pdf format); .html returns the HTML preview, debug shows 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.

GET

Print Invoice

/{tenant-code}/{location}/api/v1/crm/invoices/{invoice_id}/print
Web App modeWeb session

Request headers

HeaderValue
Content-Typeapplication/json
Cookie<Senitron web session cookie> (signed in to the web app)

Query parameters

NameTypeDescription
invoice_idpathrequiredInvoice id.
printer_idintegerrequiredPrinter id.
copiesintegeroptionalDefault 1.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/invoices/<invoice_id>/print?printer_id=<printer_id>" \
  -H "Cookie: $SENITRON_SESSION"

Success response

JSONHTTP 200
{}

Errors

HTTPTypeMessage
400<exception class><exception message>
Notes
  • 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).

Web App APIs

CRM Returns

POST

Start Return Reader

/{tenant-code}/{location}/api/v1/crm/returns/start
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookiepin=<operator CRM PIN>

Parameters

NameTypeDescription
reader_idintegerrequiredReader id.

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "CDM not found"}
Notes
  • Web-app endpoint (CRM module). Authenticated only by the pin cookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.

POST

Stop Return Reader

/{tenant-code}/{location}/api/v1/crm/returns/stop
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookiepin=<operator CRM PIN>

Parameters

NameTypeDescription
reader_idintegerrequiredReader id.

Try it with curl

Shell
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

JSONHTTP 200
{
  "status": 200
}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "CDM not found"}
Notes
  • Web-app endpoint (CRM module). Authenticated only by the pin cookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.

POST

Save Return Progress

/{tenant-code}/{location}/api/v1/crm/returns/snapshot
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookiepin=<operator CRM PIN>

Request body

JSON
{
  "data": {
    "items": [
      {
        "item_number": "000420",
        "tags": [
          "30340212C8044C4000000401"
        ]
      }
    ]
  }
}

Try it with curl

Shell
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

JSONHTTP 200
{}
Notes
  • Stores the operator's in-progress return scan (HTTP 201).

  • Web-app endpoint (CRM module). Authenticated only by the pin cookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.

POST

Create CRM Return

/{tenant-code}/{location}/api/v1/crm/returns
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookiepin=<operator CRM PIN>

Request body

JSON
{
  "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

Shell
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

JSONHTTP 200
{
  "id": 18
}

Errors

HTTPTypeMessage
404—{"error": "Reader not found"}
404—{"error": "Printer not found"}
400—{"error": "<message>"}
Notes
  • 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 pin cookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.

GET

Return Document (PDF)

/{tenant-code}/{location}/api/v1/crm/returns/{return_id}/preview
Web App modeNo auth

Request headers

HeaderValue
Content-Typeapplication/json

Query parameters

NameTypeDescription
return_idpathrequiredReturn id.
printer_idintegeroptionalPrinter whose template is used.
copiesintegeroptionalDefault 1.

Try it with curl

Shell
curl "https://app.senitron.net/${TENANT}/${LOCATION}/api/v1/crm/returns/<return_id>/preview.pdf" \
  -o document.pdf

Success response

JSONHTTP 200
{
  "note": "PDF document"
}

Errors

HTTPTypeMessage
404—Unknown id (record not found)
Notes
  • Returns a PDF (request the .pdf format); .html returns the HTML preview, debug shows 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.

GET

Print Return Document

/{tenant-code}/{location}/api/v1/crm/returns/{return_id}/print
Web App modeCRM PIN

Request headers

HeaderValue
Content-Typeapplication/json
Cookiepin=<operator CRM PIN>

Query parameters

NameTypeDescription
return_idpathrequiredReturn id.
printer_idintegerrequiredPrinter id.

Try it with curl

Shell
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

JSONHTTP 200
{}

Errors

HTTPTypeMessage
400<exception class><exception message>
Notes
  • Sends the return document to the printer through the location's CDM.

  • Web-app endpoint (CRM module). Authenticated only by the pin cookie holding the operator's CRM PIN (see CRM PIN Login), whose return-page permissions are checked; the CRM module must be enabled.