Ambisafe


API Endpoints

The base URL is the URL of the wallet installation.


Responses and errors

Usually an API call will return a 200 OK HTTP response:

{
    "status": "ok"
}

But if API call is unsuccessful you will get a JSON response with a list of errors:

{
    "status": "error",
    "errors": [{"hashed_password": "required"},{"__all__": "invalid_login"}]
}

The key in "errors" array contains name of the field. all key means error doesn't have certain field. List of possible values and their meanings is described at Error meanings section.


Authorization

User's password first must be hashed using Ambisafe EToken JS library:

var hashed_password = EToken.Ambisafe.deriveKey(password, EToken.Ambisafe.SHA1(password), 2000);

POST /api/login:

{
    "email": "test@test.com",
    "password": "c466d3d67153d98a220679ca31d16c219f9acb408685647c762d6ef9d965c1f7"
    "mobile_token": "coI_xMeRusw:APA91bEjTHplB_WUljzIYDLjSXPc-Zen_5v0l1xHQ75WN-vO6Ctf0Fj9FEL7hOTyljPKFi_4x3wNKo7R0MKCgf1Wf0w_pC6r1VRyWT31st_i-tZWDcNSwWxgo74rCfajsTg74v8l5PZ0"  # Not required, used to send push notifications
    "device": 1/2/3 #  DEVICE_IOS = 1  DEVICE_ANDROID = 2  DEVICE_WINDOWS = 3 # Reqiured if mobile token was sent
}

Response:

    "status": "ok"

If user enable his OTP protection for login or its needed because of some device/ip/browser canges: Response:

 "status": "ok", "data": "OTP confirmation needed"

And email woth OTP token will be sent


Signup

User's password first must be hashed and new account should be generated using Ambisafe EToken JS library:

function b64EncodeUnicode(str) {
   return btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function(match, p1) {
       return String.fromCharCode('0x' + p1);
   }));
}

var hashed_password = EToken.Ambisafe.deriveKey(password, EToken.Ambisafe.SHA1(password), 2000);
var account = EToken.Ambisafe.generateAccount('BTC', password, EToken.Ambisafe.SHA1(password));
var wallet = b64EncodeUnicode(account.getStringContainer());
var trust_raw = EToken.buildRawTransaction(etoken_contract, 'trust')(window.opts.recovery_contract_address,
      {
        gas: gas, gasPrice: gasPrice, nonce: 0
      }
    );
var approve_raw = EToken.buildRawTransaction(proxy_contract, 'approve')(window.opts.contract_address,
        '0xf000000000000000000000000000000000000000000000000000000000000000',
        {
          gas: gas, gasPrice: gasPrice, nonce: 1
        }
    );

    !!!!!!It is important to build Trust first bcs its nonce must lower then approve tx, becouse there could be situations when no approve needed!!!!

POST /api/signup:

{
    "email": "test@test.com",
    "first_name": "Test",
    "last_name": "User",
    "password": "c466d3d67153d98a220679ca31d16c219f9acb408685647c762d6ef9d965c1f7",
    "wallet": "eyJzYWx0IjoiMzU2YTE5MmI3OTEzYjA0YzU0NTc0ZDE4YzI4ZDQ2ZTYzOTU0MjhhYiIsImN1cnJlbmN5IjoiQlRDIiwicHVibGljS2V5IjoiMDNmNDlhMDdiNTkxYThkZjUzYWVmYWM2MWJiOWMxNjE5OGUzMTk1ZGQ3NTBiNzkyOWViYTU2NWJlYzdiNGMxMmRhIiwiaXYiOiI0MTFjYzg0OTk3MWI0MDIxM2RhMTM4YjAwMTZlZjMzMCIsImRhdGEiOiJiMGU1Y2EwZjY4OWYyZGU3NmYxODY1NTJiNzg4ZWU1YTcyMjMxZGUwNDI4Zjk4YTNmZmJmZWE2ZDk5YTMyYzEzYTQyZDE0NTJjNWEwNjZiM2NjNzljODUxYWVkYjY5ZWZkN2VmNDIwMDAwMmIyZTVlNjcyOTliYmU1ZTQyMGIzYWI4YTdiNjY1MWRjOTg5ODQ2MzQxMDJjYjJlMzIxZDE5In0=",
    "approve_raw": '0xf8aa808504e3b292008303d0909411dc9acbbd6eac0096ac6d08beb36121303f4c0d80b844095ea7b'
                       '30000000000000000000000003fce483a0236ba36869e4e82151006045e7d3331f000000000000000000'
                       '0000000000000000000000000000000000000000000001ba040e51255ad2076e715f5ccf86844cd816542'
                       '126b95b2f92170cca318adf8ca5ea00bab0a4742750f4f6271d94be0cba23a37ee04968a718422b4f21d06cb2bfd9e',
    "trust_raw": '0xf889808504e3b292008303d090943fce483a0236ba36869e4e82151006045e7d333180a44637d827000000000000000'
                     '00000000000462a425aa5c86830cc6bd02d81675b0f736f801ca01c4e4edad7e88d6a12ddbf12b470ef56a1980a385534'
                     'be6aafaad062e8a9b0c6a01a01c004f23f358d386569a820a1d3c6fc5eee2908d5365edd4db556df9a51a7'
}

