NPD IT e-Scanner reads GS1 DataMatrix, EAN-13/8, UPC, QR, Code 128, Code 39, Aztec, PDF417 and more — then instantly parses structured fields like GTIN, batch number, expiry date, serial number, and Apple product box details (IMEI, model, part number). Share, copy or send data via Bluetooth or API.
From warehouse scanning to retail audits — one app, three send modes, zero friction.
QR, GS1 DataMatrix, EAN-13/8, UPC-A/E, Code 128, Code 39, Code 93, Codabar, ITF-14, PDF417, Aztec and more.
Automatically splits GS1 DataMatrix into structured fields: GTIN, batch, expiry date, serial number, country of origin, and more.
Decodes Apple product box 2D barcodes to extract IMEI, model number, part number, and serial number.
Scanned values are sent via Bluetooth as if they were scanned by a standard barcode scanner.
Display scanned data, then copy or share the complete scan or individual fields.
Send scanned data to any API endpoint. Supports multiple endpoints with flexible request and response configuration using variables.
Organize scans into sessions. Export or share complete session data as CSV.
Access all scanned data, organized by date or scan session.
Scan now, send later. Send data from history or scan sessions via Bluetooth or API whenever you need.
Fine-tune how values are sent — automatically append Enter or Tab, trim whitespace, or strip leading zeros from GTIN codes.
Pair your phone as a Bluetooth keyboard. Scanned values are sent as if typed by a standard barcode scanner — no driver, no software required.
Click the field below, then scan a barcode in the app using Bluetooth mode and pick a field to send. The value should appear here as if typed by a barcode scanner.
Pair the phone with your computer as a Bluetooth keyboard — one-time setup.
Configure a JSON endpoint, test it live in the browser, then drop the config straight into the app.
The app sends scan data by executing a JSON config you define. Use {{token}} placeholders anywhere in the URL, headers, or body.
Built-in variables
| Token | Value |
|---|---|
| {{scannedFieldName}} | Label of the field being sent (e.g. "GTIN", "Serial") |
| {{scannedFieldValue}} | The actual scanned/parsed value |
| {{scanSessionName}} | Active session name, or empty string |
| {{scanDateTime}} | ISO-8601 timestamp of the scan |
Secret variables
Add any number of key/value secrets in Settings → API → Edit endpoint. Reference them as:
Secrets are stored masked. Managers can set tokens (API keys, Bearer tokens) that operators can't read.
request (method, url, headers?, body?, timeout?) +
responses map of HTTP status codes → {message, color?}.
Always include a "default" response entry.
Timeout is in milliseconds (e.g. 30000 = 30 s).
Paste your JSON config, fill in variable values, add secrets, then fire a real HTTP request from this browser. When it works here, paste the same JSON into the app.
Or paste your own config above. Loading an example keeps your current variables and secrets.
Access-Control-Allow-Origin headers. If you see a CORS error here, your server needs to allow requests from this origin. The mobile app is not affected by CORS.
{
"request": {
"method": "POST",
"url": "https://your-server.com/api/scan",
"headers": { "Content-Type": "application/json" },
"body": "{\"field\":\"{{scannedFieldName}}\",\"value\":\"{{scannedFieldValue}}\",\"session\":\"{{scanSessionName}}\",\"time\":\"{{scanDateTime}}\"}",
"timeout": 10000
},
"responses": {
"200": { "message": "Saved successfully", "color": "green" },
"400": { "message": "Bad request", "color": "orange" },
"500": { "message": "Server error", "color": "red" },
"default": { "message": "Unexpected response" }
}
}
{
"request": {
"method": "GET",
"url": "https://your-server.com/api/lookup?value={{scannedFieldValue}}&field={{scannedFieldName}}&session={{scanSessionName}}",
"timeout": 10000
},
"responses": {
"200": { "message": "Found", "color": "green" },
"404": { "message": "Not found", "color": "orange" },
"default": { "message": "Unexpected response" }
}
}
{
"request": {
"method": "POST",
"url": "https://your-server.com/api/scan",
"headers": {
"Content-Type": "application/json",
"Authorization": "Bearer {{apiToken}}"
},
"body": "{\"value\":\"{{scannedFieldValue}}\",\"field\":\"{{scannedFieldName}}\"}",
"timeout": 30000
},
"responses": {
"200": { "message": "Sent", "color": "green" },
"401": { "message": "Unauthorized — check apiToken secret", "color": "red" },
"default": { "message": "Unexpected response" }
}
}
Add a secret with key apiToken in the app's endpoint editor.
<?php
header('Content-Type: application/json');
header('Access-Control-Allow-Origin: *'); // allow browser tester
$raw = file_get_contents('php://input');
$data = json_decode($raw, true);
$field = $data['field'] ?? '';
$value = $data['value'] ?? '';
$session = $data['session'] ?? '';
$time = $data['time'] ?? '';
// --- your logic here ---
// e.g. save to database, trigger a workflow, etc.
error_log("Scan: $field = $value (session: $session)");
http_response_code(200);
echo json_encode(['status' => 'ok', 'received' => $value]);
?>
const express = require('express');
const app = express();
app.use(express.json());
// Allow browser tester (remove in production or restrict origin)
app.use((req, res, next) => {
res.header('Access-Control-Allow-Origin', '*');
res.header('Access-Control-Allow-Headers', 'Content-Type, Authorization');
if (req.method === 'OPTIONS') return res.sendStatus(200);
next();
});
app.post('/api/scan', (req, res) => {
const { field, value, session, time } = req.body;
// --- your logic here ---
console.log(`Scan: ${field} = ${value} (session: ${session})`);
res.json({ status: 'ok', received: value });
});
app.listen(3000, () => console.log('Listening on :3000'));