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.

terminal
npx tsoap generate \
  -i ./weather.wsdl \
  -o ./src/generated
bash

From any to typed

Raw soap (no types)
node-soap
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',
});
//     ^? any
typed-soap + generated client
generated + typed-soap
import { 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

Aspectsoaptyped-soap
Call patternclient.OpAsync(args)client.Service.Port.Op(args)
Return valueFour-element tupleResult only
TypesMostly anyGenerated from WSDL
Numeric XSD typesOften stringsDeserialized to number
AutocompleteLimitedFull 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.”
DL

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