For exchangers

Rates file: format and rules

Changerella reads your rates from one XML file at a public URL. Below is everything it should contain, how we read and check it, and the exact codes every currency must have.

XMLUTF-8, BestChange structure
179currency codes
70 / 109crypto / fiat
~1 minfrom your file to the site

A minimal valid file

One <item> per exchange direction, all of them directly inside a single root element. The root can be named anything; <rates> is customary.

rates.xml
<?xml version="1.0" encoding="UTF-8"?>
<rates>
  <item>
    <from>BTC</from>
    <to>USDTTRC20</to>
    <in>1</in>
    <out>63250.40</out>
    <amount>185000</amount>
    <minamount>0.005 BTC</minamount>
    <maxamount>2.5 BTC</maxamount>
  </item>
  <item>
    <from>USDTTRC20</from>
    <to>XMR</to>
    <in>164.20</in>
    <out>1</out>
    <amount>412.7</amount>
    <minamount>50 USDT</minamount>
    <maxamount>25000 USDT</maxamount>
  </item>
  <item>
    <from>SBERRUB</from>
    <to>BTC</to>
    <in>6120000</in>
    <out>1</out>
    <amount>3.4</amount>
    <minamount>5000 RUB</minamount>
    <maxamount>1500000 RUB</maxamount>
  </item>
</rates>

What goes inside <item>

Every direction is described by the same set of tags. Their order does not matter.

TagTypeMeaningExample
<from>requiredcodeWhat the client gives. A code from the directory below.BTC
<to>requiredcodeWhat the client receives. A code from the directory below.USDTTRC20
<in>requirednumberHow much of “from” the client gives…1
<out>requirednumber…to receive this much of “to”. The rate is out ÷ in.63250.40
<amount>requirednumberReserve: how much of “to” you can pay out right now.185000
<minamount>optionalnumber + unitMinimum order, in “from”. A unit after a space is allowed.0.005 BTC
<maxamount>optionalnumber + unitMaximum order, in “from”. Same format as minamount.2.5 BTC
<param>optionaltextFlags in the BestChange style (manual, verifying…). Accepted; not shown yet.manual
<tofee>optionaltextExtra payout fee. Accepted; not shown yet.1 USDT
One bad number breaks the whole file. in, out and amount must be plain numbers with a dot: 1500, 0.00042, 1e-5. A comma, a space, a currency sign or text in any of them makes the file unreadable, and all your directions disappear at once. min/max amounts are softer: we take the first number and ignore the rest.

How in and out make a rate

in and out are two sides of one deal: “give in of from — get out of to”. We divide out by in and get how much “to” one unit of “from” buys. Put 1 on the side of the more expensive currency and the price on the other: such a rate is easier to read and to check.

BTC → USDTTRC20
<in>1</in><out>63250.40</out>
The client gives 1 BTC and receives 63,250.40 USDT.
USDTTRC20 → BTC
<in>64110</in><out>1</out>
The client gives 64,110 USDT for 1 BTC. Same as in=1, out=0.0000156 — but readable.
amount

The reserve is always in the “to” currency — what you can pay out. 185000 next to BTC→USDT means 185,000 USDT, not BTC.

minamount / maxamount

Limits are in the “from” currency — what the client sends. “0.005 BTC” and “0.005” are read the same way.

Zero = no direction

in or out equal to 0 removes the direction from the table. To pause a direction, simply drop its <item>.

Delivery requirements

We fetch the file ourselves, around the clock. These six conditions decide whether we can.

01

UTF-8 only

The declaration must say UTF-8 or nothing. A file in windows-1251 is rejected whole, not partly.

02

HTTP 200 at a stable URL

Plain GET, no cookies, login or redirects to an HTML page. HTTPS is welcome.

03

Answer within 25 seconds

Headers within 15 s, the whole body within 25 s. A slow file is treated as an outage.

04

Up to 64 MB

The largest file we read today is about 3 MB — there is plenty of room.

05

Updated, not frozen

