---
title: "Bulk BIN Lookup API — 2,000 BINs Per Request"
description: "Bulk BIN lookup endpoint: check up to 2,000 BINs in a single API request. Request format, per-item errors, quota accounting, and code examples."
section: "API"
url: "https://binlookupapi.com/docs/batch-lookups/"
markdown_url: "https://binlookupapi.com/docs/batch-lookups.md"
---
# Bulk BIN Lookup

`POST /v1/bins` looks up many BINs in one request. A batch contains 1 to 2,000 BINs. The response has one result for each value, in the same order.

The base URL is `https://api.binlookupapi.com`.

## Availability

Batch lookup is included in BLAPI-500KPM. See [Billing](/docs/subscriptions/).

On other plans, the API returns HTTP 403 and the error code `FEATURE_NOT_AVAILABLE`. The message names the required plan. The body can include `upgrade_url`.

A test-mode organisation can call this endpoint before it subscribes. The response uses mock data. The test-mode daily limit is 500 lookups, so a test batch larger than 500 items returns 429.

You can also upload a file in the dashboard. See [Batch CSV](/docs/batch-csv/).

## Request

Send a JSON body with a `numbers` array.

```bash
curl -X POST "https://api.binlookupapi.com/v1/bins" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"numbers": [400062, "400597", 99999999]}'
```

```json
{ "numbers": [400062, "400597", 99999999] }
```

Each value uses the same rules as [one lookup](/docs/api-reference/#look-up-one-bin):

- An integer from `100000` to `99999999999`, or a string of digits.
- Leading zeros are removed.
- Do not send a full card number.
- The array length is 1 to 2,000.

## Response

```json
{
  "mode": "live",
  "results": [
    {
      "number": 400062,
      "data": {
        "bin": "400062",
        "scheme": "visa",
        "funding": "debit",
        "brand": "VISA",
        "category": "SIGNATURE",
        "country": { "code": "AE", "name": "UNITED ARAB EMIRATES" },
        "issuer": {
          "name": "EMIRATES NBD BANK (P.J.S.C.)",
          "website": "http://www.emiratesnbd.com/en/",
          "phone": "+971800456"
        },
        "currency": "AED",
        "prepaid": false,
        "commercial": false
      },
      "meta": { "longer_bin_available": true }
    },
    {
      "number": "400597",
      "data": {
        "bin": "400597",
        "scheme": "visa",
        "funding": "credit",
        "brand": "VISA",
        "category": "BUSINESS",
        "country": { "code": "US", "name": "UNITED STATES" },
        "issuer": {
          "name": "FIRST ELECTRONIC BANK",
          "website": "https://firstelectronic.bank/",
          "phone": "+ (1) 801-572-4004"
        },
        "currency": "USD",
        "prepaid": false,
        "commercial": true
      },
      "meta": { "longer_bin_available": true }
    },
    {
      "number": 99999999,
      "error": "NOT_FOUND",
      "message": "BIN not found"
    }
  ]
}
```

| Field | Type | Meaning |
|-------|------|---------|
| `mode` | string | `live` or `test`. |
| `results[].number` | integer or string | The value that you sent, echoed in the same form. |
| `results[].data` | object | The same fields as a single lookup. See the [API reference](/docs/api-reference/#response-fields). |
| `results[].meta.longer_bin_available` | boolean | The same signal as on a single lookup. It is omitted when the plan does not include `meta`. |
| `results[].error` | string | `NOT_FOUND` or `BAD_REQUEST` when that item failed. |
| `results[].message` | string | Text that describes the item error. |

## Item errors

One failed item does not change the other items. A failed item has `error` and `message` instead of `data`.

| Error code | Cause |
|------------|-------|
| `NOT_FOUND` | The BIN is not in the dataset. |
| `BAD_REQUEST` | The value is not a valid BIN. |

The whole request fails only for these causes:

| HTTP status | Error code | Cause |
|-------------|------------|-------|
| 400 | `BAD_REQUEST` | The JSON is not valid, `numbers` is missing, or the array has more than 2,000 values. |
| 401 | `UNAUTHORIZED` | The API key is missing, not valid, revoked, or expired. |
| 403 | `FEATURE_NOT_AVAILABLE` | The plan does not include batch lookup. |
| 403 | `FORBIDDEN` | The key does not have permission for this endpoint. |
| 429 | `QUOTA_EXCEEDED` | The batch is larger than the remaining daily quota. |

## Card number redaction

A value with more than 11 digits can be a full card number. The API returns that value as `"[REDACTED]"` with item error `BAD_REQUEST`. The API does not store the original value in the request log.

```json
{
  "number": "[REDACTED]",
  "error": "BAD_REQUEST",
  "message": "number must be an integer between 6 and 11 digits; digit strings are accepted for compatibility"
}
```

## Quota

Each value in the array uses one lookup. This includes values that are not valid and values that are not found.

If the batch is larger than the remaining quota, the API returns 429 and uses no quota. `X-Quota-Remaining` then shows the real remainder, not zero. Split the batch and send it again.

A single-lookup 429 is different. `X-Quota-Remaining` is then `0`.

See [Daily quota](/docs/subscriptions/#daily-quota).

## Related pages

- [Batch CSV](/docs/batch-csv/)
- [API reference](/docs/api-reference/)
- [Language guides](/docs/guides/)
- [Billing](/docs/subscriptions/)
