REST API · v1.0.0

Raw transaction strings.
Clean structured JSON.

Bank exports are chaos. UPI strings, POS slop, NEFT noise. Send them to our API and get back strictly-typed, categorized, confidence-scored JSON — in milliseconds.

10k Beta calls
90% Deterministic
< 80ms Median latency
v1.0.0 Ruleset locked
curl
curl -X POST https://api.normalyze.dev/v1/normalize \
  -H "Authorization: Bearer nyz_live_••••••••" \
  -H "Content-Type: application/json" \
  -d '{"transactions": [
    {"id": "t1", "raw": "UPI/ZOMATO/98123456/FOOD",
     "amount": 349, "timestamp": "2024-03-15 19:42"}
  ]}'
200 OK · 43ms
{
  "processed": 1,
  "results": [{
    "merchant": "Zomato",
    "category": "Food & Beverage",
    "transaction_type": "DEBIT",
    "channel": "UPI",
    "is_reversal": false,
    "normalized_timestamp": "2024-03-15T19:42:00",
    "explain": {
      "path": "keyword_match",
      "rule": "zomato → Food & Beverage",
      "confidence": 0.95 HIGH
    }
  }]
}

How it works

Send noise.
Receive signal.

Three steps from raw bank export to structured data your pipeline can actually use.

01 —

Authenticate once

Generate an nyz_live_ API key in 30 seconds. No sales call, no NDA, no waiting. 10,000 free calls during beta — no card required.

POST /v1/keys/generate →

02 —

Send your strings

Pass a batch of raw transaction strings — from Razorpay exports, RBI AA feeds, legacy cores, anywhere. Up to 500 per request. CSV upload also supported.

POST /v1/normalize →

03 —

Receive typed JSON

Get back merchant name, category, channel, confidence score, reversal flags, and an explain field showing exactly which rule or model path fired.

200 OK in <80ms →

Live demo

Paste a string.
See it transform.

No API key needed. Try it right now.

Raw transaction string
try →
or press Ctrl+Enter
Normalized JSON ready

output appears here

Before — raw strings

UPI/ZOMATO/98123456/FOOD POS/BPCL PETROL/NEW DELHI NEFT/SALARY/CR/ACME CORP LTD REFUND/SWIGGY/REF982341/ORIG881234 SPLIT/AMAZON/PART1OF2/ORDER99

Pandas
engine +
Gemini

After — structured JSON

merchant: "Zomato"
category: "Food & Beverage"
channel: "UPI"
is_reversal: false
is_partial: false
confidence: 0.95
path: "keyword_match"
ruleset_version: "v1.0.0"

Features

Everything a pipeline
actually needs.

Built for developers who are done writing regex and ready to ship.

Confidence score on every result

Know exactly which results to trust and which to route to human review. The explain field shows the classification path (keyword match vs. model fallback) and a confidence value per transaction — not just per batch.

pipeline-ready
🔒

Deterministic versioning

Every response carries a ruleset_version field. Your categorizations don't drift when we update the engine. Lock to a version and results are stable month to month — critical for credit models and bookkeeping agents.

v1.0.0 locked

Refund & split detection

The edge case that kills most parsers. Refunds that reference the original merchant in a mangled format return is_reversal: true. Partial payments return is_partial: true. Your pipeline handles them without regex hacks.

is_reversal · is_partial
🤖

Agent-readable schema

FastAPI auto-generates an OpenAPI spec at /openapi.json. Every endpoint has explicit operationId values and machine-readable error objects. AI agents can discover, authenticate, and call this API with zero human setup.

MCP-compatible
📁

CSV batch upload

Drop a bank statement CSV directly. Auto-detects Indian bank column formats including Narration, Description, and Particulars. Returns the same normalized JSON as the standard endpoint. Up to 500 rows per upload.

POST /v1/normalize/csv
🇮🇳

Indian transaction coverage

Built specifically for Indian bank exports. UPI, NEFT, IMPS, RTGS, POS, ATM, NACH. Vendor coverage for Zomato, Swiggy, Zepto, BPCL, IRCTC, Razorpay merchants, and hundreds more — with Gemini fallback for anything else.

RBI AA · Razorpay · legacy cores

Pricing

Pay for what
you actually use.

No monthly subscription. No surprise bills. Usage resets monthly, billed at end of period via Stripe.

Free

$0

10,000 calls during beta · no card required

  • All endpoints included
  • Full JSON schema
  • Gemini fallback enabled
  • Swagger UI at /docs
  • 10,000 calls during beta
Get free key

Your first 10,000 calls
are on us.

Beta access — 10,000 free calls, no card required. Enter your email and we'll send a verification code.

Or hit POST /v1/keys/generate directly with your email.

Get in touch.

Questions about the API, pricing, enterprise deployments, or anything else — we respond within 2 business days.

Response within 2 business days
Shimla, India
Message sent!

We'll get back to you within 2 business days.