Reported October 2026
Stripestring

Business Account KYC Verification — Parts 1–5

Reported by candidates from Stripe's online assessment. Pattern, common pitfall, and the honest play if you blank under the timer.

Get StealthCoderRuns invisibly during the live Stripe OA. Under 2s to a working solution.
Founder's read

Stripe's October 2026 OA reports a KYC verification problem that looks like a wall of text and isn't. Five parts, six CSV fields, one string per business. Underneath, it's string parsing plus a short chain of ordered checks, with one set-overlap rule at the end. If you're taking it in the next day or two, the risk isn't difficulty. It's missing a small detail like trimming or the inclusive half threshold. StealthCoder sits invisibly on your screen as a safety net if you blank mid-assessment, but the logic here is learnable tonight. Read the spec once, then build it in the order the checks run.

The problem

Validate each business account through a five-part KYC process. Parts 1-4 are ordered validation checks; Part 5 encodes the result. csvData contains a header followed by business rows with six comma-separated fields:
business_name
business_profile_name
full_statement_descriptor
short_statement_descriptor
url
product_description
Trim surrounding whitespace from every field.
Parts 1-3: Required fields and descriptor checks
All six fields must be present and non-empty.
full_statement_descriptor must contain 5 through 31 characters inclusive after trimming.
The full descriptor must not equal, case-insensitively, ONLINE STORE, ECOMMERCE, RETAIL, SHOP, or GENERAL MERCHANDISE.
Part 4: Business-name similarity
Normalize business_name and business_profile_name to distinct uppercase ASCII alphanumeric tokens. Ignore these legal or generic tokens: THE, INC, INCORPORATED, LLC, LTD, LIMITED, CORP, CORPORATION, COMPANY, CO. The names match when both normalized sets are non-empty and the number of shared tokens is at least half the size of the smaller set. The half threshold is inclusive.
Part 5: Error codes
Apply the four checks in order and report only the first failure. Return one string per business:
VERIFIED: <business_name> | OK
NOT VERIFIED: <business_name> | MISSING_FIELD
NOT VERIFIED: <business_name> | INVALID_DESCRIPTOR_LENGTH
NOT VERIFIED: <business_name> | GENERIC_DESCRIPTOR
NOT VERIFIED: <business_name> | NAME_MISMATCH

Function
validateBusinesses(csvData: String) → String[]

Examples
Example 1
csvData = "business_name,business_profile_name,full_statement_descriptor,short_statement_descriptor,url,product_description\nPawsome Pets Inc.,Pawsome Pets,PAWSOME PETS,Pawsome,pawsome.example,Pet supplies\nBean Bliss Coffee Company,Bean Bliss,Bean,bean.example,Coffee beans\nGlobal Goods Marketplace Inc.,Global Goods,RETAIL,Global,goods.example,General products"
return = ["VERIFIED: Pawsome Pets Inc. | OK","NOT VERIFIED: Bean Bliss Coffee Company | MISSING_FIELD","NOT VERIFIED: Global Goods Marketplace Inc. | GENERIC_DESCRIPTOR"]
Pawsome passes all five parts. Bean Bliss fails the first rule, so MISSING_FIELD wins. Global Goods reaches the descriptor blocklist and returns GENERIC_DESCRIPTOR.
Example 2
csvData = "business_name,business_profile_name,full_statement_descriptor,short_statement_descriptor,url,product_description\nAlpha Beta Gamma Delta LLC,Alpha Beta Epsilon Zeta,ALPHA BETA GOODS,Alpha,alpha.example,Analytics\nNorth Star Labs,Totally Different,STAR SERVICES,Star,north.example,Software"
return = ["VERIFIED: Alpha Beta Gamma Delta LLC | OK","NOT VERIFIED: North Star Labs | NAME_MISMATCH"]
The first row shares exactly two of four normalized tokens and passes the inclusive half-overlap rule. The second shares no normalized name tokens and returns NAME_MISMATCH.

