Directions and cities
For cash directions the city becomes part of the pair and TXT code so rates do not mix across cities.
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.
top-1, top-2, top-3 and selected competitors
tags, fees, steps, rounding and preview
one file per profile
fast updates for large lists
Core idea
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.
For cash directions the city becomes part of the pair and TXT code so rates do not mix across cities.
Reserve, limits, exchanger marks, blocklists, own exchanger and zero values can be accounted for.
The system can follow a selected competitor and automatically stay above or below it.
Included
Workflow example
Rules are configured once. iEXRates then receives the market, selects the correct offer, applies protection, and publishes the final rate.
For example BTC to cash RUB, with Moscow as a required city.
Position #2, stay above a selected exchanger, or average top-10.
Filters, reserve, limits, blocklist, fee, rounding and jump protection.
A ready code like BTC-CASHRUB_MSK is written to the profile file and available to the site.
Formulas
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.
rule example
[pos:3]
+ step_to_competitor
− 0.15%Tracking and fees
For every paire 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
A paire can target not only a position, but a specific exchanger from the BestChange list.
You can keep the rate slightly above the selected competitor or safely below it.
Change limits and anti-jump rules prevent sudden moves from random offers or temporary market errors.
A rate can use +1, -1, +1%, -1%, /5, /5%, or a custom formula to include margin and costs.
Rules can account for positions, reserve, limits, exchanger marks, city, and blocklists.
Trace shows the selected offer, applied step, commission point, and why the final value reached TXT.
Analytics
The operations center shows update speed, TXT freshness, queue health, API errors, calculation history, and paire quality.
Shows update duration, successful pairs, stale directions and per-second speed.
You can inspect final rate, raw rate, position, spread between places and competitor behavior.
A problem becomes a clear card: where it failed, what happened to the key, URL, paire and TXT.
Key login, permission groups, users and audit trail help the team work safely.
Fast engine
The Go engine splits work into stages: dictionaries, paire checks, offer fetching, calculation, position guard, and file generation. This reduces latency and scales to thousands of pairs.
dictionary.sync
Currencies, cities, exchangers and marks update on the server and are read locally.
presence.scan
The system can first check which pairs actually exist to avoid unnecessary rate loading.
rates.fetch
URL/key pool, limits, retries, snapshot cache and fallback help tolerate API instability.
rates.calculate
Formulas, positions, fees, steps and limits produce one explainable final rate.
guard.apply
Target position, competitor, minimum step and allowed change are checked.
txt.generate
TXT is rebuilt only on changes, keeping publication fast.
Additional 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][bybit_usdt-btc][whitebit_usdt-btc][heleket_usdt-btc][manual_usdt-btc]direct rate, inverse 1/rate or custom fee
Useful resources
Instructions and help with setting up your product.
Under the hood
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
React/Vite SPA with i18n, TanStack Query, server-side tables, virtual lists, and live operations screens.
request cache, refresh without reloads and stable screen updates
pagination, filters and virtual lists for thousands of rows
fast builds and responsive admin interface
strict typing for forms, API contracts and UI state
Backend
NestJS 11 powers the admin API, public API, profile settings, access control, scheduler, job queue, and admin events.
unified API for profiles, directions, logs, access and sources
primary database, strict models and schema migrations
hot cache, live state, locks and fast snapshots
fast logs, update history and event analytics
Infra
iEXRates is deployed as a standalone server product: Go engine, Docker Compose, Nginx, PostgreSQL, Redis, ClickHouse, and public TXT file delivery.
worker pool, batch updates, rate limits and atomic file generation
one startup for admin, API, engine, PostgreSQL, Redis, ClickHouse and Nginx
API proxying and public TXT file serving
recommended base for server installation
Ready for an exchanger
Setup is tailored to your exchanger: profiles, API keys, mirrors, directions, formulas, position strategy, TXT files, additional sources, and update analytics.
This project connects to an active iEXExchanger license and works as an additional module for the core platform.