Bank Transfer Onramps

2500

Easy and efficient bank transfers for users to onramp funds to your app. Accept local and international bank transfers from over 150 countries.

📘

High Level Flow:

  1. Create a User to onboard your user and validate their personal information.
  2. Create a Payment Method to validate their bank information.
  3. Check User status and [Payment Method status] (ref:getpaymentmethod).
  4. Create a Transfer and Get the Wire Instructions.
  5. Get Transfer status on webhook.

1. Creating a User

The first step is to create a user, for bank transfers Wyre requires the Transfer scope completed and approved.

{
"fields": {
"firstName": "Erika",
"lastName": "Nowaj",
"cellphoneNumber": "+4930986365012",
"email": "[email protected]",
"dateOfBirth": "1964-12-08",
"residenceAddress": {
"street1": "Werner-Heisenberg-Allee 25",
"city": "berlin",
"state": "MU",
"postalCode": "80939",
"country": "DE"
}
},
"blockchains": [
"ALL"
],
"immediate": true
}
{
"id": "US_Q6H6Q83VJJZ",
"status": "APPROVED",
"partnerId": "PT_99CJ9LPC3QP",
"type": "INDIVIDUAL",
"createdAt": 1645070853000,
"depositAddresses": {
"BTC": "1FvLiAbmzRfWjnzaykWLheRZBwvmQkGKDa",
"MATIC": "0xc84d4e896e5c97f7162291d7f52f8e00897dbee2",
"AVAX": "X-avax165u32tsrquvffrjtzgzt3llpftt5yapqtsj89z",
"ETH": "0x5b56fd77486c46df6cca92ff8fe27ef8c585bc0b",
"XLM": "GBRNYP3MCASHJYUZLB7ORY37RNEL7Z6B2QATAZ7LGQLCTUU2ZLQVN65A:NADJT3N7QUT"
},
"totalBalances": {
"ETH": 1.00000000000000000000
},
"availableBalances": {
"ETH": 0E-20
},
"fields": {
    "legalName": {
        "value": "Erika Nowak",
        "error": null,
        "status": "SUBMITTED"
    },
"firstName": {
"value": "Erika",
"error": null,
"status": "SUBMITTED"
},
"lastName": {
"value": "Nowaj",
"error": null,
"status": "SUBMITTED"
},
"cellphoneNumber": {
"value": "+4930986365012",
"error": null,
"status": "SUBMITTED"
},
"dateOfBirth": {
"value": "1964-12-08",
"error": null,
"status": "SUBMITTED"
},
"email": {
"value": "[email protected]",
"error": null,
"status": "SUBMITTED"
},
"residenceAddress": {
"value": {
"street1": "Werner-Heisenberg-Allee 25",
"city": "berlin",
"state": "MU",
"postalCode": "80939",
"country": "DE"
},
"error": null,
"status": "SUBMITTED"
},
"ssn": {
"value": "REDACTED",
"error": "Missing ssn",
"status": "OPEN"
}
}
}

2. Creating a Payment Method

Create the payment method, using masquerading to link to the User.

Ex. v2/paymentMethods?masqueradeAs=user:US_NWHJJD2249R