Confirm email

Server sends email with next link example: ###cryptocarbon://login?action=verifyEmail&email={{ email }}&token={{ token }}###

POST /api/email/verify:

{
    "email": "test@test.com",
    "token": "dbc2a2c9-5c31-4a7c-bfe5-97f4515d35db"
}

Check email existance

GET /api/email/existence/{email}/ response:

{
    "status": "ok",
    "existance": "True/False",
}

Getting encrypted container

GET /api/account/container response:

{
    "public_key": "032af8969d20bcda259f20cb2ead949ebb4e07daebd16ef13e2ac23ef3fc12cbe3",
    "data": "4f9eb6bd875e69d1409403ad22fedacd9a618187eace546c1bab233a92c09499b1a99043617773d0730a71066816d7ae",
    "salt": "40bd001563085fc35165329ea1ff5c5ecbdbbeef",
    "iv": "efd5d8f44f13acb87b4e82664bf555a1"
}

Set reactivation raws

POST /api/account/activate/raws/:

{
    "approve_raw": '0xf8aa808504e3b292008303d0909411dc9acbbd6eac0096ac6d08beb36121303f4c0d80b844095ea7b'
                       '30000000000000000000000003fce483a0236ba36869e4e82151006045e7d3331f000000000000000000'
                       '0000000000000000000000000000000000000000000001ba040e51255ad2076e715f5ccf86844cd816542'
                       '126b95b2f92170cca318adf8ca5ea00bab0a4742750f4f6271d94be0cba23a37ee04968a718422b4f21d06cb2bfd9e',
    "trust_raw": '0xf889808504e3b292008303d090943fce483a0236ba36869e4e82151006045e7d333180a44637d827000000000000000'
                     '00000000000462a425aa5c86830cc6bd02d81675b0f736f801ca01c4e4edad7e88d6a12ddbf12b470ef56a1980a385534'
                     'be6aafaad062e8a9b0c6a01a01c004f23f358d386569a820a1d3c6fc5eee2908d5365edd4db556df9a51a7'
}

Success response:

{
    "status": "ok",
}

Getting account info

GET /api/account response:

{
    "email": "test@test.com",
    "phone": "+17777777123",
    "first_name": "Darth",
    "last_name": "Vader",
    "state": "Tattoine",
    "country": "GB",
    "login_otp_enabled": "True"/"False",
    "transaction_maximum_amount": "100.000",
    "netki_nick_name": dart.ambisafe.co # or False if no Netki name,
    "activation": 0/1/2/3,
    "reactivation_needed": true/false
}

ACTIVATION STATUSES CODES: STATUS_NOT_ACTIVATED = 0 STATUS_IN_PROCESS = 1 STATUS_DONE = 2 STATUS_FAILED = 3 You need to show some message and block send transaction ability in case activation != 2;


Getting countries list

GET /api/countries response:

