Free JSON to TypeScript Interface Generator
Paste any JSON — an API response, a config blob, a sample payload — and get production-ready TypeScript interfaces with nested types, array unions, and optional fields. 100% client-side, no signup.
Try a Sample
Nested Interface Generation
Each nested object becomes its own named interface — easier to import, reuse, and refactor than a single 500-line anonymous type. Names are deduplicated automatically.
Full Style Control
Toggle `interface` vs `type`, `export` keyword, semicolons, root-name override, and array union behavior. Match your team's exact lint config without touching the output.
Heterogeneous Array Unions
When an array contains mixed types (`["a", 1, true]`), we emit a proper TypeScript union: `(string | number | boolean)[]`. No data loss, no `any` escape hatches.
100% Client-Side
Type inference runs in your browser. API responses with auth tokens, customer PII, or internal schema details never leave your device.
From Untyped API Response to Production-Grade TypeScript in One Paste
Every TypeScript codebase contains a boundary where typed code meets untyped JSON — a fetch call to an external API, a config file loaded at startup, a webhook payload from a third-party service. Hand-typing those shapes is the most tedious chore in modern development. Our Free Online JSON to TypeScript Interface Generator eliminates it: paste any JSON, get a clean, production-ready type definition with nested interfaces, heterogeneous array unions, and optional fields — instantly, 100% client-side, with no SaaS account.
Pair this generator with our JSON Formatter (to validate and pretty-print the source payload first), the CSV ↔ JSON Converter (when your source data is tabular), the YAML Validator (for config-file workflows), and the Case Converter (to normalize key naming between camelCase TypeScript and snake_case JSON).
JSON to TypeScript Type Mapping
| JSON Value | Inferred TypeScript | Notes |
|---|---|---|
| "hello" | string | Literal string types not inferred — use template literal types if needed |
| 42, `3.14` | number | JavaScript has only one numeric type; integers and floats both → `number` |
| true, `false` | boolean | Maps directly |
| null | null (optional) | Field marked with `?:` — you likely want `null | T` after inspection |
| {} | Named interface | One interface per nested object; PascalCase name from field |
| […] | T[] or (T1 | T2)[] | Union when heterogeneous; element name auto-singularized |
A Type-Safe API Integration Workflow
Capture a Real Response
Hit the endpoint with curl, fetch, or Postman. Save the response body.
Validate & Pretty-Print
Pass through our JSON Formatter to confirm it parses and inspect the shape.
Generate Types
Paste into the converter above. Set a meaningful root name (e.g. `StripePaymentIntent`).
Refine & Commit
Tighten nullable fields to `null | T`, add `readonly` modifiers, narrow string fields to literal unions where applicable.
After Generating: Five Quick Refinements
1. Narrow Status Strings
status: string → status: 'pending' | 'succeeded' | 'failed'. Adds compile-time exhaustiveness.
2. Tighten Nullable Fields
email?: null → email: string | null. The optional `?:` is rarely what you want.
3. Mark Immutable Fields
Server-set fields (id, created_at, version) should be readonly so client code can't mutate them.
4. Brand IDs
type UserId = string & { __brand: 'UserId' }. Stops accidental cross-type ID swaps at compile time.
5. Discriminated Unions
When response shape varies by a `type` field, refactor to a union with a discriminator for exhaustive switch checking.
Bonus: Runtime Validators
Wrap with a Zod / Valibot schema so types and runtime checks stay in sync.