<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: XEROF</title>
    <description>The latest articles on DEV Community by XEROF (@xerof).</description>
    <link>https://dev.to/xerof</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4237652%2F9bd88cff-be3e-468b-9d3f-70ef4e2e0fb2.png</url>
      <title>DEV Community: XEROF</title>
      <link>https://dev.to/xerof</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xerof"/>
    <language>en</language>
    <item>
      <title>Paying suppliers in 59 countries from a USDT or USDC balance: how the XEROF API flow works</title>
      <dc:creator>XEROF</dc:creator>
      <pubDate>Tue, 10 Nov 2026 18:10:05 +0000</pubDate>
      <link>https://dev.to/xerof/paying-suppliers-in-59-countries-from-a-usdt-or-usdc-balance-how-the-xerof-api-flow-works-i77</link>
      <guid>https://dev.to/xerof/paying-suppliers-in-59-countries-from-a-usdt-or-usdc-balance-how-the-xerof-api-flow-works-i77</guid>
      <description>&lt;p&gt;Many companies now hold part of their treasury in USDT or USDC, while their suppliers still want local currency in a bank account. This post walks through how that payment looks when you automate it with the XEROF REST API: what happens in which order, what your system has to store, and where integrations usually go wrong.&lt;/p&gt;

&lt;p&gt;XEROF is a Swiss regulated crypto brokerage in Zug (FE Swiss Financial AG, VQF member No. 100954). It is a brokerage and settlement counterparty, not an exchange: there is no order book, and every conversion is priced for the full amount.&lt;/p&gt;

&lt;h2&gt;
  
  
  The basics
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base URL&lt;/td&gt;
&lt;td&gt;&lt;code&gt;https://online.xerof.ch/gateway/api/v1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Version&lt;/td&gt;
&lt;td&gt;v1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Spec&lt;/td&gt;
&lt;td&gt;OpenAPI 3.0.0&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;JWT bearer token in the &lt;code&gt;Authorization&lt;/code&gt; header&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Format&lt;/td&gt;
&lt;td&gt;JSON over HTTPS&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Credentials are issued to onboarded clients on request. Sandbox credentials are available, so you can test the whole flow before production. Rate limits and IP allowlisting are set per client when the credentials are issued.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authentication
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Authenticate with your credentials and receive a signed JWT.&lt;/li&gt;
&lt;li&gt;Send it on every request as &lt;code&gt;Authorization: Bearer &amp;lt;token&amp;gt;&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tokens are short lived. Refresh them; do not cache one indefinitely.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The resource groups
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Balances:&lt;/strong&gt; the balance of every asset on your account, per currency and per wallet.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wallets:&lt;/strong&gt; your wallets and their deposit addresses, per asset and network. Each client has its own wallet, never pooled with other clients.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Orders:&lt;/strong&gt; create and track conversions. Each order returns the executed rate and the XEROF fee as separate lines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deposits:&lt;/strong&gt; incoming on-chain and bank deposits with status, confirmations and references.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Transfers:&lt;/strong&gt; move assets on chain from your wallet to your own whitelisted address.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fiat withdrawals:&lt;/strong&gt; instruct payments in USD, EUR, CHF or GBP to your own or a third-party bank account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Webhooks:&lt;/strong&gt; be notified when a deposit lands, an order fills or a payout settles.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A supplier payment, step by step
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Fund.&lt;/strong&gt; Read your deposit address from Wallets and send USDT or USDC on Ethereum (ERC-20). This matters: a payment to a third party can only be funded with USDT or USDC on Ethereum. Other assets and other networks can be converted, but the money then goes to a bank account in your own name.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Wait for the deposit.&lt;/strong&gt; Subscribe to the deposit webhook instead of polling. Act only when the deposit is confirmed and credited.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Convert.&lt;/strong&gt; Create an order from the stablecoin to the payout currency. Store the executed rate and the fee from the response as two separate values. Your accountant will ask for both.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Pay.&lt;/strong&gt; Create the fiat withdrawal to the supplier's bank account with your invoice reference. The supplier is checked as a beneficiary before the first payment, so add new suppliers ahead of the due date, not on it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Reconcile.&lt;/strong&gt; The payout webhook tells you when the payment has settled. Match it to your invoice by your own reference.&lt;/p&gt;

&lt;p&gt;The supplier never touches crypto. It receives an ordinary bank transfer from a Swiss regulated counterparty.&lt;/p&gt;

&lt;h2&gt;
  
  
  Four things that save you a bad day
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Send an idempotency reference on every write.&lt;/strong&gt; If a request times out and you retry, the reference stops a second order or a second payout from being created.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Treat amounts as strings.&lt;/strong&gt; Amounts come back as decimal strings. Parse them into a decimal type, never a float.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use webhooks, then verify.&lt;/strong&gt; Let the webhook trigger the next step, then read the resource once to confirm its state before you act on it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keep rate and fee apart in your ledger.&lt;/strong&gt; They arrive as separate lines for a reason: one is the market, the other is the cost of the service.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What it costs
&lt;/h2&gt;

&lt;p&gt;The brokerage fee follows monthly volume: 1.00% up to USD 250,000, 0.85% up to 1,000,000, 0.65% up to 2,000,000. A payment to a third party adds 0.25%. There is no minimum ticket.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;API reference: &lt;a href="https://xerof.com/api" rel="noopener noreferrer"&gt;https://xerof.com/api&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Countries, currencies and limits per market: &lt;a href="https://xerof.com/payouts" rel="noopener noreferrer"&gt;https://xerof.com/payouts&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;The same flow without code: &lt;a href="https://xerof.com/pay-overseas-suppliers-with-stablecoins" rel="noopener noreferrer"&gt;https://xerof.com/pay-overseas-suppliers-with-stablecoins&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Fees: &lt;a href="https://xerof.com/pricing" rel="noopener noreferrer"&gt;https://xerof.com/pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>fintech</category>
      <category>stablecoin</category>
    </item>
  </channel>
</rss>
