Loader
BOARDING ACCESS CONTROL

API Documentation

VERSION


Version
1.8
Last Update
2026-08-01

HOST


https://bac-staging.langkawiport.com.my

AUTHORIZATION


To authenticate, retrieve your API Key from the Settings menu in the BAC Platform. Every request must include the header X-Api-Key: <YOUR_API_KEY> Generating a new key will immediately revoke the old one; we recommend doing this during off-peak hours to prevent service interruption
Header
X-Api-Key
<YOUR_API_KEY>

ERRORS


All requests will go through validation process and request that fail will be returned with error parameter that details the reason for the failure.
Common Errors
Authentication
An invalid or tampered API Key will result in an authentication error.
Missing / Invalid Parameters
Essential parameters required for processing the request are either absent or contain values that do not conform to the expected data type, range, or format
API Key
If you were to generate a new API Key, the ideal period to do so is when your business is on off-peak hours to avoid disruption
Content-Type
Requests must include a Content-Type: application/json header, The API will reject requests without this header, even if the JSON body is valid.
Sample Response
Response Code
400
Content-Type
application/json
{
"error": "Duplicate ref_no"
}

RATE LIMIT


A rate limit of 100 requests per minute is applied to all endpoints. Please pace your requests accordingly.
Sample Response
Response Code
429
Content-Type
application/json
{
"error": "Rate limit exceeded. Please try again later."
}

CREATE SINGLE TICKET POST


/operator-api/tickets/create
Header
Content-Type
application/json
X-Api-Key
<YOUR_API_KEY>
Required Parameters
ref_no
String | Reference to the ticket in your application | Unique
ship
String
origin
Enum
LangkawiKuala PerlisKuala Kedah
destination
Enum
LangkawiKuala PerlisKuala Kedah
category
Enum
ADPADDCHDB01B02B03V01V02V03Y01Y02Y03Y04H01H02H03H04H05H06W01
Optional Parameters
departure_date
String | ISO DateYYYY-MM-DD
departure_time
String | Time : 24 hr formatHH:mm:ss
vehicle_no
String | required if category value is either B01B02B03V01V02V03Y01Y02Y03Y04H01H02H03H04H05H06
user
Object
user.name
String | Required | Max length 100 characters
user.email
String | Email
user.contact
String | Phone No | Without dash symbol
user.ic_no
String | Without dash symbol
In order for the passenger profile to be created, you need to provide name and either one of these three : email contact ic_no. BAC Platform will ignore if those parameters are empty. If the value provided has a match, it will assign the ticket to the existing user and will create a new one if no match.
Sample Payload
 { "ref_no": "ABCD1234", "departure_date": "2025-01-01", "departure_time": "12:30:00", "origin": "Langkawi", "destination": "Kuala Kedah", "category": "ADP", "ship": "Awesome Ship", "vehicle_no": "ABC123", "user": { "name": "Clark Kent", "email": "[email protected]", "contact": "0101112233", "ic_no": "0101112233" } } 
