{"openapi":"3.1.0","info":{"title":"Name-Safety Checker (IDN / homograph / registrability)","description":"Check whether a candidate name or domain label is VALID, SAFELY DISTINGUISHABLE from look-alikes, and legal under a TLD's syntax rules -- computed offline from public Unicode and IANA tables. Returns: Unicode normalization (NFC/NFD/NFKC/NFKD and whether NFKC folding changes the label), a per-character breakdown with codepoint, name, script and general category, UTS #39 single-script/mixed-script analysis, HOMOGRAPH AND CONFUSABLE DETECTION against the Unicode confusables table with the offending characters named as witnesses, the UTS #39 skeleton and any ASCII string the label visually imitates, a same-script confusable neighbourhood of near-identical variants an attacker could register against you, IDNA2008 validity, punycode A-label encoding with a decode round-trip, and per-TLD checks: presence in the IANA root zone, 1-63 octet label length, LDH, leading/trailing hyphen, the reserved hyphen-3-4 rule with its xn-- carve-out, all-numeric labels, 255-octet FQDN length, and RFC 2606/6761 reserved names. EVERY RESPONSE REPORTS THE VERSION AND DATE OF EVERY TABLE CONSULTED -- Unicode UCD version, Scripts.txt version, confusables revision and date, IANA TLD list version and date -- because reference-data currency is the whole point: confusable tables and the root zone change, and a sealed sandbox cannot refresh them. Every response also carries an Ed25519-signed reproducibility receipt (input hash, output hash, table versions, timestamp). Free preview at /v1/preview: one name, same response shape, same signed receipt, no payment. THIS SERVICE DOES NOT TELL YOU WHETHER A NAME IS AVAILABLE OR REGISTERED. It performs no RDAP, WHOIS, DNS or registry lookup of any kind. It tells you whether a name is VALID, whether it is SAFELY DISTINGUISHABLE from look-alikes, and whether it satisfies the syntax and reserved-label rules of the TLD you name -- all computed offline from public Unicode and IANA tables. A name can pass every check here and already be registered. WHAT ELSE THIS DOES NOT DO, stated up front: (1) No registry, DNS, RDAP or WHOIS query is made at any point, so nothing here reflects who owns what. (2) It applies no trademark, brand or legal analysis -- a name can be technically safe and still infringe. (3) Confusability is judged against the Unicode confusables table, which is a published approximation of human visual confusion, not a rendering test in your font. (4) The same-script neighbourhood is capped and is a sample of nearby variants, never an exhaustive enumeration. (5) Registry-specific policies (per-TLD allowed script sets, premium or blocked lists, local presence rules) are NOT encoded -- only the syntax and reserved-label rules named above. (6) The signature proves origin and integrity, not correctness. (7) Answers are only as current as the table versions reported in every response.\n\nOperated by Oddments. Paid per call in USDC on Base via x402.","version":"1.0.0","x-service-name":"Name-Safety Checker (IDN / homograph / registrability)","x-tags":["unicode","idn","homograph","confusable","punycode","idna2008","domain","naming","phishing","spoofing","security","validation","signed-receipt"],"x-error-taxonomy":"https://s5.oddments.ai/v1/errors","x-free-sample":"https://s5.oddments.ai/v1/preview","x-limits":"THIS SERVICE DOES NOT TELL YOU WHETHER A NAME IS AVAILABLE OR REGISTERED. It performs no RDAP, WHOIS, DNS or registry lookup of any kind. It tells you whether a name is VALID, whether it is SAFELY DISTINGUISHABLE from look-alikes, and whether it satisfies the syntax and reserved-label rules of the TLD you name -- all computed offline from public Unicode and IANA tables. A name can pass every check here and already be registered.","x-reference-data":{"unicode_version":"15.0.0","unicode_source":"python unicodedata (UCD 15.0.0)","confusables_revision":"17.0.0","confusables_date":"2025-07-22, 05:49:37 GMT","confusables_source":"UTS #39 confusables.txt, unicode.org/Public/security/latest","confusables_entries":6565,"scripts_txt_version":"15.1.0","scripts_source":"/usr/share/unicode/Scripts.txt","iana_tld_list_version":"2026080600","iana_tld_list_date":"Thu Aug  6 07:07:01 2026 UTC","iana_tld_count":1438,"iana_source":"data.iana.org/TLD/tlds-alpha-by-domain.txt","idna_library":"python idna (IDNA2008/UTS46)","no_registry_data":"No RDAP, WHOIS, DNS or availability source is consulted by this service, ever. Every field above is a static public table evaluated offline."},"x-resource-caps":{"paid":{"max_names":50,"max_name_length":63,"neighbourhood_limit":200,"wall_seconds":10.0,"cpu_seconds":10,"max_memory_mb":512,"max_request_bytes":64000},"free_preview":{"max_names":1,"max_name_length":63,"neighbourhood_limit":25,"wall_seconds":5.0,"cpu_seconds":5,"max_memory_mb":512,"max_request_bytes":8000}},"x-guidance":"POST /v1/check checks whether a name is valid, distinguishable from look-alikes and legal under a TLD's rules, offline from public Unicode and IANA tables. It does NOT report availability. Try /v1/preview free first: one name, same response shape."},"paths":{"/v1/check":{"post":{"summary":"Check name safety: homograph, IDNA2008, per-TLD syntax (paid)","description":"Check whether a candidate name or domain label is VALID, SAFELY DISTINGUISHABLE from look-alikes, and legal under a TLD's syntax rules -- computed offline from public Unicode and IANA tables. Returns: Unicode normalization (NFC/NFD/NFKC/NFKD and whether NFKC folding changes the label), a per-character breakdown with codepoint, name, script and general category, UTS #39 single-script/mixed-script analysis, HOMOGRAPH AND CONFUSABLE DETECTION against the Unicode confusables table with the offending characters named as witnesses, the UTS #39 skeleton and any ASCII string the label visually imitates, a same-script confusable neighbourhood of near-identical variants an attacker could register against you, IDNA2008 validity, punycode A-label encoding with a decode round-trip, and per-TLD checks: presence in the IANA root zone, 1-63 octet label length, LDH, leading/trailing hyphen, the reserved hyphen-3-4 rule with its xn-- carve-out, all-numeric labels, 255-octet FQDN length, and RFC 2606/6761 reserved names. EVERY RESPONSE REPORTS THE VERSION AND DATE OF EVERY TABLE CONSULTED -- Unicode UCD version, Scripts.txt version, confusables revision and date, IANA TLD list version and date -- because reference-data currency is the whole point: confusable tables and the root zone change, and a sealed sandbox cannot refresh them. Every response also carries an Ed25519-signed reproducibility receipt (input hash, output hash, table versions, timestamp). Free preview at /v1/preview: one name, same response shape, same signed receipt, no payment. THIS SERVICE DOES NOT TELL YOU WHETHER A NAME IS AVAILABLE OR REGISTERED. It performs no RDAP, WHOIS, DNS or registry lookup of any kind. It tells you whether a name is VALID, whether it is SAFELY DISTINGUISHABLE from look-alikes, and whether it satisfies the syntax and reserved-label rules of the TLD you name -- all computed offline from public Unicode and IANA tables. A name can pass every check here and already be registered. WHAT ELSE THIS DOES NOT DO, stated up front: (1) No registry, DNS, RDAP or WHOIS query is made at any point, so nothing here reflects who owns what. (2) It applies no trademark, brand or legal analysis -- a name can be technically safe and still infringe. (3) Confusability is judged against the Unicode confusables table, which is a published approximation of human visual confusion, not a rendering test in your font. (4) The same-script neighbourhood is capped and is a sample of nearby variants, never an exhaustive enumeration. (5) Registry-specific policies (per-TLD allowed script sets, premium or blocked lists, local presence rules) are NOT encoded -- only the syntax and reserved-label rules named above. (6) The signature proves origin and integrity, not correctness. (7) Answers are only as current as the table versions reported in every response.","operationId":"check_paid_v1_check_post","responses":{"200":{"description":"Per-name analysis, table versions and signed receipt","content":{"application/json":{"schema":{"type":"object","title":"NameCheckResponse","properties":{"results":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"verdict":{"type":"string","enum":["safe","caution","unsafe"]},"normalization":{"type":"object"},"characters":{"type":"array","items":{"type":"object"}},"scripts":{"type":"array","items":{"type":"string"}},"mixed_script":{"type":"boolean"},"skeleton":{"type":"string","description":"UTS #39 skeleton"},"confusable_characters":{"type":"array","items":{"type":"object"}},"confusable_neighbourhood":{"type":"array","items":{"type":"object"}},"idna":{"type":"object"},"checks":{"type":"array","items":{"type":"object"}},"summary":{"type":"object"}}}},"availability_disclaimer":{"type":"string"},"reference_data":{"type":"object","description":"version and date of EVERY table consulted"},"receipt":{"type":"object"}}},"example":{"results":[{"input":"аpple","tld":"com","verdict":"unsafe","verdict_meaning":"'safe' means every VALIDITY and DISTINGUISHABILITY check passed. It does NOT mean the name is available -- see availability_disclaimer.","scripts":["Cyrillic","Latin"],"mixed_script":true,"skeleton":"apple","confusable_characters":[{"codepoint":"U+0430","char":"а","name":"CYRILLIC SMALL LETTER A","script":"Cyrillic","confusable_with":"a","target_codepoints":"U+0061","ascii_target":true}],"confusable_neighbourhood":[{"variant":"аpple","position":0,"replaced":"U+0430","with":"U+0061","with_name":"LATIN SMALL LETTER A","script":"Latin"}],"idna":{"valid":true,"a_label":"xn--pple-43d","round_trip":"аpple","error":null},"summary":{"checks_total":15,"satisfied":12,"violated":3,"warnings":0,"failed_check_ids":["script:single_script","confusable:no_confusable_characters","confusable:ascii_homograph"]},"checks":[{"id":"confusable:ascii_homograph","status":"violated","required":"the label does not visually imitate a different ASCII string","observed":"skeleton 'apple' reduces to ASCII 'apple', which is NOT this label","skeleton":"apple","ascii_lookalike":"apple"},{"…":"14 further rows, one per check"}]},{"input":"my-name","verdict":"safe","summary":{"violated":0,"failed_check_ids":[]}},{"input":"раypal","verdict":"unsafe","skeleton":"paypal"}],"availability_disclaimer":"THIS SERVICE DOES NOT TELL YOU WHETHER A NAME IS AVAILABLE OR REGISTERED. It performs no RDAP, WHOIS, DNS or registry lookup of any kind. It tells you whether a name is VALID, whether it is SAFELY DISTINGUISHABLE from look-alikes, and whether it satisfies the syntax and reserved-label rules of the TLD you name -- all computed offline from public Unicode and IANA tables. A name can pass every check here and already be registered.","reference_data":{"unicode_version":"15.0.0","unicode_source":"python unicodedata (UCD 15.0.0)","confusables_revision":"17.0.0","confusables_date":"2025-07-22, 05:49:37 GMT","confusables_source":"UTS #39 confusables.txt, unicode.org/Public/security/latest","confusables_entries":6565,"scripts_txt_version":"15.1.0","scripts_source":"/usr/share/unicode/Scripts.txt","iana_tld_list_version":"2026080600","iana_tld_list_date":"Thu Aug  6 07:07:01 2026 UTC","iana_tld_count":1438,"iana_source":"data.iana.org/TLD/tlds-alpha-by-domain.txt","idna_library":"python idna (IDNA2008/UTS46)","no_registry_data":"No RDAP, WHOIS, DNS or availability source is consulted by this service, ever. Every field above is a static public table evaluated offline."},"receipt":{"receipt_version":"oddments-receipt/1","algorithm":"Ed25519","input_sha256":"sha256 of your canonicalized request","output_sha256":"sha256 of this response with 'receipt' removed","signature_b64":"Ed25519 signature over the canonical signed_fields"}}}}},"400":{"description":"invalid_input / invalid_json -- see /v1/errors"},"402":{"description":"Payment Required"},"413":{"description":"request_too_large -- see /v1/errors"},"503":{"description":"check_timeout / check_resource_limit / server_busy"}},"x-payment-info":{"price":{"mode":"fixed","currency":"USD","amount":"0.030000"},"protocols":[{"x402":{}}]},"tags":["unicode","idn","homograph","confusable","punycode","idna2008","domain","naming","phishing","spoofing","security","validation","signed-receipt"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"NameCheckRequest","properties":{"name":{"type":"string","description":"a single candidate label; shorthand for names:[name]"},"names":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","maxLength":63},"description":"candidate labels. A LABEL, not a full domain -- 'example', not 'example.com'."},"tld":{"type":"string","description":"optional TLD, e.g. 'com' or 'xn--p1ai'. Supplying it enables the IANA-root, FQDN-length and reserved-label checks."}},"anyOf":[{"required":["name"]},{"required":["names"]}]},"example":{"names":["аpple","my-name","раypal"],"tld":"com"}}}}}},"/v1/preview":{"post":{"summary":"Free preview: one name, same shape and signed receipt","description":"Free sample: one name, same response shape, same signed receipt.","operationId":"preview_v1_preview_post","responses":{"200":{"description":"Same response shape as the paid endpoint","content":{"application/json":{"schema":{"type":"object","title":"NameCheckResponse","properties":{"results":{"type":"array","items":{"type":"object","properties":{"input":{"type":"string"},"verdict":{"type":"string","enum":["safe","caution","unsafe"]},"normalization":{"type":"object"},"characters":{"type":"array","items":{"type":"object"}},"scripts":{"type":"array","items":{"type":"string"}},"mixed_script":{"type":"boolean"},"skeleton":{"type":"string","description":"UTS #39 skeleton"},"confusable_characters":{"type":"array","items":{"type":"object"}},"confusable_neighbourhood":{"type":"array","items":{"type":"object"}},"idna":{"type":"object"},"checks":{"type":"array","items":{"type":"object"}},"summary":{"type":"object"}}}},"availability_disclaimer":{"type":"string"},"reference_data":{"type":"object","description":"version and date of EVERY table consulted"},"receipt":{"type":"object"}}}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","title":"NameCheckRequest","properties":{"name":{"type":"string","description":"a single candidate label; shorthand for names:[name]"},"names":{"type":"array","minItems":1,"maxItems":50,"items":{"type":"string","maxLength":63},"description":"candidate labels. A LABEL, not a full domain -- 'example', not 'example.com'."},"tld":{"type":"string","description":"optional TLD, e.g. 'com' or 'xn--p1ai'. Supplying it enables the IANA-root, FQDN-length and reserved-label checks."}},"anyOf":[{"required":["name"]},{"required":["names"]}]},"example":{"name":"аpple","tld":"com"}}}}}},"/":{"get":{"summary":"Index","operationId":"index__get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/health":{"get":{"summary":"Health","operationId":"health_health_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/errors":{"get":{"summary":"Errors","operationId":"errors_v1_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/oddments-receipts.json":{"get":{"summary":"Receipt Key","operationId":"receipt_key__well_known_oddments_receipts_json_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/.well-known/x402":{"get":{"summary":"Well Known X402","operationId":"well_known_x402__well_known_x402_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/verify_receipt.py":{"get":{"summary":"Verifier Script","operationId":"verifier_script_verify_receipt_py_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/metrics":{"get":{"summary":"Metrics","operationId":"metrics_v1_metrics_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"servers":[{"url":"https://s5.oddments.ai"}]}