boarding-pass-kit
v2.1.7
Published
Parse IATA BCBP v8 boarding pass barcodes and QR codes
Maintainers
Readme
boarding-pass-kit
TypeScript/Node.js library for parsing IATA BCBP v8 boarding pass barcodes and QR codes.
Compliance: IATA Resolution 792 - BCBP Version 8 (Effective June 1, 2020)
Installation
npm install boarding-pass-kitRequires Node.js 18+.
Publishing (maintainers)
Releases are published to npm automatically when a version tag is pushed.
- Bump
versioninpackages/node/package.json - Commit and push to
main - Create and push a matching tag:
git tag v2.1.3
git push origin v2.1.3GitHub Actions runs tests, builds, and publishes via the Publish workflow.
One-time setup: add an npm access token as the NPM_TOKEN repository secret (Settings → Secrets and variables → Actions). Use an Automation or Publish token if you have 2FA enabled.
Quick Start
import { BoardingPassDecoder, DemoData } from 'boarding-pass-kit';
const decoder = new BoardingPassDecoder();
decoder.debug = false;
const pass = decoder.decode(DemoData.Simple);
console.log(pass.passengerName);
console.log(pass.boardingPassLegs[0]!.origin);
console.log(pass.boardingPassLegs[0]!.destination);
console.log(pass.boardingPassLegs[0]!.flightno);Decode from a Buffer:
const pass = decoder.decode(Buffer.from(barcodeString, 'ascii'));Configuration
const decoder = new BoardingPassDecoder();
decoder.debug = false; // Verbose console logging (default: true)
decoder.trimLeadingZeroes = true; // Strip leading zeros from numeric fields
decoder.trimWhitespace = true; // Trim whitespace from parsed fields
decoder.emptyStringIsNil = true; // Convert empty strings to nullJulian Date Conversion
BCBP encodes flight date as a 3-digit day-of-year (001–366). The year is not stored in the barcode.
import { julianToCalendarDate } from 'boarding-pass-kit';
// Explicit year
const date = julianToCalendarDate(14, 2025); // January 14, 2025
// Infer year from reference date (default: today)
const date = julianToCalendarDate(14, new Date('2024-08-01'));
// On a decoded leg
const flightDate = pass.boardingPassLegs[0]!.flightDate();
const flightDate2025 = pass.boardingPassLegs[0]!.flightDate({ year: 2025 });
const flightDateAtScan = pass.boardingPassLegs[0]!.flightDate({ relativeTo: scanDate });Year inference uses a ±183-day heuristic for flights near year boundaries.
Demo Data
import { DemoData, randomDemoData } from 'boarding-pass-kit';
DemoData.Simple;
DemoData.Historical;
DemoData.MultiLeg;
DemoData.International;
const key = randomDemoData();
const pass = decoder.decode(DemoData[key]);API Reference
BoardingPassDecoder
| Method | Description |
|--------|-------------|
| decode(code: string) | Parse an ASCII barcode string |
| decode(data: Buffer \| Uint8Array) | Parse raw bytes |
Types
BoardingPass— Full decoded passBoardingPassLeg— One flight segment (includesflightDate())BoardingPassLegData— Leg conditional dataBoardingPassInfo— Unique conditional block (bag tags, etc.)BoardingPassSecurityData— Optional security trailer
Errors
Throws BoardingPassError with a code from BoardingPassErrorCode:
MandatoryItemNotFound— Truncated or incomplete dataDataFailedValidation— Missing required valuesHexStringFailedDecoding— Invalid hex fieldBoardingPassLegConditionalMismatch— Conditional section size mismatchInvalidJulianDay— Day-of-year out of rangeDataIsNotBoardingPass— Wrapper for inner parse errors
Multi-Leg Support
const pass = decoder.decode(DemoData.MultiLeg);
console.log(pass.numberOfLegs); // 2
for (const leg of pass.boardingPassLegs) {
console.log(`${leg.origin} → ${leg.destination}`);
}License
MIT
