Eliminate the hassle of complex financial negotiations and seamlessly upgrade your services to on/off-ramp.
OwlPay Harbor provides seamless integration for financial services, supporting KYC/AML services.
Our On Ramp / Off Ramp services support multiple popular blockchains such as Stellar, Ethereum, Solana, Polygon, and Avalanche.
Enjoy the convenience of connecting once and using multiple blockchains without the need to integrate each one individually.
Harbor Transfer v2 API — 3 Step Integration Flow
You can use the Harbor v2 API to make payments from blockchain stablecoin to your local bank with just three API calls.
Each step has a clear responsibility:
| Step | What it does |
|---|---|
| Quote | Locks FX rate, fees, and payout corridor |
| Requirements | Tells you exactly what beneficiary data is required |
| Transfer | Executes the compliant, bank-grade payout |
Step 1 — Quote
Define what you want to send
This call tells Harbor:
“I want to send this much USDC, from this country, to that country, in that currency.”
And The Application(You) can also specify the fee you charge your own customer here.
// Create a quote to lock FX rate, fees, and corridor
const quoteRequest = {
source: {
chain: "ethereum", // Blockchain where funds will come from
country: "US", // Origin jurisdiction
asset: "USDC", // Digital asset being sent
amount: "10000.00" // Amount the user wants to transfer
},
destination: {
country: "MX", // Receiving country
asset: "MXN" // Receiving currency
},
// Optional commission configuration
commission: {
percentage: "1.00", // The fee you collect from your customer (configured by your platform)
amount: 0
}
};
const quoteResponse = await axios.post(
"https://harbor-sandbox.owlpay.com/api/v2/transfers/quotes",
quoteRequest,
{
headers: {
"Content-Type": "application/json",
"X-API-KEY": process.env.HARBOR_API_KEY
}
}
);
// Extract the quote_id for later steps
const quoteId = quoteResponse.data.data[0].id;
Step 2 — Requirements
Every country and payout rail has different rules.
Instead of guessing, Harbor returns a machine-readable schema that tells you exactly what to collect.
You only collect what is actually required for this specific corridor.
// Fetch the required beneficiary fields for this quote
const requirementsResponse = await axios.get(
`https://harbor-sandbox.owlpay.com/api/v2/transfers/quotes/${quoteId}/requirements`,
{
headers: {
"Content-Type": "application/json",
"X-API-KEY": process.env.HARBOR_API_KEY
}
}
);
// This schema can be used to dynamically render a form or validate input
const schema = requirementsResponse.data;
Step 3 — Transfer
Execute the real-world payment
Once pricing and compliance are locked, you submit the final transfer using the quote_id.
Settle into the beneficiary’s bank account
Your system stays simple — Harbor handles the complexity of FX, compliance, liquidity, and banking behind the scenes.
// Submit the final transfer using the locked quote
const transferRequest = {
on_behalf_of: "customer_8f392ab1", // Your customer UUID
quote_id: quoteId, // Quote from Step 1
application_transfer_uuid: "order_9283123",
destination: {
// Beneficiary identity (required by compliance & banking partners)
beneficiary_info: {
beneficiary_name: "Juan Perez",
beneficiary_dob: "1990-02-10",
beneficiary_id_doc_number: "MX123456789",
beneficiary_address: {
street: "Av Reforma 123",
city: "Mexico City",
state_province: "CDMX",
postal_code: "06600",
country: "MX"
}
},
// How the recipient gets paid
payout_instrument: {
mx_clabe: "032180000118359719" // Mexican bank account (SPEI)
},
transfer_purpose: "SALARY",
is_self_transfer: false
}
};
const transferResponse = await axios.post(
"https://harbor-sandbox.owlpay.com/api/v2/transfers",
transferRequest,
{
headers: {
"Content-Type": "application/json",
"X-API-KEY": process.env.HARBOR_API_KEY
}
}
);