{
"paymentMethodType": "INTERNATIONAL_TRANSFER",
"paymentType": "LOCAL_BANK_WIRE",
"currency": "EUR",
"country": "DE",
"beneficiaryType": "INDIVIDUAL",
"beneficiaryName": "Erika Nowak",
"beneficiaryAddress": "Werner-Heisenberg-Allee 25, 80939 München",
"accountNumber": "DE89370400440532013000",
"swiftBic": "37040044",
"chargeablePM": true
}
{
"id": "PA_YXLBA9YTPN8",
"owner": "user:US_Q6H6Q83VJJZ",
"createdAt": 1646084420714,
"name": "EUR Bank account ending in 3000",
"defaultCurrency": "EUR",
"fingerprint": "BANK-ZIaSzQ5ZXqrgNJiqstNXpUMCQaIvwVuvFfcuNdzOLLs=",
"status": "ACTIVE",
"statusMessage": null,
"waitingPrompts": [],
"linkType": "INTERNATIONAL_TRANSFER",
"beneficiaryType": "INDIVIDUAL",
"supportsDeposit": true,
"nameOnMethod": null,
"last4Digits": "3000",
"brand": null,
"expirationDisplay": null,
"countryCode": "DE",
"nickname": null,
"rejectionMessage": null,
"disabled": false,
"supportsPayment": true,
"chargeableCurrencies": [
"EUR"
],
"depositableCurrencies": [
"EUR"
],
"chargeFeeSchedule": null,
"depositFeeSchedule": null,
"minCharge": null,
"maxCharge": null,
"minDeposit": null,
"maxDeposit": null,
"documents": [],
"blockchains": {},
"liquidationBalances": {},
"srn": "paymentmethod:PA_YXLBA9YTPN8"
}

3. Creating a Transfer

Next, create your transfer from the user bank account to the destination address. Wyre recommends including a notifyUrl for transfer status updates.

{
"source": "paymentmethod:PA_YXLBA9YTPN8",
"sourceCurrency": "EUR",
"dest": "ethereum:0x66985c729f3952259d451397d41e1fe165d80f77",
"destAmount": "1",
"destCurrency": "ETH",
"notifyUrl": "www.requestinspector.com/receivewebhook",
"message": "client pay EUR",
"autoConfirm": true
}

4. Getting Transfer Instructions

Use Get Wire Transfer Instructions to query the created transfer and obtain transfer instructions.

🚧

Display the Transfer Id

Please be sure to display the Transfer Id to the user and request that they include that in the payment reference or memo field of their transfer. If the bank doesn't support special characters then an abbreviated Transfer Id is acceptable, i.e. "DVD4JBJT3L4" in place of "TF_DVD4JBJT3L4".

"wireDetails": {
"instructions": "You can complete the transfer by following these steps:\n\n1.) Print or download the details\n2.) Send the exact amount to the bank details listed above (You can send money through online banking or mobile banking, etc.)\n3.) You will receive an email notification with the transfer details\n\n Note: This bank account only accepts SEPA transfers",
"bankAddress": "SANDSTRASSE 33, MUENCHEN 80335",
"bankPhone": null,
"routingNumber": null,
"accountNumber": null,
"beneficiary": "Wyre Inc",
"beneficiaryAddress": "1550 Bryant St STE 750\nSan Francisco, CA 94103 USA",
"intermediaryBank": null,
"swiftCode": "FDDODEMMXXX",
"abaNumber": null,
"city": null,
"branchCode": null,
"country": "DE",
"accountType": "Business Checking",
"iban": "DE27700222000020475293"
}

5. Confirming Transfer Status

Receive transfer status updates by webhook and query the status using the Create Transfer request.

