The OwlPay Harbor Developer Hub

Welcome to the OwlPay Harbor developer hub. You'll find comprehensive guides and documentation to help you start working with OwlPay Harbor as quickly as possible, as well as support if you get stuck. Let's jump right in!

Welcome to OwlPay Harbor

Your Seamless Integration for Financial Services & KYC/AML Services

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.

Seamless API Integration

Global fiat currency payments with competitive rates
Stablecoin payments with 1:1 exchange ratio
Commercial card services for businesses

Customized Payment Flows

Web3 wallets and dApps
Cross-border transactions
Global payments
All backed by robust compliance and anti-money laundering frameworks to ensure security and trust.

Supports multiple popular blockchains

including Stellar, Ethereum, Solana, Polygon, Avalanche, Optimism, and Arbitrum.

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:

StepWhat it does
QuoteLocks FX rate, fees, and payout corridor
RequirementsTells you exactly what beneficiary data is required
TransferExecutes 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
    }
  }
);