Android barcode scanning

Scan it. Parse it.
Send it anywhere.

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.

📋 Clipboard 📡 Bluetooth 🔗 API
What you get

Everything a barcode workflow needs

From warehouse scanning to retail audits — one app, three send modes, zero friction.

Wide barcode support

QR, GS1 DataMatrix, EAN-13/8, UPC-A/E, Code 128, Code 39, Code 93, Codabar, ITF-14, PDF417, Aztec and more.

GS1 field parsing

Automatically splits GS1 DataMatrix into structured fields: GTIN, batch, expiry date, serial number, country of origin, and more.

Apple box parsing

Decodes Apple product box 2D barcodes to extract IMEI, model number, part number, and serial number.

Bluetooth mode

Scanned values are sent via Bluetooth as if they were scanned by a standard barcode scanner.

Screen / clipboard mode

Display scanned data, then copy or share the complete scan or individual fields.

API integration

Send scanned data to any API endpoint. Supports multiple endpoints with flexible request and response configuration using variables.

Scan sessions

Organize scans into sessions. Export or share complete session data as CSV.

Scan history

Access all scanned data, organized by date or scan session.

Online or offline

Scan now, send later. Send data from history or scan sessions via Bluetooth or API whenever you need.

Scan value adjustments

Fine-tune how values are sent — automatically append Enter or Tab, trim whitespace, or strip leading zeros from GTIN codes.

Bluetooth HID

Set up Bluetooth mode

Pair your phone as a Bluetooth keyboard. Scanned values are sent as if typed by a standard barcode scanner — no driver, no software required.

⌨
Live test

Test Input

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.

—
0
Tip: If nothing appears, make sure your computer is selected as the Bluetooth Keyboard target in the app (Settings → Bluetooth → tap device name to connect).
🔗
Setup guide

How to Pair

Pair the phone with your computer as a Bluetooth keyboard — one-time setup.

  1. 1 Open the NPD IT e-Scanner app and go to Settings.
  2. 2 Under Send mode, select Bluetooth.
  3. 3 First-time pairing: tap Add new device → Make discoverable as a keyboard. Then on your computer open Bluetooth settings, scan for devices, and select the phone. It will connect automatically once paired.
  4. 4 Reconnecting: tap your computer's name in the Devices list to connect as keyboard target.
  5. 5 Come back to this page, click the Test Input field, scan a code in the app, and pick which field to send.
Important: Always pair from the computer after the phone is discoverable — not the other way around. Phone-initiated pairing doesn't work with the HID profile.
API mode

Connect to any REST endpoint

Configure a JSON endpoint, test it live in the browser, then drop the config straight into the app.

📖
Reference

JSON Config & Variables

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

TokenValue
{{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:

{{myKey}}

Secrets are stored masked. Managers can set tokens (API keys, Bearer tokens) that operators can't read.

Config structure:  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).
🧪
Live tester

Test Your Config

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.

No config loaded yet — paste JSON or choose a sample to enable testing.
CORS note: Browsers block cross-origin requests unless the server sends 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.
📄
Samples

Ready-to-Use Examples

POST — JSON body

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

GET — query string

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

POST — with Bearer token secret

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

<?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]);
?>

Node.js / Express receiver

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'));