{
    "subscriptionId": "DA_A2GWGR4PQE6",
    "trigger": "transfer:TF_HPYFMXCARXH"
}
{
"pusherChannel": "44b6238c4140353b280c8a86cba60794",
"exchangeRate": 0.000395640251425168069900506677,
"sourceCurrency": "EUR",
"destCurrency": "ETH",
"sourceAmount": 2546.51,
"destAmount": 1,
"createdAt": 1646085093000,
"dest": "ethereum:0x66985c729f3952259d451397d41e1fe165d80f77",
"fees": {
"EUR": 18.96,
"ETH": 0E-18
},
"totalFees": 18.96,
"customId": null,
"completedAt": null,
"cancelledAt": null,
"failureReason": null,
"blockchainTx": null,
"expiresAt": 1646085693000,
"updatedAt": null,
"estimatedArrival": 1646257896000,
"reversalReason": null,
"reversingSubStatus": null,
"pendingSubStatus": "PROCESSING_EXCHANGE",
"statusHistories": [
{
"id": "8QE4L9UH4L8",
"transferId": "TF_DVD4JBJT3L4",
"createdAt": 1646085095000,
"type": "OUTGOING",
"statusOrder": 0,
"statusDetail": "Initiating Transfer",
"state": "INITIATED",
"failedState": null
},
{
"id": "FBMVT3WGNBH",
"transferId": "TF_DVD4JBJT3L4",
"createdAt": 1646085096000,
"type": "OUTGOING",
"statusOrder": 200,
"statusDetail": "Processing Exchange",
"state": "PENDING",
"failedState": null
},
{
"id": "8JNTQPV2DFY",
"transferId": "TF_DVD4JBJT3L4",
"createdAt": 1646085096000,
"type": "OUTGOING",
"statusOrder": 400,
"statusDetail": "Processing Deposit",
"state": "PENDING",
"failedState": null
}
],
"message": "client pay EUR",
"id": "TF_DVD4JBJT3L4",
"owner": "account:AC_99B4YHQYR2Y",
"source": "paymentmethod:PA_YXLBA9YTPN8",
"status": "PENDING"
}
{
  "owner": "account:AC_XXXXXXXX1",
  "reversingSubStatus": null,
  "source": "paymentmethod:PA_XXXXXXXX1",
  "pendingSubStatus": null,
  "status": "COMPLETED",
  "reversalReason": null,
  "createdAt": 1603824914000,
  "sourceAmount": 2.02,
  "destCurrency": "BTC",
  "sourceCurrency": "USD",
  "statusHistories": [
    {
      "id": "QXXXXXXXX",
      "transferId": "TF_XXXXXXXX1",
      "createdAt": 1603824935000,
      "type": "OUTGOING",
      "statusOrder": 0,
      "statusDetail": "Initiating Transfer",
      "state": "INITIATED",
      "failedState": null
    },
    {
      "id": "BXXXXXXXX",
      "transferId": "TF_XXXXXXX1",
      "createdAt": 1603824935000,
      "type": "OUTGOING",
      "statusOrder": 200,
      "statusDetail": "Processing Exchange",
      "state": "PENDING",
      "failedState": null
    },
    {
      "id": "9XXXXXXXX",
      "transferId": "TF_XXXXXXXX1",
      "createdAt": 1603824936000,
      "type": "OUTGOING",
      "statusOrder": 400,
      "statusDetail": "Processing Deposit",
      "state": "PENDING",
      "failedState": null
    },
    {
      "id": "TXXXXXXXX",
      "transferId": "TF_XXXXXXXX1",
      "createdAt": 1604346618000,
      "type": "OUTGOING",
      "statusOrder": 5100,
      "statusDetail": "Transfer Completed",
      "state": "COMPLETED",
      "failedState": null
    }
  ],
  "blockchainTx": {
    "id": "TR_XXXXXXXX1",
    "networkTxId": "8ba2f644f71b2eaa5edd8e421df4a0b902e...",
    "createdAt": 1604343572000,
    "confirmations": 1,
    "timeObserved": 1604344752000,
    "blockTime": 1604346566000,
    "blockhash": "0000000000000000000299574cd707c36...",
    "amount": 0.00014529,
    "direction": "OUTGOING",
    "networkFee": 0.00066185,
    "address": "3PZsfrHEsCooPM6BC9AXWyfxxxxxxxxxx",
    "sourceAddress": null,
    "currency": "BTC",
    "twinTxId": null
  },
  "expiresAt": 1603825514000,
  "completedAt": 1604346618000,
  "cancelledAt": null,
  "failureReason": null,
  "updatedAt": 1604346617000,
  "exchangeRate": 0.00007264620000000001,
  "destAmount": 0.00014529,
  "fees": {
    "BTC": 0,
    "USD": 0.02
  },
  "totalFees": 0.02,
  "customId": "xxxxxxx-1111-77777-99999-1234567896",
  "dest": "bitcoin:3PZsfrHEsCooPM6BC9AXWyxxxxxxxxxx",
  "message": null,
  "id": "TF_XXXXXXXX1"
}