{"id":"cusip-validate","version":"1.0.0","description":"Validate a 9-character CUSIP's Modulus 10 Double Add Double check digit and parse its issuer, issue and PPN marker.","supported_operations":["validate a cusip","check cusip check digit","is this cusip number valid","cusip checksum validator","parse cusip issuer and issue code","double add double check digit for a security","is this a private placement cusip"],"unsupported_operations":["looking up which company or security a CUSIP actually identifies","validating a 12-character ISIN that embeds a CUSIP (see isin-validate)","generating a fresh CUSIP for a new issuer"],"semantics":["cusip must be exactly 9 characters: no case folding, no trimming. Any other length is reason wrong_length, checked first.","issuer (characters 1-6), issue (7-8) and check_digit (9) are the raw positional substrings, and is_ppn is computed from characters 1-8, whenever cusip is exactly 9 characters, regardless of charset or check-digit validity; all four are null only when length already failed.","Characters 1-8 must each be a digit, an uppercase letter, or one of * @ # (values 36, 37, 38); character 9 must be a digit, else reason invalid_character.","is_ppn is true when any of characters 1-8 is exactly * @ or #, a private placement number.","Check digit: for characters 1-8 (1-indexed), take the value (digit as itself; A=10...Z=35; * = 36, @ = 37, # = 38); double the value at even positions (2,4,6,8); reduce the (possibly doubled) value by summing its own two digits; sum all 8 results; expected check digit is (10 - sum mod 10) mod 10. A mismatch is reason check_digit_mismatch.","valid is true only when length, charset and the check digit all pass, in that order; only one reason is ever returned."],"limits":{"max_cusip_bytes":9},"pricing":{"status":"unpriced","charge_usd":null},"input_schema":{"type":"object","additionalProperties":false,"required":["cusip"],"properties":{"cusip":{"type":"string","minLength":1,"maxLength":9}}},"output_schema":{"type":"object","additionalProperties":false,"required":["valid","reason","issuer","issue","check_digit","is_ppn"],"properties":{"valid":{"type":"boolean"},"reason":{"type":["string","null"],"enum":[null,"wrong_length","invalid_character","check_digit_mismatch"]},"issuer":{"type":["string","null"],"minLength":6,"maxLength":6},"issue":{"type":["string","null"],"minLength":2,"maxLength":2},"check_digit":{"type":["string","null"],"minLength":1,"maxLength":1},"is_ppn":{"type":["boolean","null"]}}},"examples":[{"input":{"cusip":"037833100"},"output":{"valid":true,"reason":null,"issuer":"037833","issue":"10","check_digit":"0","is_ppn":false}},{"input":{"cusip":"0378331*1"},"output":{"valid":true,"reason":null,"issuer":"037833","issue":"1*","check_digit":"1","is_ppn":true}}],"execute_url":"/v1/tools/cusip-validate/versions/1.0.0/execute"}