{
    {"countries": 
        {
        "BD": "Bangladesh", 
        "BE": "Belgium", 
        "BF": "Burkina Faso", 
        "BG": "Bulgaria" 
        ...
        }

Set account first_name/ last_name

POST /api/account/name POST data:

{
    "first_name": "Darth"
    "last_name": "Vader"
}
Error response:

```json
{
    "status": "error",
    "errors": {errors}
}

Success response:

{
    "status": "ok"
}

Set account profile

POST /api/account/profile Get country code from countries endpoint POST data:

{
    "country": "UA"  
    "state": "Kiev"
}
Success response:

```json
{
    "status": "error",
    "errors": {errors}
}

Error response:

{
    "status": "ok"
}

Change password

POST /api/account/password POST data:

{
    "old_password": "c466d3d67153d98a220679ca31d16c219f9acb408685647c762d6ef9d965c1f7",  
    "password": "5555d3d67153d98a123456ca31d16c219f9acb408685647c762d6ef9d965cc56",
    "wallet": "eyJzYWx0IjoiMzU2YTE5MmI3OTEzYjA0YzU0NTc0ZDE4YzI4ZDQ2ZTYzOTU0MjhhYiIsImN1cnJlbmN5IjoiQlRDIiwicHVibGljS2V5IjoiMDNmNDlhMDdiNTkxYThkZjUzYWVmYWM2MWJiOWMxNjE5OGUzMTk1ZGQ3NTBiNzkyOWViYTU2NWJlYzdiNGMxMmRhIiwiaXYiOiI0MTFjYzg0OTk3MWI0MDIxM2RhMTM4YjAwMTZlZjMzMCIsImRhdGEiOiJiMGU1Y2EwZjY4OWYyZGU3NmYxODY1NTJiNzg4ZWU1YTcyMjMxZGUwNDI4Zjk4YTNmZmJmZWE2ZDk5YTMyYzEzYTQyZDE0NTJjNWEwNjZiM2NjNzljODUxYWVkYjY5ZWZkN2VmNDIwMDAwMmIyZTVlNjcyOTliYmU1ZTQyMGIzYWI4YTdiNjY1MWRjOTg5ODQ2MzQxMDJjYjJlMzIxZDE5In0="
}

To generate new container use:

account = new EToken.Ambisafe.Account(window.opts.container, oldPassword);
account.setNewPassword(password);
data: {
    password: EToken.Ambisafe.deriveKey(password, EToken.Ambisafe.SHA1(password), 2000),
    wallet: b64EncodeUnicode(account.getStringContainer()),
    old_password: EToken.Ambisafe.deriveKey(oldPassword, EToken.Ambisafe.SHA1(oldPassword), 2000),
}

Success response:

{
    "status": "error",
    "errors": {errors}
}

Error response:

{
    "status": "ok"
}

Request email with wallet backup

POST /api/account/wallet/backup/ Empty data response:

{
    "status": "ok",
}

Getting account balance

GET /api/account/balance response:

{
    "balance": 1.3567,
}

Getting account address

GET /api/account/address response:

{
    "address": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003",
}

Getting account activation status

GET /api/account/activation/status/ response:

{
    "isTrusted": "True/False",
    "feeIsAllowed": "True/False"
}

Getting qr code of address

GET /api/qr/{address}/ response:

HTTP Response with content_type="image/png"


Getting account transactions list

GET /api/transactions response:

{
    "type": 0/1, # 0 = INCOMING; 1 = OUTGOING
    "detail": 0/1/2, #0='Simple tx' 1='Exchange tx' 2='POS/POT transaction'
    "status": 1/2/3, # 1='pending', 2='confirmed', 3='failed'
    "currency_code": "AMB",
    "sender_address": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003",
    "recipient_address": "0xcdf5fb30e3f53acf756987a7a246d2aec943c773",
    "amount": 123000000, # Amount returned in contract view, and must be devided by 10**base_unit
    "timestamp": 12345678,
    "transaction_hash": "0x06d8b67d1c631226f346ed6853212953cc275608ee23c5e8b35f138788d3d231",
    "text_status": "Received/Sent/In process",
    "user_amount": "123,000000", #User like amount
    "user_date": "%Y-%m-%d %H:%M:%S",
    "paid_fee": 3000000,
    "transaction_reference": "Hello World"
}

Submititng transaction to server

POST /api/transaction/submit POST data:

{
    "destination": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003"
    "hash": "0x06d8b67d1c631226f346ed6853212953cc275608ee23c5e8b35f138788d3d231"
    "amount": 31.3245,
    "asset": "AMB",
    "fee": 0,
    "reference": 'Hello World'  # Transaction comment, could be empty
}

response:

{
    "status": "ok", "tx": "{ tx.pk }"
}

Getting contract variables

GET /api/contracts response:

{
    "contract_address": "0x9cbfcb30e3f53acf708907a7a246d2aec943c003",
    "contract_currency": "AMB",
    "icap_currency_symbol": "AMB",
    "etoken_contract": "0xcdf5fb30e3f53acf756987a7a246d2aec943c773",
    "recovery_contract_address": "0x7e7348ba686953f05995326bf50c9d29290bdacb",
    "base_unit": 6,
    "use_fee": True/False  # Tells does wallet uses fee for transactions,
    "topup_amount": 8000000000000000 # Tells wich ethers amount (in wei) must be on users addres after topup
}

Request 2fa token

POST /api/register/request_2fa_token POST data:

{
    "phone_number": "+177757473"
    "call": "True/False"  #If True user will receive phone call, if False will receive SMS
}

Success response:

{
    "data": "Sms was sent to your number"
}

Error responseresponse:

{
    "data": "{error}"
}

Confirming 2fa token

POST /api/register/validate_2fa_token POST data:

{
    "auth_token": "1235"
}

Success response:

{
    "data": "Token ok"
}

Error response:

{
    "data": "Security token is wrong"
}

Account recovery Request

Please notice that account must be trusted to recovery contract to have ability to make recovery request.

POST /api/account/recovery/request/

POST data:

{
    "email": "darth_vader@empire.com"
}

Success response:

{
    "status": "ok"
}

Error response:

{
    "status": "error",
    "errors": {errors}
}

Get exchangeable currencies

GET /api/exchange/currencies/

Success response: Returns list of currencies that can be exchanged

{
    "status": "ok", 
    "data": "{['AMB', 'BTC', 'EXP']}" 
}

Error response:

{
    "status": "error",
    "errors": {errors}
}

Create exchange order

POST /api/exchange/create/ List of exchangeable could be taken from currencies endpoint POST data:

{
    "amount": "123"
    "source_currency": "HAU",
    "target_currency": "BTC",
    "target_address"="1HfKonf6kNMQwoSKcqxk2uMiHYTvk19WJg" #Required when 'target_currency' == 'BTC'
}

Success response: Returns created order primary key

{
    "status": "ok", "data": "1" 
}

Error response:

{
    "status": "error",
    "errors": {errors}
}

Possible errors: "all":"exchange_is_not_active", "amount":"invalid", "all":"minimal_exchange_amount", "all":"exchange_wallet_empty", "target_address":"invalid"


Get exchange order

GET /api/exchange/order/{pk}/

Success response: Returns created order primary key

{
    "status": "ok", "order": "
    {
            "pk": 1,
            "created_at": "1469806001",
            "status": "CREATED",
            "target_currency": "BTC",
            "exchanged_amount": 1.000,
            "amount_to_exchange": 0.002,
            "exchange_rate": 0.00152627,
            "source_account_id": 2,
            "target_account_id": 2,
            "updated_at": "1469806001",
            "exchange_transaction_id": "59dd49d58394bc037d6b0bea36ca93961b09d94b3a264f254a18e1c3cc12f2b2",
            "withdrawal_transaction_id": "0xdeb7b1b25a056550af066d18ab5c80c67968ef1b7391ed876979d6ee53353eac",
            "source_currency": "AMB",
            "exchange_btc_address": "1DWewC8uxcPwsYSWpPNneDtJJjcjGgT3w2",
            "left_to_pay": 0.002,
            "invoice_time_left": 356
    }" 
}

Error response:

{
    "status": "error",
    "errors": {errors}
}

Get exchange orders list

GET /api/exchange/order/list/

Success response: Returns created order primary key

{
    "status": "ok", 
    "order": "
    [{
            "pk": 1,
            "created_at": "1469806001",
            "status": "CREATED",
            "target_currency": "BTC",
            "exchanged_amount": 1.000,
            "amount_to_exchange": 0.002,
            "exchange_rate": 0.00152627,
            "source_account_id": 2,
            "target_account_id": 2,
            "updated_at": "1469806001",
            "exchange_transaction_id": "59dd49d58394bc037d6b0bea36ca93961b09d94b3a264f254a18e1c3cc12f2b2",
            "withdrawal_transaction_id": "0xdeb7b1b25a056550af066d18ab5c80c67968ef1b7391ed876979d6ee53353eac",
            "source_currency": "AMB",
            "exchange_btc_address": "1DWewC8uxcPwsYSWpPNneDtJJjcjGgT3w2",
            "left_to_pay": 0.002,
            "invoice_time_left": 356
    },
    {
            "pk": 2,
            "created_at": "146980609",
            "status": "CREATED",
            "target_currency": "BTC",
            "exchanged_amount": 1.000,
            "amount_to_exchange": 0.002,
            "exchange_rate": 0.00152627,
            "source_account_id": 2,
            "target_account_id": 2,
            "updated_at": "1469806009",
            "exchange_transaction_id": "59dd49d58394bc037d6b0bea36ca93adadadb3a264f254a18e1c3cc12f2b2",
            "withdrawal_transaction_id": "0xdeb7b1b25a056550af066d18abweqwe7968ef1b7391ed876979d6ee53353eac",
            "source_currency": "AMB",
            "exchange_btc_address": "1DWewC8uxcPwsYSWpPNneDtJJjcjGcT3G3",
            "left_to_pay": 0.002,
            "invoice_time_left": 356
    }]" 
}

Error response:

{
    "status": "error",
    "errors": {errors}
}

Get exchange rates

GET /api/exchange/rates/

Success response: List of rates

{
    "exchange_rates" :
        [{
            "exchange_rate": "576.46000000",
            "source_currency": "BTC",
            "target_currency": "USD",
            "created_at": "1469806009",
            "updated_at": "1469806009"
        },{
            "exchange_rate": "0.00001735",
            "source_currency": "AMB",
            "target_currency": "BTC",
            "created_at": "1469806009",
            "updated_at": "1469806009"
        }]
}

Request OTP token message

GET /api/account/otp/protection

Success response: List of rates

{
    "status": "ok"
}

Validate OTP token message

POST /api/account/otp/protection POST data:

{
    "otp_token": "12345"
}

Success response:

{
    "status": "ok"
}

Wrong token response:

{
    "status": "error",
    "errors": [{"__all__": "wrong_otp"}]
}

Edit Security settings

POST /api/account/set/security POST data:

{
    "transaction_maximum_amount": "1.00",
    "advanced_security_mode": "True/False"
}

Success response:

{
    "status": "ok"
}

Wrong token response:

{
    "status": "error",
    "errors": "{errors}"
}

Get sessions

GET /api/account/sessions/

Success response: List of sessions

{
    "sessions" :
        [{
            "os": "Ubuntu",
            "browser_family": "Chrome",
            "device": "Desktop",
            "ip_address": "10.0.0.0",
            "time": "1469806009"
        },{
            "os": "Windows",
            "browser_family": "Firefox",
            "device": "Desktop",
            "ip_address": "10.0.0.1",
            "time": "1469806009"
        }]
}

Address Book

GET/POST/DELETE /address_book/api/

GET returns all users address book notes:

{   "status": "ok",
    "sessions" :
        [{
            "pk": "1",
            "address_nickname": "Darth Vader",
            "description": "Lord",
            "recipient_address": "0x7e7348ba686953f05995326bf50c9d29290bdacb",
        },{
            "pk": "2",
            "address_nickname": "Palpatin",
            "description": "Emperor",
            "recipient_address": "0x7e7348ba686953f05995326bf50c9d29290bdacc",
        }]
}

POST to create new note:

{
    "address_nickname": "Darth Vader", # Must be unique per user
    "description": "Lord", # Not required
    "recipient_address": "0x7e7348ba686953f05995326bf50c9d29290bdacb", # Must be unique per user
}
response:
```json
{   
    "status": "ok"
}

status_code = 201

Posible errors: 'nickname_duplication', 'duplicate_address', 'invalid_address', 'wrong_nickname', 'wrong_description'

DELETE to remove note: Send list of notes pk's will remove them.

{   
    "idtodelete": "[1,2,3]"
}

response:

{   
    "status": "ok"
}

Netki setup/update

POST /api/netki/setup/

POST to create or updated if instance already exists (updates only name):

{
    "netki_name": "Darth Vader",
}
response:
```json
{   
    "status": "ok"
}

status_code = 201


Netki domain name lookup

GET /api/netki/get/address/{{name}}/

response:

{   
    "status": "ok",
    "address": "0xf313590f37bf6c09f65f9014cfca8bafb39aa1ca"
}

status_code = 200


Error meanings

"required": "Заполните это поле"   "Please fill out this field"
 "invalid_login": "Пожалуйста, укажите действительные имя пользователя и пароль. Учтите, что оба поля чувствительны к регистру", "Please enter valid username and password. Pay attention that both fields are case sensitive",
"inactive": "Этот аккаунт неактивен, свяжитесь с администрацией" "This account is inactive, please contact support",
"email_not_confirmed": "Электронный адрес не подтвержден" "This email is not confirmed",
"phone_not_confirmed": "Номер телефона не подтвержден" "This phone number is not confirmed",
"keyserver_error": "Can"t connect to KeyServer, try again later or contact support",
"invalid_login_code": "Вы ввели неверный код аутентификации. Вы сможете повторно залогиниться не ранее, чем через 2 минуты" "You have entered wrong authentication code. You can try to re-login in 2 minutes ",  
"password_mismatch": "Пароли не совпадают" "Passwords do not match",
"phone_number_exists": "Этот номер телефона уже существует в базе" "This phone number already exists in a database",
"phone_number_wrong_characters": "Только цифры, +, -, () допустимы в телефонном номере" "Phone number can contain only digits and +,-,() symbols ",
"email_exists": "Пользователь с такой электронной почтой уже зарегистрирован" "User with this email already exists",
"email_empty": "Введите адрес электронной почты" "Email can"t be blank",
"accept_agreements": "Пожалуйста, примите уловия предоставления сервиса" "Please accept Terms Of Service",
"first_name_contains_numbers": "Имя не должно содержать цифр" "First name shouldn't contain digits",
"last_name_contains_numbers": "Фамилия не должна содержать цифр" "Last name shouldn't contain digits",
"required": "Заполните это поле" "Please fill out this field",
"state_contains_numbers": "Область не должна содержать цифр" "State shouldn"t contain digits",
"city_contains_numbers": "Город не должен содержать цифр"  "City shouldn"t contain digits",
"pin_code_invalid": "Пин Код должен содержать 4 цифры" "Choose 4 digits for you PIN",
 "pin_code_empty" :  "Введите PIN код" "Please enter PIN code",  
"insufficient_funds": "Недостаточно средств" "Insufficient funds",
"user_address_not_exists": "Такой email не зарегистрирован." "User with this email address does not exists"
"transactions_frozen": "Возможность отправлять транзакции отключена" "Your permission to send transactions is frozen, please contact support",
"invalid_address": "Неверный адрес" "Invalid address",
"user_address": "Нельзя отправлять транзакции на свой адрес" "You can't make sendings to your own address",
 "max_length": "Адрес должен состоять не более чем из 26 символов" "Max length of valid address is 26 symbols",
"min_length": "Адрес должен состоять не менее чем из 26 символов" "Min length of valid address is 26 symbols",
"max_decimal_places": "Убедитесь что вы ввели не более 3х цифр после запятой" "Please make sure that you have entered not more than 3 decimal digits",
 "invalid": "Введите число" "Please enter a number",
"wrong_password": "Введите пароль от входа в кошелек для подтверждения транзакции" "Please enter your password to confirm transaction",
"duplicate_address": "Адрес уже записан в вашу книгу" "This address is already added to your address book",
"invalid_address": "Неверный адрес" "Invalid address",
"wrong_nickname": "Имя не должно содержать специальных символов" "Name shouldn't contain special characters",  
"wrong_description": "Описание не должно содержать специальных символов" "Description shouldn't contain special characters"
"same_email": "Новый адрес повторяет старый" "New email duplicates the old one",
"enter_code_from_sms": "Введите код потверждения из СМС, которое было отправленно по вашему номеру" "Please enter the confirmation code from SMS you"ve received",
"number_confirmed": "Номер успешно подтвержден" "Phone number is confirmed successfully",
"wrong_code":  "Неверный код потдверждения" "Incorrect confirmation code"
"2fa_disabled": "Аутентификация успешно отключена" "2fa is disabled successfully"
 "email_not_exists": "Пользователь с введенным электронным адресом не существует" "User with such email address isn’t registered yet",
"double_request": "У Вас уже есть, необработаный запрос на восстановление аккаунта" "You have one pending account recovery request already",
"service_unavailable": "Извините, в данный момент этот сервис недоступен для аккаунтов с НЕНУЛЕВЫМ балансом!" "We are sorry, but service is unavailable for users with NON-ZERO balances for this moment",
"wait_until": Пожалуйста подождите 5 минут перед тем как запросить новое сообщение" "Please wait for 5 minutes before requesting another message"
"token_confirmed": "Токен подтвержден" "Token is confirmed"
"message_repeated": "Вам было выслано повторное сообщение" "Message has been re-sent"
"wrong_old_password" : "Старый пароль неверный!" "Old password is incorrect"
"minimal_exchange_amount": "Минимальная сумма для покупки 1 coin." "Minimal exchange amount should be equal 1 coin"
"exchange_wallet_empty": Недостаточно денег на резервном счету. Свяжитесь пожалуйста с администрацией" "There is not enough money in the pool. Please contact support"
"exchange_is_not_active": "Exchange is not setup yet"