End-to-end typesafe SOAP
Move fast with WSDLs
and break nothing.
Generate typed RPC wrappers from your WSDLs with tsoap-cli, then call services with typed-soap — full autocomplete, compile-time checks, and a clean async API.
Hello from tRPC — built with the T3 stack
Features
Why typed SOAP
Everything you need to tame SOAP services in TypeScript.
Automatic end-to-end types
Generated interfaces mirror your WSDL. Change the server contract and TypeScript surfaces the mismatch before you ship.
Snappy DX
Service, port, and operation autocomplete — like an SDK for your SOAP API, without maintaining hand-written wrappers.
Fits your stack
Works with Node 18+, TypeScript 5.x, and the battle-tested soap runtime under the hood.
Cleaner calls
No four-tuple return — typed-soap returns the result directly with a fully typed shape.
Numeric XSD coverage
Types like unsignedInt deserialize to real numbers where raw soap leaves strings.
CLI + runtime pair
tsoap-cli generates once; typed-soap runs at runtime — check generated files into git for reproducible CI.
Get started
Simple to use with unmatched developer experience
It's quick and easy to get a fully typed SOAP client running.
npx tsoap generate \
-i ./weather.wsdl \
-o ./src/generatedFrom any to typed
import soap from 'soap';
const client = await soap.createClientAsync(
'http://example.com?wsdl',
);
// No types, 4-tuple return, easy to get wrong
const [result] = await client.GetWeatherAsync({
city: 'NYC',
});
// ^? anyimport { createWeatherServiceClient }
from './generated/weather.js';
const client = await createWeatherServiceClient(
'http://example.com/weather?wsdl',
);
const result = await client
.WeatherService.WeatherPort.GetWeather({
city: 'NYC',
});
// ^? { temperature: number; description: string }soap vs typed-soap
| Aspect | soap | typed-soap |
|---|---|---|
| Call pattern | client.OpAsync(args) | client.Service.Port.Op(args) |
| Return value | Four-element tuple | Result only |
| Types | Mostly any | Generated from WSDL |
| Numeric XSD types | Often strings | Deserialized to number |
| Autocomplete | Limited | Full Service → Port → Op |
You may not need hand-written SOAP wrappers
“We built TSOAP so teams can stop writing manual WSDL mappings and focus on shipping features. Let the CLI handle the boilerplate — your TypeScript compiler will keep everything in sync.”
Deodat-Lawson
Creator of TSOAP
Packages
Install and get started
typed-soap
Runtime client for type-safe SOAP calls. Wraps soap with a typed proxy, direct async results, and extra numeric deserializers.
Peer: soap ^1.1.6 · Node 18+
tsoap-cli
Code generator: read a WSDL path or URL and emit TypeScript interfaces plus a factory that calls createSoapClient from typed-soap.
Dev dependency · install alongside typed-soap