If Last-Modified is older than 24 hours, the file counts as dead even with a 200 response.

06

Let our robot in

We request with the User-Agent “Changerella-Monitoring/1.0”. Do not block it and do not put the file behind a JS challenge.

If the file goes silent. Your rates stay on the site for up to 30 minutes after the last successful read, then disappear until the file answers again. Nothing needs to be re-submitted — they return by themselves.

How we check rates

A visitor trusts the first line of the table, so every rate passes three filters before it gets there.

1

Median of the pair

When a pair has at least 3 offers, a rate more than 5% away from their median (10% if fiat is involved) goes to the “suspicious” list instead of the main table.

2

Market reference

Crypto rates are compared with the exchange market price. An offer more than 5% better than the market is almost always a typo, and is hidden the same way.

3

Plausible reserve

A reserve over 10 medians of the pair, or a round number worth a million dollars and more (like 1000000), is marked as doubtful. Publish the reserve you actually have.

Common mistakes

All of these come from real files we read today. Each one costs the exchanger a direction — or the whole file.

USDT→USDTTRC20

A bare ticker is not enough for a token: name the network.

USDT TRC20→USDTTRC20

No spaces, dashes or underscores inside a code.

USDTSOLANA→USDTSOL

Network suffixes are fixed: SOL, TRC20, ERC20, BEP20, POLYGON.

TON→GRAM

Toncoin is listed under the code GRAM.

BNB→BNBBEP20

BNB is listed on BNB Smart Chain only.

JUSANKZT→JSNBKZT

Bank codes are taken from the directory, not made up.

<in>1,5</in>→<in>1.5</in>

The decimal separator is a dot. A comma breaks the whole file.

<in>1 000</in>→<in>1000</in>

No thousand separators in in, out and amount.

Currency codes

Use these codes in <from> and <to> exactly as written. The list is built from the live directory of the site: 179 currencies right now.

Coins

A coin with its own blockchain is written by its ticker: BTC, ETH, XMR, LTC, TRX.

Tokens

Ticker + network, no separator: USDTTRC20, USDCERC20, SHIBBEP20. One token on five networks is five different codes.

Fiat

Method + ISO currency code: SBERRUB, CARDUSD, CASHEUR, WIREGBP. The same bank in another currency is another code.

Network suffixes

TRC20TRONTRC-20
ERC20EthereumERC-20
BEP20BNB Smart ChainBEP-20
POLYGONPolygon PoSERC-20 (Polygon)
SOLSolanaSPL
OMNIOmni LayerOmni
LNLightning NetworkLightning

One ticker — several codes

BTC
ETH
SHIB
TUSD
USDC
USDT

Cryptocurrencies

Coins and tokens. A token on a specific network carries the network in its code.

Bank cards

Card payouts and top-ups, by currency.

Banks

A specific bank’s transfer, by currency.

Payment systems

E-wallets and money transfer services.

Bank transfer

Transfer to a bank account (any bank) in the given currency.

Cash

Cash in an office or by courier.

Click a code to copy it.

Questions

What happens to a code that is not in the directory?

The direction is skipped silently: the rest of the file still works, but that line never reaches the site. If you need a currency we do not have, write to us — we will add a code.

Are codes case-sensitive?

No: usdttrc20 and USDTTRC20 are the same thing. We recommend upper case — that is how the directory is written.

How often is the file read?

Continuously: a full pass over all exchangers takes seconds, so a rate change reaches the site within about a minute. If the file does not respond for 30 minutes, your rates are hidden until it comes back — we would rather show nothing than a stale rate.

Why is my rate not shown although it is in the file?

Most often: the code is not in the directory, in or out is zero, or the rate deviates too far from the median of other exchangers or from the market and was moved to the “suspicious” list. The checks are described above.

Is the BestChange format accepted as is?

Yes, the structure is the same. Check the currency codes against our directory: some of them differ (for example, Toncoin is GRAM).

Your file is ready?
Send us its URL — we will check it and connect your exchanger to the monitoring.
Add an exchanger