How this comparison works
BIN lookup APIs look interchangeable on a pricing page and very different in production. The differences show up in edge cases: a prepaid card that is labelled as debit, a new 8-digit range that returns nothing, a regional issuer with no name, or a response that takes long enough to slow your checkout. This page gives you a way to compare providers on those points, a scorecard you can fill in yourself, and a short test plan you can run in an afternoon.
A note on method. Provider features, limits and prices change often, and we cannot verify every competitor's current terms on the day you read this. So rather than quote competitor numbers that may be out of date, this page compares categories of provider and tells you exactly what to check in each vendor's current documentation. For background on what a BIN is and what it reveals, see What Is a BIN Number?. This page assumes you already know and want to choose an API.
The five types of BIN data source
Most options fall into one of five groups. Knowing which group a vendor belongs to tells you a lot about its likely strengths before you read the docs.
| Source type | 8-digit BIN support | Typical fields | Update cadence | Free tier | Pricing model |
|---|---|---|---|---|---|
| Community or open datasets and free public APIs | Varies; check whether 8-digit ranges are included | Usually brand, type, country, sometimes issuer name | Often irregular; depends on contributors | Usually free, often with strict rate limits | Free, or donation or paid upgrade |
| Standalone commercial BIN database vendors | Check documentation and ask for sample data | Issuer, brand, type, level, country, sometimes issuer contact data | Stated by vendor; ask for the exact schedule | Sometimes a trial or limited free calls | Per-lookup, subscription, or database licence |
| Payment processor or gateway built-in BIN data | Check; often exposed only within that processor's flow | Brand, type, country, sometimes funding source | Managed by the processor | Included with the processing account | Bundled into processing fees |
| Card-network programmes and acquirer data | Generally the source of truth for ranges | Network-defined range data | Set by the network | Not usually applicable | Programme or licence terms |
| Fraud and identity platforms with BIN lookup (including ScreenlyyID) | Confirm in the product documentation | Card-level data you can combine with IP, device, email and phone signals | Confirm with the vendor | Self-serve sign-up; see pricing for current plans | Usage or plan based; see the pricing page |
Treat every "check" and "confirm" in that table as an action item, not a gap. A vendor that answers each one in writing, with sample responses, is easier to trust than one that does not.
Criteria that separate good APIs from adequate ones
1. 6-digit and 8-digit coverage
Card issuers have been moving from 6-digit to 8-digit identifiers, which means a single 6-digit prefix can now cover several issuers or products. An API that only matches on six digits can return the wrong issuer or a generic answer for those ranges. Ask whether the API accepts the first eight digits, what it returns when you send six, and how it handles a 6-digit prefix that maps to more than one range. The terminology behind this is covered in our BIN vs IIN explainer (What Is the Difference Between a BIN and an IIN?).
2. Fields returned
The fields most teams use are:
- Card brand (for example, a network name) for routing and display.
- Card type (credit, debit, prepaid) for risk rules and surcharging logic.
- Card level or product (for example, standard, premium, commercial) for fraud scoring and offers.
- Issuer name and issuing country for geography checks.
Be wary of fields that are present in the schema but often null. Your test set (below) will show how often each field is actually populated for the cards your customers use.
3. Update cadence
New ranges are issued, reassigned and retired continuously. An old database leads to two failure modes: new cards return "not found" and get declined or sent to manual review, and reassigned ranges return a former issuer. Ask the vendor how often the data is refreshed, how it is sourced, and whether you get a changelog. "Updated regularly" is not an answer; a stated schedule is.
4. Latency and where it sits in your flow
If the lookup is in the checkout path, latency adds to every payment. Measure p50 and p95 response times from the regions where you run your servers, not from a vendor's status page. If latency matters more than freshness for a given use, cache responses (see "Design notes" below).
5. Rate limits and free tiers
Free tiers are good for integration testing and for low-volume products. They are risky as a production dependency if the limit is low or if throttling is aggressive. Check the per-second and per-month limits, what happens when you exceed them (error, throttle, or automatic overage billing), and whether the free tier returns the same fields as paid plans.
6. Pricing clarity
Look for a published price per lookup or per plan, and ask whether repeated lookups of the same BIN are billed each time. If you cache, that matters. Our pricing page lists current plans.
7. Fit with the rest of your risk stack
A BIN result on its own is a single signal. It becomes more useful alongside IP, device, email and phone checks, for example flagging a card issued in one country, used from an IP address in another, with a newly created email address. If you already run those checks, a provider that offers them together may reduce integration work. For how card data fits into broader risk decisions, see our payment fraud risk management guide.
Where ScreenlyyID fits
ScreenlyyID offers BIN lookup through an API with self-serve sign-up, alongside identity verification, AML screening, address, email and phone validation, and IP and device intelligence. That makes it a fit for teams who want card data and other risk signals from one integration. It may be less relevant if all you need is a one-off static list for offline analysis.
Details of the fields, limits and plans are on the BIN lookup product page and the pricing page; we would rather you check those than rely on a summary here. There is also a free-to-use BIN checker hub and a walkthrough on how to check BIN numbers.
A test plan you can run in an afternoon
Vendor demos use clean examples. Your traffic is not clean. Build a test set and run it against every API on your shortlist.
- Collect 200 to 500 BINs from your own historic transactions (first 8 digits only, never full card numbers; do not store or send full PANs to a lookup service). Include your top countries, your top issuers, and known edge cases: prepaid, corporate, virtual cards, digital wallet tokens and cards from small regional issuers.
- Label a sample by hand using sources you trust, such as your processor's reports or card details your finance team already holds.
- Score each API on: match rate (a result returned), field completeness, agreement with your labels, and disagreement between APIs. Disagreements are the interesting rows; review them manually.
- Test newer ranges: include BINs from cards issued recently to see how fresh the data is.
- Time it: run 1,000 calls from your production region and record p50 and p95.
- Test failure behaviour: send a malformed BIN, a valid-looking but unassigned BIN, and exceed the rate limit on purpose. See what the API returns each time.
Many comparisons only look at price and the number of fields. Match rate on your real traffic and behaviour on unknown BINs usually matter more.
Code sample: a defensive BIN lookup
The example below is illustrative. The endpoint, header and response fields are placeholders, so replace them with the values from the documentation of the API you choose. It shows the patterns worth copying: send only the leading digits, set a timeout, cache the result, and fail open to a manual rule rather than blocking a payment.
// Illustrative only: replace URL, auth and field names with your provider's.
const cache = new Map();
async function lookupBin(cardNumber) {
const bin = cardNumber.replace(/\D/g, "").slice(0, 8); // never send the full PAN
if (bin.length < 6) return { status: "invalid" };
if (cache.has(bin)) return cache.get(bin);
try {
const res = await fetch("https://api.example.com/v1/bin/" + bin, {
headers: { Authorization: "Bearer " + process.env.BIN_API_KEY },
signal: AbortSignal.timeout(800) // keep checkout fast
});
if (res.status === 404) return { status: "unknown_bin" };
if (res.status === 429) return { status: "rate_limited" };
if (!res.ok) return { status: "error" };
const data = await res.json();
const result = {
status: "ok",
brand: data.brand ?? null,
type: data.type ?? null, // credit, debit, prepaid
level: data.level ?? null,
issuer: data.issuer ?? null,
country: data.country ?? null
};
cache.set(bin, result);
return result;
} catch (e) {
return { status: "timeout" };
}
}
Design notes that apply to any provider
- Never send full card numbers. A BIN lookup needs only the leading digits. Sending less data reduces your card-data handling scope; confirm your obligations with your payment provider or QSA.
- Treat "unknown" as its own state. A not-found BIN is not the same as a high-risk BIN. Route it to a softer rule, such as extra checks, rather than an automatic decline.
- Cache, but set an expiry. Caching by BIN cuts cost and latency. Because ranges change, expire entries after a period you are comfortable with rather than keeping them forever.
- Log the provider's answer with a timestamp. When a decision is questioned later, you can show what the data said at that time.
- Use BIN data as one signal. It describes the card, not the person using it. For defence against automated attacks that use BIN patterns, see our guide How to Stop Card Testing Attacks with BIN Data.
Scorecard to copy
| Criterion | What to record | Weight (your call) |
|---|---|---|
| 8-digit support | Accepts 8 digits? Behaviour with 6? | |
| Match rate on your test set | % of BINs returning a result | |
| Field completeness | % non-null for brand, type, level, issuer, country | |
| Agreement with labelled sample | % correct | |
| Update schedule | Stated cadence, changelog available? | |
| Latency | p50 / p95 from your region | |
| Rate limits | Per second / per month, overage behaviour | |
| Free tier | Limits, same fields as paid? | |
| Pricing | Per lookup or plan, caching billed? | |
| Date verified | Date you checked the vendor's docs |
Record the date you checked each vendor. Documentation and pricing change, and a dated scorecard is easier to defend internally.
Next step
If you want to test ScreenlyyID against your shortlist, you can sign up at screenlyyid.com, review the BIN lookup product page, and see current plans on the pricing page. Run the same test set through each API and choose on your own results.
This page is general information, not legal or compliance advice. Card-data handling and payment rules change, so check current requirements with your payment provider, card networks or legal counsel.
Frequently asked questions
What is the best BIN lookup API?
The best one for you is the API that returns the most accurate and complete data for your own card mix, refreshes its database on a stated schedule, and has clear limits and pricing. Support for 8-digit BINs, low latency from your region and sensible behaviour on unknown BINs matter more than the length of the field list. Run a test set of your real BINs through each shortlisted API before choosing.
Are there free BIN lookup APIs?
Yes. Some public datasets and APIs are free, and many commercial vendors offer a free tier or trial. Free options often have low rate limits, irregular updates or fewer fields, so they suit testing and low-volume use better than a production checkout. Check the limits and whether the free tier returns the same fields as paid plans.
How often is BIN data updated?
It depends on the provider. Some refresh on a fixed schedule and others update irregularly, so ask each vendor for its stated cadence and whether it publishes a changelog. Because issuers add, reassign and retire ranges, stale data can cause new cards to return no result or an outdated issuer.
Related guides and products
What Is a BIN Number? Card BINs Explained
A BIN is the first 6 to 8 digits of a card number. Learn what it reveals, how it relates to the IIN, the 8-digit change, and how merchants u
Read moreFree BIN Checker: Look Up Any Card BIN or IIN
Free BIN checker: enter the first 6 to 8 digits of a card to see the issuing bank, card brand, type, level and country. Instant results, no
Read moreBIN Lookup API: Check Card Issuer & Country
BIN Lookup API: get the issuer, card brand, type, category and country for any BIN and cross-check IP location to spot card fraud. Try it fr
Read morePayment Fraud Risk Management Guide
How to run a payment fraud programme: fraud types, a risk framework, tooling, card testing defence, KPIs and trends for risk managers.
Read more