Constraints
The first line is a header and is not validated.
Each data row is a simple six-field CSV row with no embedded commas or quoted commas.
One or more empty lines at the end are ignored as record terminators; an empty interior row is validated and fails Part 1.
Input fields use ASCII characters, so descriptor lengths and name tokenization are identical across supported languages.
All fields are trimmed; an empty trimmed value fails Part 1.
The full descriptor length interval is inclusive at 5 and 31.
The descriptor blocklist uses case-insensitive exact equality, not substring matching.
Name tokens are distinct ASCII letters/digits separated by any non-alphanumeric character.
The four checks are evaluated in Parts 1, 2, 3, then 4 order; return Part 5 results in input order.

Reported by candidates. Source: FastPrep

Pattern and pitfall

The problem reduces to a pipeline: split each row, trim, then run four checks in order and return on the first failure. Part 1 fails on any empty field. Part 2 checks the trimmed full descriptor length is 5 to 31. Part 3 compares it uppercase against a blocklist using exact equality, not substring. Part 4 tokenizes both names into distinct uppercase alphanumeric tokens, drops the ignored legal tokens, then counts shared tokens. Pass if both sets are non-empty and shared * 2 >= min(size). Use integer math to avoid float issues. The pitfalls: splitting with a method that drops trailing empty fields, so a row like a,b,c,d,e, gets five fields instead of six. Also, trailing blank lines are ignored but interior blank rows fail Part 1. If you freeze on the edge cases during the live OA, StealthCoder is the hedge that reads the spec and hands you a clean solution.

Drill it cold or hedge it with StealthCoder. Either way, don't walk into the OA hoping you remember the trick.

If this hits your live OA

You can drill Business Account KYC Verification — Parts 1–5 cold, or you can hedge it. StealthCoder runs invisibly during screen share and surfaces a working solution in under 2 seconds. The proctor sees the IDE. They don't see what's behind it. Made for the candidate who got the OA invite this morning and has 72 hours, not six months.

Get StealthCoder

Related leaked OAs

⏵ The honest play

You've seen the question. Make sure you actually pass Stripe's OA.

Stripe reuses patterns across OAs. Made for the candidate who got the OA invite this morning and has 72 hours, not six months. Works on HackerRank, CodeSignal, CoderPad, and Karat.

Business Account KYC Verification — Parts 1–5 FAQ

How hard is the Stripe KYC verification OA really?+

Easy on algorithms, annoying on details. There's no tricky data structure. You parse CSV, trim, and apply four ordered checks. Most failures come from edge cases: empty trailing fields, blank interior rows, and the inclusive half-overlap threshold. Slow, careful reading beats cleverness here.

What's the trick to the name similarity check?+

Turn each name into a set of uppercase alphanumeric tokens, split on any non-alphanumeric character, then remove THE, INC, LLC, CO and the other ignored words. Count the intersection. Pass if both sets are non-empty and intersection * 2 >= the smaller set's size. That avoids fractions.

How do I split the CSV without losing empty fields?+

Use a split that keeps trailing empties. In Java, split(",", -1). In Python, str.split(",") already keeps them. Then trim each field. If a row has fewer than six fields or any trimmed field is empty, return MISSING_FIELD. Don't assume the row is well formed.

Which failure gets reported if a row breaks several rules?+

Only the first one, in order: missing field, descriptor length, generic descriptor, then name mismatch. Return early as soon as a check fails. Example 1 shows this: Bean Bliss has a missing field, so that wins over everything else.

How do I prepare in 48 hours?+

Write the solution once from scratch as four small helper functions: parse, length check, blocklist check, name match. Then test your own rows: blank interior line, descriptor of exactly 5 and 31 characters, a lowercase blocklist word, and a name pair at exactly half overlap. That covers nearly every trap.

Problem reported by candidates from a real Online Assessment. Sourced from a publicly-available candidate-aggregated repository. Not affiliated with Stripe.

OA at Stripe?
Invisible during screen share
Get it