Dynamic Styling Based on BIN

Get the card BIN type

Checking the card number

type CardType = "Visa" | "Mastercard" | "Unknown";

function getBinType(cardNumber: string): CardType {
  const cleanedUpCardNumber = cardNumber.replace(/\s|-/g, "");

  // Visa: starts with 4
  if (/^4\d{12,18}$/.test(cleanedUpCardNumber)) {
    return "Visa";
  }

  // Mastercard: starts with 51–55 or 2221–2720
  if (
    /^(5[1-5]\d{14}|2221\d{12}|222[2-9]\d{12}|22[3-9]\d{13}|2[3-6]\d{14}|27[01]\d{13}|2720\d{12})$/.test(cleanedUpCardNumber)
  ) {
    return "Mastercard";
  }

  return "Unknown";
}

// Examples
getBinType("4111 1111 1111 1111"); // "Visa"
getBinType("5555 5555 5555 4444"); // "Mastercard"

Use Payrails' API

You can also use https://docs.payrails.com/reference/getbinlookup to fetch a more complete bin details for cards that are used.

const binNumber = cardNumber.slice(0, 6);
const response = await fetch('https://api.staging.payrails.io/payment/binLookup/' + binNumber);
const binData = await response.json();

console.log('Bin Lookup Example:', binData);

// Bin Lookup Example:
// {
//   "bin": "416598",
//   "network": "visa",
//   "localNetwork": "bancontact",
//   "issuer": "Revolut",
//   "issuerCountry": {
//     "code": "LT",
//     "name": "Lithuania",
//     "iso3": "LTU"
//   },
//   "segment": "infinite",
//   "type": "debit",
//   "typeDetail": "personal"
// }
📘

You can also get the bin number from the instrument details API https://docs.payrails.com/reference/getinstrument

const instrument = await fetch('https://api.staging.payrails.io/payment/instruments/{instrumentId}');
const instrumentObj = await instrument.json();

console.log(instrumentObj.data.bin);

// Example output: "411111"

Styling Elements

Once we've gathered the card BIN type from the steps above, you can initialize the Display SDK based on the value:

For more information on how to initialize Display SDK: https://docs.payrails.com/docs/display-sdk#usage

📘

Note: you can also design how you show card details based on the other BIN information (ie. bank issuer)


// fetch client init response from backend
const clientInitResponse = {/* ... */};

const options: DisplaySDKOptions = {
  styles: {},
  translations: {},
}

let cardContainerClassName = "card";

// Visa design
if (binData.network === "Visa") {
  cardContainerClassName += " visa-style";
  options.styles.base = {
    color: "white",
  }

// Mastercard design
} else if (binData.network === "Mastercard") {
  cardContainerClassName += " mastercard-style";
  options.styles.base = {
    color: "black",
  }
  
// Revolut design
} else if (binData.issuer === "Revolut") {
  cardContainerClassName += " revolut-style";
  options.styles.base = {
    color: "white",
  }
}


const displaySDK = DisplaySDK.init(clientInitResponse, options);

displaySDK.createElement(DisplayElementType.CardNumber).mount('#card-number-container');
// all the other elements you wish to initialize here

return (
  <div className={cardContainerClassName}>
    <div id="card-number-container"></div>
    <!-- all the other elements' container here -->
  </div>
);