iEXRates — BestChange rates under control

A system that keeps exchanger rates near the target position.

iEXRates collects BestChange offers, calculates final rates by your rules, tracks competitors, publishes TXT files, and shows the operator exactly why a rate was selected.

The module is designed for exchangers that need more than pulling a BestChange rate: position control, margin, commissions, cities, exclusions, formulas, and fast updates across many directions.

Price
top-1, top-2, top-3 and selected competitors tags, fees, steps, rounding and preview one file per profile fast updates for large lists
100k+
directions can be handled through server pagination and batch updates
2 контура
BestChange and external sources separated inside one admin panel
24/7
live update state, incidents, logs and TXT freshness
iEXExchanger clients only

This project connects to an active iEXExchanger license and works as an additional module for the core platform.

Demo

Watch a short iEXRates product demo

The video shows admin workflows: profiles, directions, formulas, position control, TXT files, update analytics, and operator screens.

Open demo in Telegram
BestChange profilesformulas and feesexchanger trackingTXT publishing
Core idea

Not a rate table, but a BestChange market control center

The administrator configures a profile, directions, and rules. The system then updates dictionaries, checks available pairs, receives offers, applies formulas, protects the position, and prepares public files for the exchanger website.

Directions and cities

For cash directions the city becomes part of the pair and TXT code so rates do not mix across cities.

Offer filters

Reserve, limits, exchanger marks, blocklists, own exchanger and zero values can be accounted for.

Exchanger tracking

The system can follow a selected competitor and automatically stay above or below it.

Included

Main iEXRates capabilities

01 · Profiles

BestChange profile

A single place for language, rate type, interval, timeout, default position, own exchanger and TXT publishing settings.

Shared API URLs and mirrors with ping and priority
keys are stored in the database and managed from admin panel
each profile gets its own TXT file
02 · Directions

Pairs and bulk rules

Directions can be added one by one or in bulk, grouped, filtered, and updated by selected conditions.

direction groups are stored in the database
each tab loads its data separately
bulk actions work by server-side filters
03 · Calculation

Trace for every rate

Details show base offer, position, exchanger, formula, step, fee, limits and final value for output.

clear explanation of how a rate was produced
zero and invalid offers are excluded
history helps investigate rate changes
Formulas

Formulas as a standalone product inside the system

The formula editor shows available tags, explains every calculation step, and allows checking the result before saving. This is useful when a rate must account for several conditions at once.

Formula preview
[pos:3] + step_to_competitor - 0.15%
Position
#3
Competitor
Exchanger
Result
0.06784261

Ready strategies

Best rate, exact position, position range, average of several places, own exchanger or competitor.

Manual formula

Tags are inserted from hints and preview shows the result before applying it to a direction.

Result limits

You can limit maximum jump, minimum reserve, position and behavior when data is missing.

Fees and adjustments

+1, -1, +1%, -1%, division, formula adjustments and separate rules for external sources are supported.

Tracking and fees

A rate can follow a selected exchanger, above it or below it

For every direction you can choose a target exchanger, above or below mode, minimum step, change limit, commission, and fallback if the target competitor disappears from the list.

rule example
TargetExchanger · #3
Actionstay above by step
Fee-0.15%

Selected exchanger tracking

A direction can target not only a position, but a specific exchanger from the BestChange list.

Stay above or below

You can keep the rate slightly above the selected competitor or safely below it.

Jump protection

Change limits and anti-jump rules prevent sudden moves from random offers or temporary market errors.

Fees and adjustments

A rate can use +1, -1, +1%, -1%, /5, /5%, or a custom formula to include margin and costs.

Condition filters

Rules can account for positions, reserve, limits, exchanger marks, city, and blocklists.

Explainable calculation

Trace shows the selected offer, applied step, commission point, and why the final value reached TXT.

Workflow example

How the owner configures a direction

Rules are configured once. iEXRates then receives the market, selects the correct offer, applies protection, and publishes the final rate.

1

Select pair

For example BTC to cash RUB, with Moscow as a required city.

2

Set target

Position #2, stay above a selected exchanger, or average top-10.

3

Apply rules

Filters, reserve, limits, blocklist, fee, rounding and jump protection.

4

Publish TXT

