List spot arbitrage opportunities ordered by net spread
curl --request GET \
--url http://sandbox.mintlify.com/v1/arbitrage \
--header 'Authorization: Bearer <token>'import requests
url = "http://sandbox.mintlify.com/v1/arbitrage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://sandbox.mintlify.com/v1/arbitrage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "http://sandbox.mintlify.com/v1/arbitrage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://sandbox.mintlify.com/v1/arbitrage"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://sandbox.mintlify.com/v1/arbitrage")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://sandbox.mintlify.com/v1/arbitrage")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"spread": 123,
"netSpread": 123,
"referenceNotional": 1000,
"executable": true,
"costModelVersion": 1,
"fees": {
"takerBuy": {
"rate": 123,
"amountUsd": 123,
"estimated": true
},
"takerSell": {
"rate": 123,
"amountUsd": 123,
"estimated": true
},
"withdrawal": {
"amountAsset": 123,
"amountUsd": 123,
"estimated": true
},
"network": {
"name": "<string>",
"confirmations": 123,
"withdrawalEnabled": true,
"depositEnabled": true
}
},
"infeasibleReason": "no_common_network"
}
]Endpoint Examples
Get Arbitrages
GET
/
v1
/
arbitrage
List spot arbitrage opportunities ordered by net spread
curl --request GET \
--url http://sandbox.mintlify.com/v1/arbitrage \
--header 'Authorization: Bearer <token>'import requests
url = "http://sandbox.mintlify.com/v1/arbitrage"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('http://sandbox.mintlify.com/v1/arbitrage', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "http://sandbox.mintlify.com/v1/arbitrage",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "http://sandbox.mintlify.com/v1/arbitrage"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("http://sandbox.mintlify.com/v1/arbitrage")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("http://sandbox.mintlify.com/v1/arbitrage")
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body[
{
"spread": 123,
"netSpread": 123,
"referenceNotional": 1000,
"executable": true,
"costModelVersion": 1,
"fees": {
"takerBuy": {
"rate": 123,
"amountUsd": 123,
"estimated": true
},
"takerSell": {
"rate": 123,
"amountUsd": 123,
"estimated": true
},
"withdrawal": {
"amountAsset": 123,
"amountUsd": 123,
"estimated": true
},
"network": {
"name": "<string>",
"confirmations": 123,
"withdrawalEnabled": true,
"depositEnabled": true
}
},
"infeasibleReason": "no_common_network"
}
]📖 Descrição
Este endpoint retorna as oportunidades de arbitragem entre as exchanges especificadas, com opção de incluir as cotações de preços e filtros avançados para refinar as buscas.🛠️ Requisição
Método
GET
URL
/v1/arbitrage
Parâmetros de Query
| Parâmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
buyExchange | string | Sim | Lista de exchanges para compra, separadas por vírgula |
sellExchange | string | Sim | Lista de exchanges para venda, separadas por vírgula |
includePricesQuote | boolean | Não | Se true, inclui as cotações de preços na resposta |
networkMatch | boolean | Não | Se true, filtra apenas operações com redes compatíveis |
volumeMin | float | Não | Volume mínimo de negociação (considera volume_best_buy ou volume_best_sell) |
spreadMin | float | Não | Spread mínimo de lucro em percentual (profit_percent_ask_bid) |
Exemplo de Requisição
Exemplo 1: Requisição básicacurl --location 'localhost:8080/v1/arbitrage?buyExchange=Mercado+Bitcoin,Binance,Bitget&sellExchange=Binance,Mercado+Bitcoin,Bitget,Crypto.com,Gate.io&includePricesQuote=true'
curl --location 'localhost:8080/v1/arbitrage?buyExchange=binance&sellExchange=kucoin&networkMatch=true&volumeMin=1000&spreadMin=2.0'
Exemplo de Resposta
{
"exchanges": {
"buy": ["Mercado Bitcoin", "Binance", "Bitget"],
"sell": ["Binance", "Mercado Bitcoin", "Bitget", "Crypto.com", "Gate.io"]
},
"opportunities": [
{
"pair": "BTC/USD",
"buyExchange": "Binance",
"sellExchange": "Gate.io",
"buyPrice": 25000.00,
"sellPrice": 25500.00,
"profit": 500.00,
"priceQuotes": {
"Binance": 25000.00,
"Gate.io": 25500.00
}
}
],
"timestamp": "2025-03-18T12:00:00Z"
}
Spread líquido e custos
Cada item retornaspread (bruto), netSpread para referenceNotional: 1000,
executable, infeasibleReason e o detalhamento fees.takerBuy,
fees.takerSell, fees.withdrawal e fees.network. Custos com
estimated: true usam os fallbacks conservadores configurados no serviço.
Taxas oficiais por rede são usadas somente quando a API documentada da exchange
está disponível e foi consultada com sucesso. A ausência de credenciais, falhas
temporárias ou exchanges sem endpoint adequado nunca transformam valores
estáticos em custos exatos: nesses casos o item permanece estimado.
O parâmetro spreadMin filtra netSpread. Quando networkMatch=true, somente
rotas executáveis são retornadas; sem esse filtro, rotas inviáveis continuam
visíveis com o motivo correspondente.
Campo opcional depth
Cada oportunidade pode trazer um array depth com o spread realizável por
faixa de volume, calculado por VWAP sobre a profundidade do livro de ofertas:
"depth": [
{ "notional": 1000, "vwapBuy": 31.61, "vwapSell": 32.59, "effectiveSpread": 3.10, "insufficientLiquidity": false, "filledNotionalBuy": 1000, "filledNotionalSell": 1000, "bookExhaustedBuy": false, "bookExhaustedSell": false },
{ "notional": 5000, "vwapBuy": 31.74, "vwapSell": 32.34, "effectiveSpread": 1.90, "insufficientLiquidity": false, "filledNotionalBuy": 5000, "filledNotionalSell": 5000, "bookExhaustedBuy": false, "bookExhaustedSell": false },
{ "notional": 10000, "vwapBuy": 31.94, "vwapSell": 32.19, "effectiveSpread": 0.78, "insufficientLiquidity": true, "filledNotionalBuy": 10000, "filledNotionalSell": 2340, "bookExhaustedBuy": false, "bookExhaustedSell": true }
]
O campo não vem em todas as oportunidades: para não multiplicar o custo de
rede, apenas as
N de maior spread bruto são enriquecidas nesta listagem
(DEPTH_TOP_N, padrão 5). O detalhe da operação (GET /v1/arbitrage/{id})
sempre calcula. Trate depth como opcional. Detalhes em
Spread realizável por profundidade.📝 Notas sobre os Parâmetros
Os parâmetros de query permitem configurar a busca por oportunidades de arbitragem:
buyExchange: Define as exchanges onde serão buscados preços para comprasellExchange: Define as exchanges onde serão buscados preços para vendaincludePricesQuote: Quando true, retorna as cotações de todas as exchanges consultadasnetworkMatch: Quando true, filtra apenas operações que possuem pelo menos uma rede comum entre as exchanges de compra e vendavolumeMin: Filtra operações onde pelo menos um dos volumes (compra ou venda) atende ao valor mínimo especificadospreadMin: Filtra operações com spread de lucro igual ou superior ao valor especificado em percentual
Comportamento dos Filtros Avançados
Filtro de Match de Redes (networkMatch)
- Quando
networkMatch=true, apenas operações que possuem pelo menos uma rede comum (ex: ERC20, TRC20, BEP20) entre as exchanges de compra e venda serão retornadas - Valor padrão:
false(não filtra) - Campo utilizado:
common_networks(array de strings)
volumeMin)
- Filtra operações onde
volume_best_buy >= volumeMinOUvolume_best_sell >= volumeMin - Valor padrão:
null(não filtra) - Campos utilizados:
volume_best_buyouvolume_best_sell
spreadMin)
- Filtra operações com spread de lucro igual ou superior ao valor especificado
- Valor padrão:
null(não filtra) - Campo utilizado:
profit_percent_ask_bid
Todos os novos filtros são opcionais. Os filtros são aplicados em conjunto (AND lógico), então uma operação deve atender a todos os filtros especificados para ser retornada.
🔍 Exchanges Suportadas
Integrações
Explore integrações com exchanges e APIs externas
Certifique-se de que as exchanges especificadas nos parâmetros estejam entre as suportadas pelo sistema.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Minimum net spread percentage
When true, returns only executable routes
Response
200 - application/json
Spot opportunities
Gross spread percentage
Net spread percentage for referenceNotional
Example:
1000
Example:
1
Show child attributes
Show child attributes
Available options:
no_common_network, withdrawal_suspended, deposit_suspended