diff --git a/yandex-money-sdk/yandex-money-sdk-tests.ts b/yandex-money-sdk/yandex-money-sdk-tests.ts
new file mode 100644
index 000000000..9641fdf48
--- /dev/null
+++ b/yandex-money-sdk/yandex-money-sdk-tests.ts
@@ -0,0 +1,124 @@
+///
+
+import * as ymsdk from 'yandex-money-sdk';
+
+let wallet: ymsdk.Wallet;
+let externalPayment: ymsdk.ExternalPayment;
+
+{
+ let clientId: string;
+ let redirectURI: string;
+ let scope: string[];
+ let result: string;
+
+ result = ymsdk.Wallet.buildObtainTokenUrl(clientId, redirectURI, scope);
+}
+
+{
+ let clientId: string;
+ let code: string;
+ let redirectURI: string;
+ let clientSecret: string;
+ let callback: ymsdk.ResponseCallback;
+
+ ymsdk.Wallet.getAccessToken(clientId, code, redirectURI, clientSecret, callback);
+}
+
+{
+ let token: string;
+ let revoke_all: any;
+ let callback: ymsdk.ResponseCallback;
+
+ ymsdk.Wallet.revokeToken(token, revoke_all, callback);
+}
+
+{
+ let accessToken: string;
+ let result: ymsdk.Wallet;
+
+ result = new ymsdk.Wallet(accessToken);
+}
+
+{
+ let params: YandexMoneySDK.Wallet.SendAuthenticatedRequestParams;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.sendAuthenticatedRequest(params, callback)
+}
+
+{
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.accountInfo(callback);
+}
+
+{
+ let options: YandexMoneySDK.Wallet.OperationHistoryOptions;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.operationHistory(options, callback);
+}
+
+{
+ let operation_id: string;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.operationDetails(operation_id, callback);
+}
+
+{
+ let options: YandexMoneySDK.Wallet.RequestPaymentOptions;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.requestPayment(options, callback);
+}
+
+{
+ let options: YandexMoneySDK.Wallet.ProcessPaymentOptions;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.processPayment(options, callback);
+}
+
+{
+ let operation_id: string;
+ let protectionCode: string;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.incomingTransferAccept(operation_id, protectionCode, callback);
+}
+
+{
+ let operation_id: string;
+ let callback: ymsdk.ResponseCallback;
+
+ wallet.incomingTransferReject(operation_id, callback);
+}
+
+{
+ let clientId: string;
+ let callback: ymsdk.ResponseCallback;
+
+ ymsdk.ExternalPayment.getInstanceId(clientId, callback);
+}
+
+{
+ let instanceId: string;
+ let result: ymsdk.ExternalPayment;
+
+ result = new ymsdk.ExternalPayment(instanceId);
+}
+
+{
+ let options: YandexMoneySDK.ExternalPayment.RequestOptions;
+ let callback: ymsdk.ResponseCallback;
+
+ externalPayment.request(options, callback);
+}
+
+{
+ let options: YandexMoneySDK.ExternalPayment.ProcessOptions;
+ let callback: ymsdk.ResponseCallback;
+
+ externalPayment.process(options, callback);
+}
diff --git a/yandex-money-sdk/yandex-money-sdk.d.ts b/yandex-money-sdk/yandex-money-sdk.d.ts
new file mode 100644
index 000000000..0fda60f2f
--- /dev/null
+++ b/yandex-money-sdk/yandex-money-sdk.d.ts
@@ -0,0 +1,308 @@
+// Type definitions for NodeJS Yandex.Money API SDK
+// Project: https://github.com/yandex-money/yandex-money-sdk-nodejs
+// Definitions by: Ilya Mochalov
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare namespace YandexMoneySDK {
+ namespace Wallet {
+ interface GetAccessTokenResult {
+ access_token?: string;
+ error?: string;
+ }
+
+ interface SendAuthenticatedRequestParams {
+ headers?: any;
+ data?: any;
+ url: string;
+ }
+
+ interface AccountInfoResult {
+ account: string;
+ balance: number;
+ currency: string;
+ account_status: string;
+ account_type: string;
+ avatar?: {
+ url: string;
+ ts: string;
+ };
+ balance_details?: {
+ total: number;
+ available: number;
+ deposition_pending?: number;
+ blocked?: number;
+ debt?: number;
+ hold?: number;
+ }
+ cards_linked?: {
+ pan_fragment?: string;
+ type?: string;
+ }[];
+ }
+
+ interface OperationHistoryOptions {
+ type: string;
+ label: string;
+ from?: string|Date;
+ till?: string|Date;
+ start_record?: string;
+ records?: number;
+ details?: boolean;
+ }
+
+ interface OperationHistoryResult {
+ error?: string;
+ next_record?: string;
+ operations?: {
+ operation_id: string;
+ status: string;
+ datetime: string;
+ title: string;
+ pattern_id?: string;
+ direction: string;
+ amount: number;
+ label?: string;
+ type?: string;
+ }[];
+ }
+
+ interface OperationDetailsResult {
+ error?: string;
+ operation_id?: string;
+ status?: string;
+ pattern_id?: string;
+ direction?: string;
+ amount?: number;
+ amount_due?: number;
+ fee?: number;
+ datetime?: string;
+ title?: string;
+ sender?: string;
+ recipient?: string;
+ recipient_type?: string;
+ message?: string;
+ comment?: string;
+ codepro?: boolean;
+ protection_code?: string;
+ expires?: string;
+ answer_datetime?: string;
+ label?: string;
+ details?: string;
+ type?: string;
+ digital_goods?: {
+ article: {
+ merchantArticleId: string;
+ serial: string;
+ secret: string;
+ }[];
+ bonus: {
+ serial: string;
+ secret: string;
+ }[];
+ };
+ }
+
+ interface RequestPaymentOptions {
+ pattern_id: string;
+ to?: string;
+ amount?: number;
+ amount_due?: number;
+ comment?: string;
+ message?: string;
+ label?: string;
+ codepro?: boolean;
+ hold_for_pickup?: boolean;
+ expire_period?: number;
+ 'phone-number'?: string;
+ [key: string]: any
+
+ test_payment?: boolean;
+ test_card?: string;
+ test_result?: string;
+ }
+
+ interface RequestPaymentResult {
+ status: string;
+ error?: string;
+ money_source?: {
+ wallet?: {
+ allowed: boolean;
+ };
+ cards?: {
+ allowed: boolean;
+ csc_required: boolean;
+ items: {
+ id: string;
+ pan_fragment: string;
+ type: string;
+ }[];
+ };
+ };
+ request_id?: string;
+ contract_amount?: number;
+ balance?: number;
+ recipient_account_status?: string;
+ recipient_account_type?: string;
+ protection_code?: string;
+ account_unblock_uri?: string;
+ ext_action_uri?: string;
+ }
+
+ interface ProcessPaymentOptions {
+ request_id: string;
+ money_source?: string;
+ csc?: string;
+ ext_auth_success_uri?: string;
+ ext_auth_fail_uri?: string;
+
+ test_payment?: boolean;
+ test_card?: string;
+ test_result?: string;
+ }
+
+ interface ProcessPaymentResult {
+ status: string;
+ error?: string;
+ payment_id?: string;
+ balance?: number;
+ invoice_id?: string;
+ payer?: string;
+ payee?: string;
+ credit_amount?: number;
+ account_unblock_uri?: string;
+ hold_for_pickup_link?: string;
+ acs_uri?: string;
+ acs_params?: {
+ MD: string;
+ PaReq: string;
+ [key: string]: any
+ };
+ next_retry?: number;
+ digital_goods?: {
+ article: {
+ merchantArticleId: string;
+ serial: string;
+ secret: string;
+ }[];
+ bonus: {
+ serial: string;
+ secret: string;
+ }[];
+ };
+ }
+
+ interface IncomingTransferAcceptResult {
+ status: string;
+ error?: string;
+ protection_code_attempts_available?: number;
+ ext_action_uri?: string;
+ }
+
+ interface IncomingTransferRejectResult {
+ status: string;
+ error?: string;
+ }
+ }
+
+ namespace ExternalPayment {
+ interface GetInstanceIdResult {
+ status: string;
+ error?: string;
+ instance_id?: string;
+ }
+
+ interface RequestOptions {
+ pattern_id: string;
+ // instance_id: string; // the method always overwrites this value
+ to?: string;
+ amount?: number;
+ amount_due?: number;
+ message?: string;
+ [key: string]: any;
+ }
+
+ interface RequestResult {
+ status: string;
+ error?: string;
+ request_id?: string;
+ contract_amount?: number;
+ title?: string;
+ }
+
+ interface ProcessOptions {
+ request_id: string;
+ // instance_id: string; // the method always overwrites this value
+ ext_auth_success_uri: string;
+ ext_auth_fail_uri: string;
+ request_token?: boolean;
+ money_source_token?: string;
+ csc?: string;
+ }
+
+ interface ProcessResult {
+ status: string;
+ error?: string;
+ acs_uri?: string;
+ acs_params?: {
+ MD: string;
+ PaReq: string;
+ [key: string]: any
+ };
+ money_source?: {
+ type: string;
+ payment_card_type: string;
+ pan_fragment?: string;
+ money_source_token?: string;
+ };
+ next_retry?: number;
+ invoice_id?: string;
+ }
+ }
+}
+
+declare module "yandex-money-sdk" {
+ import * as http from 'http';
+
+ export interface ResponseCallback {
+ (err: any, body: TBody, response: http.IncomingMessage): any;
+ }
+
+ export interface WalletStatic {
+ new (accessToken: string): Wallet;
+ buildObtainTokenUrl(clientId: string, redirectURI: string, scope: string[]): string;
+ getAccessToken(clientId: string, code: string, redirectURI: string, clientSecret: string, callback: ResponseCallback): void;
+ revokeToken(token: string, revoke_all: any, callback: ResponseCallback): void; // revoke_all missing in documentation
+ }
+
+ export interface Wallet {
+ sendAuthenticatedRequest(params: YandexMoneySDK.Wallet.SendAuthenticatedRequestParams, callback: ResponseCallback): void;
+ accountInfo(callback: ResponseCallback): void;
+ operationHistory(options: YandexMoneySDK.Wallet.OperationHistoryOptions, callback: ResponseCallback): void;
+ operationDetails(operation_id: string, callback: ResponseCallback): void;
+ requestPayment(options: YandexMoneySDK.Wallet.RequestPaymentOptions, callback: ResponseCallback): void;
+ processPayment(options: YandexMoneySDK.Wallet.ProcessPaymentOptions, callback: ResponseCallback): void;
+ incomingTransferAccept(operation_id: string, protectionCode: string, callback: ResponseCallback): void;
+ incomingTransferReject(operation_id: string, callback: ResponseCallback): void;
+ }
+
+ export interface ExternalPaymentStatic {
+ new (instanceId: string): ExternalPayment;
+ getInstanceId(clientId: string, callback: ResponseCallback): void;
+ }
+
+ export interface ExternalPayment {
+ request(options: YandexMoneySDK.ExternalPayment.RequestOptions, callback: ResponseCallback): void;
+ process(options: YandexMoneySDK.ExternalPayment.ProcessOptions, callback: ResponseCallback): void;
+ }
+
+ export interface Config {
+ MONEY_URL: string;
+ SP_MONEY_URL: string;
+ }
+
+ export var Wallet: WalletStatic;
+ export var ExternalPayment: ExternalPaymentStatic;
+ export var Config: Config;
+}