A ready code like BTC-CASHRUB_MSK is written to the profile file and available to the site.

Fast engine

Updates run as a pipeline, not one heavy request

The Go engine splits work into stages: dictionaries, direction checks, offer fetching, calculation, position guard, and file generation. This reduces latency and scales to thousands of pairs.

dictionary.sync

Dictionaries

Currencies, cities, exchangers and marks update on the server and are read locally.

presence.scan

Direction check

The system can first check which pairs actually exist to avoid unnecessary rate loading.

rates.fetch

Offer fetching

URL/key pool, limits, retries, snapshot cache and fallback help tolerate API instability.

rates.calculate

Rate calculation

Formulas, positions, fees, steps and limits produce one explainable final rate.

guard.apply

Position guard

Target position, competitor, minimum step and allowed change are checked.

txt.generate

File generation

TXT is rebuilt only on changes, keeping publication fast.

Operations center

Logs, incidents, and analytics show the cause, not just an error

If a rate did not update, the operator sees what happened: a BestChange mirror failed, a key hit a limit, a direction became stale, TXT was delayed, or a formula produced a forbidden result.

Update speed

Shows update duration, successful pairs, stale directions and per-second speed.

History and charts

You can inspect final rate, raw rate, position, spread between places and competitor behavior.

Incidents

A problem becomes a clear card: where it failed, what happened to the key, URL, direction and TXT.

Access control

Key login, permission groups, users and audit trail help the team work safely.

Analytics

You can see what updated, what is delayed, and why a rate changed

The operations center shows update speed, TXT freshness, queue health, API errors, calculation history, and direction quality.

Updated
1166
Speed
4 961/с
Success
100%
BTC → CASHRUB_MSK
position #2 · custom step · TXT ready
Live
Final rate
4 414 387.0458
Target
Exchanger · #2
Additional sources

BestChange remains the core, but rates can be extended with external sources

Binance, Bybit, WhiteBIT, Heleket, file, and manual rates can use separate profiles, own codes, fees, TXT files, and server-side pagination.

[binance_usdt-btc]
direct rate, inverse 1/rate or custom fee
TXT ready
[bybit_usdt-btc]
direct rate, inverse 1/rate or custom fee
TXT ready
[whitebit_usdt-btc]
direct rate, inverse 1/rate or custom fee
TXT ready
[heleket_usdt-btc]
direct rate, inverse 1/rate or custom fee
TXT ready
[manual_usdt-btc]
direct rate, inverse 1/rate or custom fee
TXT ready
Under the hood

What iEXRates is built with

iEXRates is split into an admin panel, API, and a separate Go engine. The admin panel does not call BestChange directly: it works with prepared data from PostgreSQL, Redis, and logs, while server-side workers update rates.

Frontend

Operator admin panel

React/Vite SPA with i18n, TanStack Query, server-side tables, virtual lists, and live operations screens.

React + TanStack Query
request cache, refresh without reloads and stable screen updates
TanStack Table + Virtual
pagination, filters and virtual lists for thousands of rows
Tailwind CSS + Vite
fast builds and responsive admin interface
TypeScript strict
strict typing for forms, API contracts and UI state
Backend

API, workers, and queues

NestJS 11 powers the admin API, public API, profile settings, access control, scheduler, job queue, and admin events.

NestJS 11
unified API for profiles, directions, logs, access and sources
PostgreSQL + Prisma ORM
primary database, strict models and schema migrations
Redis
hot cache, live state, locks and fast snapshots
ClickHouse
fast logs, update history and event analytics
Infra

Self-hosted deployment

iEXRates is deployed as a standalone server product: Go engine, Docker Compose, Nginx, PostgreSQL, Redis, ClickHouse, and public TXT file delivery.

Go
worker pool, batch updates, rate limits and atomic file generation
Docker Compose
one startup for admin, API, engine, PostgreSQL, Redis, ClickHouse and Nginx
Nginx
API proxying and public TXT file serving
Debian 12 / Ubuntu 22.04
recommended base for server installation
Ready for an exchanger

iEXRates covers the full chain: from BestChange to a ready website rate

Setup is tailored to your exchanger: profiles, API keys, mirrors, directions, formulas, position strategy, TXT files, additional sources, and update analytics.