Production-grade TypeScript client for the Wise Platform API — all 42 API groups, zero runtime dependencies.
- Full Wise API coverage (Profiles, Transfers, Cards, KYC, Webhooks, and more)
- Multiple authentication modes
- Personal Token
- OAuth Client Credentials (auto-refresh)
- OAuth User Token (custom refresh)
- Built-in reliability
- Retries with exponential backoff
- Rate limiting (token bucket)
- Circuit breaker support
- Middleware hooks
- Request hooks
- Response hooks (logging, metrics)
- Async pagination iterator
- Webhook verification + routing
- Zero external dependencies
npm install wise-sdkimport{WiseClient}from"wise-sdk";constclient=newWiseClient({personalToken: process.env.WISE_API_TOKEN!,sandbox: true,// set false for production});asyncfunctionmain(){constprofiles=awaitclient.profiles.list();for(constpofprofiles){console.log(`Profile ${p.id} (${p.type})`);}}main();constclient=newWiseClient({personalToken: process.env.WISE_API_TOKEN!,});constclient=newWiseClient({clientId: process.env.WISE_CLIENT_ID!,clientSecret: process.env.WISE_CLIENT_SECRET!,});constclient=newWiseClient({accessToken: "access-token",refreshToken: "refresh-token",tokenExpiresAt: newDate(Date.now()+3600_000),onTokenRefresh: async(refreshToken)=>{return{accessToken: "new-access-token",refreshToken: "new-refresh-token",expiresAt: newDate(Date.now()+3600_000),};},});import{PRODUCTION_BASE_URL,SANDBOX_BASE_URL}from"wise-sdk";// Production (default)constprod=newWiseClient({personalToken: "token"});// Sandboxconstsandbox=newWiseClient({personalToken: "token",sandbox: true,});// 1. Create a quoteconstquote=awaitclient.quotes.create(profileId,{sourceCurrency: "USD",targetCurrency: "INR",sourceAmount: 1000,});// 2. Create a recipientconstrecipient=awaitclient.recipients.create({profile: profileId,accountHolderName: "Alice",currency: "INR",type: "ifsc",details: {ifsc: "HDFC0001234",accountNumber: "1234567890",},});// 3. Create transferconsttransfer=awaitclient.transfers.create({targetAccount: recipient.id,quoteUuid: quote.id,customerTransactionId: "unique-id",details: {reference: "Invoice #42"},});// 4. Fund transferawaitclient.transfers.fund(profileId,transfer.id);import{isNotFound,isRateLimited,isSCARequired,fieldErrors,}from"wise-sdk";try{awaitclient.transfers.fund(profileId,transferId);}catch(err){if(isNotFound(err)){console.log("Resource not found");}elseif(isRateLimited(err)){console.log("Rate limited");}elseif(isSCARequired(err)){console.log("SCA required");}for(constfeoffieldErrors(err)){console.log(fe.field,fe.message);}}import{AsyncIter}from"wise-sdk";constiter=newAsyncIter(async(page)=>{returnclient.transfers.list({
profileId,
...page,});});forawait(consttransferofiter){console.log(transfer.id,transfer.status);}import{EventRouter,isTransferStateChangeEvent,}from"wise-sdk";constrouter=newEventRouter({secret: process.env.WISE_WEBHOOK_SECRET!,});router.on("transfers#state-change",async(event)=>{if(isTransferStateChangeEvent(event)){console.log(event.data.resource.id);}});import{TokenBucket,CircuitBreaker}from"wise-sdk";constclient=newWiseClient({personalToken: "token",timeoutMs: 30_000,retry: {maxAttempts: 3,},rateLimiter: TokenBucket.default(),circuitBreaker: newCircuitBreaker({failureThreshold: 5,timeout: 30_000,}),requestHooks: [async(req)=>{req.headers.set("X-Custom","value");returnreq;},],responseHooks: [(req,res,latency)=>{console.log(req.url,res.status,latency);},],});import{newIdempotencyKey,ptr}from"wise-sdk";constidempotencyKey=newIdempotencyKey();constamount=ptr(1000);awaitclient.ping();Includes all major Wise services:
- Profiles
- Quotes
- Transfers
- Recipients
- Balances
- Cards & transactions
- KYC & verification
- Webhooks
- OAuth & security
- Batch payments
- Multi-currency accounts
- Disputes
- Direct debits
- And more
MIT
PRs and issues are welcome!