---
title: "BIN Lookup API JavaScript Guide"
description: "Call the BIN Lookup API from Node.js with fetch. Handle current error codes and send a batch lookup."
section: "Guides"
url: "https://binlookupapi.com/docs/guides/javascript/"
markdown_url: "https://binlookupapi.com/docs/guides/javascript.md"
---
# BIN lookup with JavaScript

This page uses Node.js 18 or later. `fetch` is built in. Create an API key in the [quickstart](/docs/quickstart/).

WARNING: Do not put the API key in browser code. Call the API from your server.

## Store the key

```bash
export BINLOOKUP_API_KEY="your_key_here"
```

## Look up one BIN

```javascript
const apiKey = process.env.BINLOOKUP_API_KEY;

const response = await fetch("https://api.binlookupapi.com/v1/bin", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${apiKey}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ number: 42467101 }),
});

const payload = await response.json();

if (response.status === 200) {
  console.log(payload.data.scheme, payload.data.issuer.name);
  console.log("Remaining:", response.headers.get("X-Quota-Remaining"));
} else if (response.status === 401) {
  console.error("The API key is missing or not valid.");
} else if (response.status === 403) {
  console.error(payload.error, payload.message);
} else if (response.status === 404) {
  console.error("The BIN is not in the data.");
} else if (response.status === 429) {
  console.error("The daily quota is used.");
} else if (response.status === 400) {
  console.error(payload.message);
} else {
  console.error(`The API returned HTTP ${response.status}.`);
}
```

`payload.data` contains the fields in the [API reference](/docs/api-reference/#response-fields). On BLAPI-150KPM and above, `payload.meta.longer_bin_available` is also present.

HTTP 403 is `FORBIDDEN` or `FEATURE_NOT_AVAILABLE`. Read `payload.error`. Some error bodies also contain `upgrade_url`.

## Look up many BINs

`POST /v1/bins` accepts 1 to 2,000 values. It requires BLAPI-500KPM, or a test-mode organisation. Each value uses one lookup.

```javascript
const response = await fetch("https://api.binlookupapi.com/v1/bins", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${process.env.BINLOOKUP_API_KEY}`,
    "Content-Type": "application/json",
  },
  body: JSON.stringify({ numbers: [400062, "400597", 99999999] }),
});

const payload = await response.json();

if (response.status === 403 && payload.error === "FEATURE_NOT_AVAILABLE") {
  console.error("Batch lookup needs the BLAPI-500KPM plan.");
} else if (response.status === 200) {
  for (const item of payload.results) {
    if (item.data) {
      console.log(item.number, item.data.scheme);
    } else {
      console.log(item.number, item.error);
    }
  }
} else if (response.status === 429) {
  console.error("Remaining:", response.headers.get("X-Quota-Remaining"));
}
```

A 429 on a batch that does not fit uses no quota. `X-Quota-Remaining` is the real remainder. See [Batch lookups](/docs/batch-lookups/).

## Related pages

- [curl guide](/docs/guides/curl/)
- [Python guide](/docs/guides/python/)
- [API reference](/docs/api-reference/)
- [API keys](/docs/api-keys/)
- [Billing](/docs/subscriptions/)