Sample Response
Response Code
200
Content-Type
application/json
 { "ref_no": "ABCD1234", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1", "ticket_url": "https://bac-staging.langkawiport.com.my/tickets/pdf/iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1" } 

CREATE MULTIPLE TICKET POST


Similar to create single ticket with the same endpoint, just wrap the payload inside an array. The response will also be in array format.
In the event of the validation failed, the response however will NOT be in array format
Header
Content-Type
application/json
X-Api-Key
<YOUR_API_KEY>
Sample Payload
 [ { "ref_no": "ABCD1234", "departure_date": "2025-01-01", "departure_time": "12:30:00", "origin": "Langkawi", "destination": "Kuala Kedah", "category": "ADP", "ship": "Awesome Ship", "vehicle_no": "ABC123", "user": { "name": "Bruce Wayne", "email": "[email protected]", "contact": "0101112233", "ic_no": "0101112233" } }, { "ref_no": "DCBA4321", "departure_date": "2025-01-01", "departure_time": "12:30:00", "origin": "Kuala Kedah", "destination": "Langkawi", "category": "ACP", "ship": "Awesome Ship", "vehicle_no": "ABC123", "user": { "name": "Heath Ledger", "email": "[email protected]", "contact": "0101112233", "ic_no": "0101112233" } } ] 
Sample Response
Response Code
200
Content-Type
application/json
 [ { "ref_no": "ABCD1234", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1", "ticket_url": "https://bac-staging.langkawiport.com.my/tickets/pdf/iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1" }, { "ref_no": "DCBA4321", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1", "ticket_url": "https://bac-staging.langkawiport.com.my/tickets/pdf/iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1" } ] 

CREATE OPEN TICKET POST


Similar to create single ticket and create multiple ticket with the same endpoint, simply exclude departure_date and departure_time from the payload

GET QRCODE GET


/operator-api/tickets/qrcode/{ref_no}
Header
X-Api-Key
<YOUR_API_KEY>
Sample Response
Response Code
200
Content-Type
application/json
 { "ref_no": "ABCD1234", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1" } 

UPDATE SINGLE TICKET PUT


/operator-api/tickets/update
Header
Content-Type
application/json
X-Api-Key
<YOUR_API_KEY>
Required Parameters
ref_no
String
Optional Parameters
departure_date
String | ISO DateYYYY-MM-DD
departure_time
String | Time : 24 hr formatHH:mm:ss
ship
String
origin
Enum
LangkawiKuala PerlisKuala Kedah
destination
Enum
LangkawiKuala PerlisKuala Kedah
category
Enum
ADPADDCHDB01B02B03V01V02V03Y01Y02Y03Y04H01H02H03H04H05H06W01
vehicle_no
String | required if category value is either B01B02B03V01V02V03Y01Y02Y03Y04H01H02H03H04H05H06
Sample Payload
 { "ref_no": "ABCD1234", "departure_date": "2025-01-01", "departure_time": "12:30:00" } 
Sample Response
Response Code
200
Content-Type
application/json
 { "uuid": "ABCD1234", "ref_no": "ABCD1234", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1", "departure_date": "2025-01-01", "departure_time": "12:30:00", "origin": "Langkawi", "destination": "Kuala Kedah", "category": "ADP", "ship": "Awesome Ship", "vehicle_no": "ABC123", "created_at": "2025-01-01 12:30:00", "updated_at": "2025-01-01 12:30:00", "user": { "name": "Clark Kent", "email": "[email protected]", "contact": "0101112233", "ic_no": "0101112233" } } 

UPDATE MULTIPLE TICKET PUT


Similar to update single ticket with the same endpoint, just wrap the ref_no inside an array. The response will also be in array format.
Header
Content-Type
application/json
X-Api-Key
<YOUR_API_KEY>
Required Parameters
ref_no
Array
Optional Parameters
departure_date
String | ISO DateYYYY-MM-DD
departure_time
String | Time : 24 hr formatHH:mm:ss
ship
String
origin
Enum
LangkawiKuala PerlisKuala Kedah
destination
Enum
LangkawiKuala PerlisKuala Kedah
category
Enum
ADPADDCHDB01B02B03V01V02V03Y01Y02Y03Y04H01H02H03H04H05H06W01
vehicle_no
String | required if category value is either B01B02B03V01V02V03Y01Y02Y03Y04H01H02H03H04H05H06
Sample Payload
 { "ref_no": [ "ABCD1234", "ABCD1234" ], "departure_date": "2025-01-01", "departure_time": "12:30:00" } 
Sample Response
Response Code
200
Content-Type
application/json
 [ { "uuid": "ABCD1234", "ref_no": "ABCD1234", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1", "departure_date": "2025-01-01", "departure_time": "12:30:00", "origin": "Langkawi", "destination": "Kuala Kedah", "category": "ADP", "ship": "Awesome Ship", "vehicle_no": "ABC123", "created_at": "2025-01-01 12:30:00", "updated_at": "2025-01-01 12:30:00", "user": { "name": "Barry Allen", "email": "[email protected]", "contact": "0101112233", "ic_no": "0101112233" } }, { "uuid": "ABCD1234", "ref_no": "ABCD1234", "qrcode": "iJKBn0rY0OuaVUClxyEZ9lbzoOdgriVndNQNWpNz8pDutCfvwfetgAcDyYnv7KhL1", "departure_date": "2025-01-01", "departure_time": "12:30:00", "origin": "Langkawi", "destination": "Kuala Kedah", "category": "ADP", "ship": "Awesome Ship", "vehicle_no": "ABC123", "created_at": "2025-01-01 12:30:00", "updated_at": "2025-01-01 12:30:00", "user": { "name": "Selina Kyle", "email": "[email protected]", "contact": "0101112233", "ic_no": "0101112233" } } ] 

VOID TICKET PUT


/operator-api/tickets/void
Header
Content-Type
application/json
X-Api-Key
<YOUR_API_KEY>
Required Parameters
ref_no
String
Sample Payload
 { "ref_no": "ABCD1234" } 
Sample Response
Response Code
200
Content-Type
application/json
 { "ref_no": "ABCD1234", "void_at": "2025-01-01 12:30:00" } 

WEBHOOK


Login to BAC Platform and head to webhook modules where you can manage your webhook subscriptions.
Available Events
ticket.created
When ticket is created using BAC Platform
ticket.updated
When ticket is updated using BAC Platform
ticket.validated
When ticket is validated at the boarding gate
ticket.void
When ticket is voided at the boarding date or on the BAC Platform
ticket.undo-void
When void has been undone
Sample Payload
Content-Type
application/json
User-Agent
BAC Fetch/V1.0
 { "event": "ticket.validated", "ref_no": "ABCD1234", "validated_at": "2025-10-25 12:30:00" } 

EXCEL UPLOAD


For your convenience, we also handle the Excel file upload on the BAC Platform. Please make sure that the departure_date and departure_time is at least 1 minute prior to the actual departure time.