This JCB card generator produces Luhn-valid test numbers inside JCB’s 3528–3589 range.
The network is straightforward in every respect except one, and that one catches almost
everybody: JCB starts with 35, but not everything starting with 35 is JCB.
Test card only
Credit Card Number Generator
Generate dummy card details for development and QA. Nothing is stored or sent to a server.
JCB card number format
| Property | Value |
|---|---|
| BIN range | 3528–3589 |
| Standard length | 16 digits |
| Permitted length | up to 19 digits |
| Check digit | Luhn (mod 10) |
| Security code | CAV2, 3 digits, on the back |
| Grouping | 4-4-4-4 |
JCB and the 35 prefix trap
The Major Industry Identifier 3 covers travel and entertainment, which is why American
Express, Diners Club and JCB all live there. Inside it, JCB holds 3528 through 3589 — a
four-digit range, not a two-digit one.
That distinction is where the bug lives. A very large amount of production code does this:
if (/^35/.test(number)) return 'jcb'; // wrong
It looks reasonable and it is wrong at both ends. 3500–3527 and 3590–3599 are outside
JCB’s allocation. A card in those blocks gets labelled JCB, the wrong brand mark appears in
the UI, and if brand drives any downstream logic — routing, surcharge, which acquirer sees the
transaction — the wrong decision follows silently. The payment may still succeed, which is
what makes it hard to notice.
The correct check is four digits deep:
const JCB = /^35(2[89]|[3-8]\d)\d{12,15}$/;
And the boundary tests that prove it:
JCB.test('3527000000000000'); // false — one below the range
JCB.test('3528000000000000'); // true — first JCB block
JCB.test('3589000000000000'); // true — last JCB block
JCB.test('3590000000000000'); // false — one above the range
Those four assertions take a minute to write and they are the whole story for this network. There is nothing else about JCB that is likely to break your code — no unusual length, no missing security code, no shared range fought over by two schemes. It is a well-behaved network with one sharp edge, and the edge is exactly four digits deep.
Why the trap survives code review
The ^35 check is not written by careless people. It survives for three specific reasons
worth naming, because recognising them is how you stop shipping the next one.
It passes every test written alongside it. Whoever wrote the check tested it with a JCB
number, and it worked. The failure only appears with a card in 3500–3527 or
3590–3599, and nobody has one of those to hand.
The failure is a wrong label, not an error. A card detected as the wrong brand still submits, still authorises, and still completes. There is no exception, no log line, and no support ticket that says “the logo was wrong” — the customer paid and left.
The prefix table people copy is usually right about JCB and wrong about the boundary.
Plenty of published brand-detection snippets list JCB as 35, because at two digits that is
where the range starts. The four-digit precision gets lost in transcription, and the snippet
gets copied onwards.
The fix is not more care. It is a boundary test in the suite, which turns a fact somebody has to remember into a fact the build enforces.
Where JCB is accepted
JCB is Japan’s domestic network and a genuine third rail there, not a niche brand. Acceptance is broad across Korea, Taiwan, Thailand, Singapore and much of Southeast Asia, and JCB has spent years extending reach through partnerships rather than building acceptance directly everywhere.
The most useful of those for a developer to know about is the reciprocal arrangement with Discover: in the United States, JCB cards commonly clear over Discover rails. As with the other partnerships in Discover Global Network — which also covers Diners Club — the digits do not change. What changes is which network actually carries the authorisation, which is a routing fact rather than a formatting one.
The commercial question for a checkout is simple. Selling into Japan or Southeast Asia without JCB means turning away a real share of customers, and they do not usually tell you — they just leave. Selling only to Europe or North America makes JCB optional, though the detection should still be right.
Testing scenarios
- The four boundary numbers.
3527,3528,3589and3590prefixes, asserted against your detector. This is the test that matters for JCB. - Full detection chain. Feed a JCB number through your whole brand-detection function, not
just the JCB expression, and confirm no earlier rule claims it — a broad
^3rule for the travel-and-entertainment MII will. - CAV2 length. Three digits. If your code branches on the security code’s name rather than the brand’s rules, CAV2 must land in the three-digit path.
- Longer numbers. Generate a nineteen-digit number and confirm your length rule accepts it rather than assuming sixteen.
- Brand mark rendering. JCB’s logo is one that placeholder icon sets frequently omit; confirm the UI has an asset for it rather than falling back to a generic card.
The missing brand asset
One more JCB-specific detail that is not about digits at all. Icon sets bundled with checkout libraries frequently ship Visa, Mastercard, American Express and Discover, and stop there. JCB is among the first omissions, which means correct detection produces a broken image or a generic grey rectangle where a brand mark should be.
That matters more than it sounds in the Japanese market, where JCB is a primary network rather than an alternative one. A checkout that displays every other brand properly and shows a blank box for the customer’s own card reads as unfinished, and payment pages get very little benefit of the doubt. Check that your icon set covers all nine networks before you ship detection for them, and use the same list your detection function uses.
Official test numbers
For processor behaviour, use the gateway’s own sandbox numbers rather than generated ones.
Stripe publishes 3566 0020 2036 0505 for JCB, and Adyen and Square both document
3569 9900 1009 5841. The test card numbers reference collects them by
gateway alongside the decline codes each one triggers.
JCB’s own developer and acceptance material is published at Global JCB, which is the authoritative source for the network’s range allocations and partner arrangements.
Related tools and guides
To see whether a 35xx number really is JCB, paste it into
the validator — it applies the four-digit range rather than the
two-digit shortcut this page argues against.
The brand detection guide sets out the
expression for all nine networks together, which is where boundary mistakes are easiest to
spot side by side. The tool directory lists the other generators, and
the FAQ explains what a passing checksum does not tell you.