curl -X POST "https://api.fibrous.finance/{network}/calldata" \
-H "Content-Type: application/json" \
-d '{
"amount": "1000000000000000000",
"tokenInAddress": "0x0000000000000000000000000000000000000000",
"tokenOutAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"slippage": 0.5,
"destination": "0x1234567890123456789012345678901234567890"
}'
const response = await fetch('https://api.fibrous.finance/{network}/calldata', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: '1000000000000000000',
tokenInAddress: '0x0000000000000000000000000000000000000000',
tokenOutAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
slippage: 0.5,
destination: '0x1234567890123456789012345678901234567890'
})
});
const data = await response.json();
// Execute the transaction
const tx = await wallet.sendTransaction({
to: data.to,
data: data.calldata,
value: data.value
});
import requests
url = "https://api.fibrous.finance/{network}/calldata"
payload = {
"amount": "1000000000000000000",
"tokenInAddress": "0x0000000000000000000000000000000000000000",
"tokenOutAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"slippage": 0.5,
"destination": "0x1234567890123456789012345678901234567890"
}
response = requests.post(url, json=payload)
data = response.json()
# Use the calldata to execute transaction
print(f"Send transaction to: {data['to']}")
print(f"Calldata: {data['calldata']}")
print(f"Value: {data['value']}")
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;
public class FibrousCalldata {
public static void main(String[] args) throws Exception {
String url = "https://api.fibrous.finance/{network}/calldata";
Map<String, Object> payload = new HashMap<>();
payload.put("amount", "1000000000000000000");
payload.put("tokenInAddress", "0x0000000000000000000000000000000000000000");
payload.put("tokenOutAddress", "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
payload.put("slippage", 0.5);
payload.put("destination", "0x1234567890123456789012345678901234567890");
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(payload);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response: " + response.body());
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
type Payload struct {
Amount string `json:"amount"`
TokenInAddress string `json:"tokenInAddress"`
TokenOutAddress string `json:"tokenOutAddress"`
Slippage float64 `json:"slippage"`
Destination string `json:"destination"`
}
func main() {
url := "https://api.fibrous.finance/{network}/calldata"
payload := Payload{
Amount: "1000000000000000000",
TokenInAddress: "0x0000000000000000000000000000000000000000",
TokenOutAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
Slippage: 0.5,
Destination: "0x1234567890123456789012345678901234567890",
}
jsonData, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println("Response:", string(body))
}
{
"success": true,
"route": {
"inputToken": {
"name": "Wrapped Ether",
"address": "0x4200000000000000000000000000000000000006",
"decimals": 18,
"price": 3171.37
},
"outputToken": {
"name": "USD Coin",
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals": 6,
"price": 0.99971
},
"inputAmount": "1000000000000000000",
"outputAmount": "3165007379",
"time": 0.495,
"route": [
{
"percent": "51%",
"swaps": [[...]]
}
]
},
"swap_parameters": [
{
"token_in": "0x4200000000000000000000000000000000000006",
"token_out": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"rate": "3165007379",
"protocol_id": "9",
"pool_address": "0x72ab388e2e2f6facef59e3c3fa2c4e29011c2d38"
}
],
"calldata": "0x...",
"to": "0x274602a953847d807231d2370072f5f4e4594b44",
"value": "1000000000000000000"
}
Core Endpoints
Get Calldata
Get route and transaction calldata in a single request
POST
/
{network}
/
calldata
curl -X POST "https://api.fibrous.finance/{network}/calldata" \
-H "Content-Type: application/json" \
-d '{
"amount": "1000000000000000000",
"tokenInAddress": "0x0000000000000000000000000000000000000000",
"tokenOutAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"slippage": 0.5,
"destination": "0x1234567890123456789012345678901234567890"
}'
const response = await fetch('https://api.fibrous.finance/{network}/calldata', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: '1000000000000000000',
tokenInAddress: '0x0000000000000000000000000000000000000000',
tokenOutAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
slippage: 0.5,
destination: '0x1234567890123456789012345678901234567890'
})
});
const data = await response.json();
// Execute the transaction
const tx = await wallet.sendTransaction({
to: data.to,
data: data.calldata,
value: data.value
});
import requests
url = "https://api.fibrous.finance/{network}/calldata"
payload = {
"amount": "1000000000000000000",
"tokenInAddress": "0x0000000000000000000000000000000000000000",
"tokenOutAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"slippage": 0.5,
"destination": "0x1234567890123456789012345678901234567890"
}
response = requests.post(url, json=payload)
data = response.json()
# Use the calldata to execute transaction
print(f"Send transaction to: {data['to']}")
print(f"Calldata: {data['calldata']}")
print(f"Value: {data['value']}")
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;
public class FibrousCalldata {
public static void main(String[] args) throws Exception {
String url = "https://api.fibrous.finance/{network}/calldata";
Map<String, Object> payload = new HashMap<>();
payload.put("amount", "1000000000000000000");
payload.put("tokenInAddress", "0x0000000000000000000000000000000000000000");
payload.put("tokenOutAddress", "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
payload.put("slippage", 0.5);
payload.put("destination", "0x1234567890123456789012345678901234567890");
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(payload);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response: " + response.body());
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
type Payload struct {
Amount string `json:"amount"`
TokenInAddress string `json:"tokenInAddress"`
TokenOutAddress string `json:"tokenOutAddress"`
Slippage float64 `json:"slippage"`
Destination string `json:"destination"`
}
func main() {
url := "https://api.fibrous.finance/{network}/calldata"
payload := Payload{
Amount: "1000000000000000000",
TokenInAddress: "0x0000000000000000000000000000000000000000",
TokenOutAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
Slippage: 0.5,
Destination: "0x1234567890123456789012345678901234567890",
}
jsonData, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println("Response:", string(body))
}
{
"success": true,
"route": {
"inputToken": {
"name": "Wrapped Ether",
"address": "0x4200000000000000000000000000000000000006",
"decimals": 18,
"price": 3171.37
},
"outputToken": {
"name": "USD Coin",
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals": 6,
"price": 0.99971
},
"inputAmount": "1000000000000000000",
"outputAmount": "3165007379",
"time": 0.495,
"route": [
{
"percent": "51%",
"swaps": [[...]]
}
]
},
"swap_parameters": [
{
"token_in": "0x4200000000000000000000000000000000000006",
"token_out": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"rate": "3165007379",
"protocol_id": "9",
"pool_address": "0x72ab388e2e2f6facef59e3c3fa2c4e29011c2d38"
}
],
"calldata": "0x...",
"to": "0x274602a953847d807231d2370072f5f4e4594b44",
"value": "1000000000000000000"
}
Overview
V2 Available: This endpoint maps to
/{network}/v2/routeAndCalldata in V2, with integrator support and metadata. See Route and Calldata V2 and the V2 Migration Guide./route and /execute endpoints, providing an optimized way to get transaction calldata in a single API call. This is ideal for applications that want to minimize API calls and latency.
Supported Networks
- Base
- HyperEVM
- Citrea
- Monad
- Starknet
https://api.fibrous.finance/{network}/calldata
https://api.fibrous.finance/hyperevm/calldata
https://api.fibrous.finance/citrea/calldata
https://api.fibrous.finance/monad/calldata
https://api.fibrous.finance/starknet/calldata
Request Body Parameters
string
required
The amount of input tokens in wei format.Example:
"1000000000000000000" for 1 token with 18 decimalsstring
required
The contract address of the input token.
string
required
The contract address of the output token.
number
default:"0.5"
required
Maximum acceptable slippage in percentage (0.1 to 100).
string
required
The destination address to receive the output tokens.
string[]
Array of protocol IDs to exclude from routing.
boolean
default:"false"
If true, only direct swaps will be considered.
Response
This endpoint combines the route and execute responses:boolean
Indicates if the route was successfully found
object
Complete route information (same as /route endpoint)
object[]
string
The encoded transaction calldata ready for execution
string
Fibrous Router contract address
string
The amount of native token to send with the transaction
curl -X POST "https://api.fibrous.finance/{network}/calldata" \
-H "Content-Type: application/json" \
-d '{
"amount": "1000000000000000000",
"tokenInAddress": "0x0000000000000000000000000000000000000000",
"tokenOutAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"slippage": 0.5,
"destination": "0x1234567890123456789012345678901234567890"
}'
const response = await fetch('https://api.fibrous.finance/{network}/calldata', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
amount: '1000000000000000000',
tokenInAddress: '0x0000000000000000000000000000000000000000',
tokenOutAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
slippage: 0.5,
destination: '0x1234567890123456789012345678901234567890'
})
});
const data = await response.json();
// Execute the transaction
const tx = await wallet.sendTransaction({
to: data.to,
data: data.calldata,
value: data.value
});
import requests
url = "https://api.fibrous.finance/{network}/calldata"
payload = {
"amount": "1000000000000000000",
"tokenInAddress": "0x0000000000000000000000000000000000000000",
"tokenOutAddress": "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
"slippage": 0.5,
"destination": "0x1234567890123456789012345678901234567890"
}
response = requests.post(url, json=payload)
data = response.json()
# Use the calldata to execute transaction
print(f"Send transaction to: {data['to']}")
print(f"Calldata: {data['calldata']}")
print(f"Value: {data['value']}")
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.HashMap;
import java.util.Map;
public class FibrousCalldata {
public static void main(String[] args) throws Exception {
String url = "https://api.fibrous.finance/{network}/calldata";
Map<String, Object> payload = new HashMap<>();
payload.put("amount", "1000000000000000000");
payload.put("tokenInAddress", "0x0000000000000000000000000000000000000000");
payload.put("tokenOutAddress", "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913");
payload.put("slippage", 0.5);
payload.put("destination", "0x1234567890123456789012345678901234567890");
ObjectMapper mapper = new ObjectMapper();
String jsonBody = mapper.writeValueAsString(payload);
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(url))
.header("Content-Type", "application/json")
.POST(HttpRequest.BodyPublishers.ofString(jsonBody))
.build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
System.out.println("Response: " + response.body());
}
}
package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
type Payload struct {
Amount string `json:"amount"`
TokenInAddress string `json:"tokenInAddress"`
TokenOutAddress string `json:"tokenOutAddress"`
Slippage float64 `json:"slippage"`
Destination string `json:"destination"`
}
func main() {
url := "https://api.fibrous.finance/{network}/calldata"
payload := Payload{
Amount: "1000000000000000000",
TokenInAddress: "0x0000000000000000000000000000000000000000",
TokenOutAddress: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",
Slippage: 0.5,
Destination: "0x1234567890123456789012345678901234567890",
}
jsonData, err := json.Marshal(payload)
if err != nil {
panic(err)
}
req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
if err != nil {
panic(err)
}
req.Header.Set("Content-Type", "application/json")
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
panic(err)
}
fmt.Println("Response:", string(body))
}
{
"success": true,
"route": {
"inputToken": {
"name": "Wrapped Ether",
"address": "0x4200000000000000000000000000000000000006",
"decimals": 18,
"price": 3171.37
},
"outputToken": {
"name": "USD Coin",
"address": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"decimals": 6,
"price": 0.99971
},
"inputAmount": "1000000000000000000",
"outputAmount": "3165007379",
"time": 0.495,
"route": [
{
"percent": "51%",
"swaps": [[...]]
}
]
},
"swap_parameters": [
{
"token_in": "0x4200000000000000000000000000000000000006",
"token_out": "0x833589fcd6edb6e08f4c7c32d4f71b54bda02913",
"rate": "3165007379",
"protocol_id": "9",
"pool_address": "0x72ab388e2e2f6facef59e3c3fa2c4e29011c2d38"
}
],
"calldata": "0x...",
"to": "0x274602a953847d807231d2370072f5f4e4594b44",
"value": "1000000000000000000"
}
When to Use This Endpoint
Use Calldata
- Single-step swap execution
- Minimizing API calls
- Reducing latency
- Simple integrations
Use Route + Execute
- Need to display route preview
- User confirmation required
- Complex routing logic
- Custom route manipulation
Best Practices
-
Token Approvals
- Check token allowance before calling
- Approve Fibrous Router to spend tokens
- Not needed for native token swaps
-
Transaction Execution
- Use the exact
to,calldata, andvaluefrom response - Set appropriate gas limit (use
estimatedGas+ buffer) - Monitor transaction status after submission
- Use the exact
-
Error Handling
- Implement retry logic for failed requests
- Handle insufficient liquidity gracefully
- Validate addresses before calling
Complete Integration Example
import { ethers } from 'ethers';
async function executeSwap(provider, signer) {
// 1. Get calldata
const response = await fetch('https://api.fibrous.finance/{network}/calldata', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
amount: '1000000000000000000',
tokenInAddress: '0x0000000000000000000000000000000000000000',
tokenOutAddress: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
slippage: 0.5,
destination: await signer.getAddress()
})
});
const data = await response.json();
// 2. Execute transaction
const tx = await signer.sendTransaction({
to: data.to,
data: data.calldata,
value: data.value,
gasLimit: Math.floor(Number(data.estimatedGas) * 1.2) // 20% buffer
});
// 3. Wait for confirmation
const receipt = await tx.wait();
console.log('Swap completed:', receipt.transactionHash);
return receipt;
}
Network-Specific Router Addresses
- Base
- HyperEVM
- Citrea
- Starknet
Router: 0x... (included in response)
Router: 0x... (included in response)
Router: 0x... (included in response)
Router: 0x... (Cairo format, included in response)
Router addresses are always included in the API response. No need to hardcode them in your application.
Related Endpoints
- Get Route - Get route without execution data
- Execute Swap - Execute with existing route
- Health Check - Check API status
- Route and Calldata V2 - V2 equivalent of this endpoint
- V2 Migration Guide - Migrate to V2 API
⌘I