⚙ Development environment — API behavior and data may change.

For developers

One endpoint in. Provenance out.

REST + JSON. Deterministic hot path, cache keys you can reason about, and confidence / warnings / provenance on every response.

https://dev.normatico.com/api/v1 Full API docs →
curl
curl -s https://dev.normatico.com/api/v1/normalize \
  -H "Authorization: Bearer <your-api-key>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Γιώργος",
    "source_locale": "el-GR",
    "target_locale": "en-US",
    "purpose": "crm_display"
  }'
Response anatomy 200 OK
{
  "input":  { "raw": "Γιώργος", "normalized": "Γιώργος",
              "detected_locale": "el-GR",
              "detected_script": "Grek", "name_type": "given" },
  "result": { "output": "Giorgos", "display": "Giorgos",
              "greeting": null, "sort_key": null,
              "monogram": "G", "parts": null,
              "inflections": null },
  "alternatives": [
    { "value": "Giorgos", "confidence": 0.7,
      "relation_type": "transliteration",
      "source": "machine_generated" }
  ],
  "quality":  { "confidence": 0.7,
                "level": "machine_candidate",
                "method": "machine_generated",
                "needs_review": true,
                "graph_status": "candidate" },
  "relation_type": "transliteration",
  "warnings": ["machine_generated_needs_review"],
  "provenance": [
    { "source": "name_graph", "license": "internal" }
  ],
  "cache": { "status": "miss" }
}

A live response for a first-seen name: it comes back honestly as a machine candidate with needs_review — verification proceeds in the background.

Endpoints.

POST/api/v1/normalize Transliterate & localize a name for a purposeMichael → マイケル
POST/api/v1/batch Normalize up to 5,000 names in one callcrm-1 … crm-5000
POST/api/v1/format Format structured name parts for a localegiven + surname → display
POST/api/v1/extract-email Extract a personal name from an email addressjoao.silva@… → João Silva
POST/api/v1/match Same person? Cross-script, diminutives, typosСаша ↔ Александр
POST/api/v1/match/batch Match name pairs in bulkup to 1,000 pairs
POST/api/v1/salutation Greeting for register + channelformal · email
POST/api/v1/romanize ICAO 9303, BGN/PCGN, GOST 7.79, UA-2010Дмитрий → DMITRII
POST/api/v1/inspect Mojibake, org-in-person-field, swapped fieldsООО Ромашка → company
POST/api/v1/pronounce Phonetic guidance for humansSiobhán → shiv-AWN
POST/api/v1/variants Known variants and equivalents of a namerecommended_for_crm flags
POST/api/v1/feedback Submit a correction or confirmationfeeds the review queue
GET/api/v1/recheck/{token} Has this name been verified yet? Instant, freechanged · verified
POST/api/v1/webhooks Signed events when a watched name changesname.verified · HMAC
GET/api/v1/health Liveness; /health/ready checks the databasestatus: ok
⚡ Deterministic
Same input, same output. A deterministic transliteration floor plus validated generation — only verified, high-confidence renderings are cached and reused.
🔒 no_store
Raw names are never persisted under no_store and never logged in production — structured logs use a strict field whitelist.
🧾 Provenance
Every rendering cites its source and license: CLDR, Wikidata, Wiktionary, manual review.

Get a sandbox key today.

Dev environment at https://dev.normatico.com/api/v1 — behavior may change, honesty won't.

Request access