Wyre Documentation
  • 📡Wyre Documentation
  • Home
  • 👥Account Onboarding
    • Account Overview
    • Use Cases
    • Pricing
    • API Calls
      • Create Account
      • Get Account
      • Update Account
      • Upload Document
  • 🔗Wallets
    • Use Cases
    • Managing Wallets
      • Creating a Wallet
      • Create Mulitple Wallets
      • Lookup Wallet
      • Edit Wallet
      • List Wallets
      • Delete Wallet
    • Wallet Callbacks
  • 💳Payments
    • Limits + Coverage
    • Pricing
    • Chargeback + Risk
    • Accepted Payment Methods
    • Global Card Processing
      • Hosted Redirect Operation
      • Browser Dialog (Popup) Operation
      • Understanding Transaction Statuses
        • Wallet Order Errors and Exceptions (Failure Reasons)
      • Additional Widget Functionality and Features
        • Checking Limits
        • Tracking Orders
      • Widget FAQs
      • ⚠️ Wallet Order Reservations | Required! ⚠️
      • API Calls To Help Monitor Transactions
        • Track Widget Order
        • Check A User's Transaction Limits
        • Check Supported Countries
      • Client-Side Encryption 👻
  • 🌏Global Payouts
    • Use Cases
    • Limits + Coverage
    • Pricing
    • Supported Countries
    • Country Requirements
    • 🔥Blockchain + Banks
    • 🔥Instant Payouts to Debit Card
  • 💱Foreign Exchange
    • Exchange Rates
  • Methodologies
  • Payment Methods
    • API Calls
      • Creating a Payment Method- ACH
      • List Payment Methods
      • Create a Payment Method- Wire Transfer
      • Get Payment Method
      • Attach Blockchain to Payment Method
  • Transfers
    • API Calls
      • Creating a Transfer
      • Confirm a Transfer
      • Get Transfer
      • Transfer History
  • Data Subscriptions
    • Subscribe Webhook
    • Get Subscriptions
    • Delete Webhook
  • Resources
  • ✅Going Live
  • Testing Enviornment
  • Understanding API Errors
  • System Resource Name
  • Rate Limiting
  • Authentication & Key Management
    • Authorization Tokens
    • Create an API Key
    • Delete an API Key
    • Authentication Code Examples
  • Wyre Brand Assets
    • 🎨Color Palette And Wyre Logos
  • Links
    • 🧪Test Wyre Dashboard
    • 🗣️ Wyre's Discord
Powered by GitBook
On this page
  • Create Account
  • Examples

Was this helpful?

  1. Account Onboarding
  2. API Calls

Create Account

PreviousAPI CallsNextGet Account

Last updated 4 years ago

Was this helpful?

When creating the account you can submit as many or as few profileFields as you need at the time of Account creation.

Create Account

POST https://api.sendwyre.com/v3/accounts

Request Body

Name
Type
Description

type

string

the type of account, currently INDIVIDUAL is the only supported value

country

string

the country of the account holder. For individuals, this is the country of residence. (Currently we only support US accounts)

profileFields

array

An array of the Fields submitted at the time of Account creation. You can submit as many or as few fields as you need at the time of Account creation. More information

referrerAccountId

string

Supply your own Account ID when creating noncustodial accounts. This field is used to track which account referred the new account into our system

subaccount

boolean

When true, the newly created account will be a custodial subaccount owner by the caller. Otherwise, the account will be a standalone non-custodial account.

disableEmail

boolean

if true prevents all outbound emails to the account

{
  "id" : "AC-U4BWHGZDG6W",
  "status" : "PENDING",
  "type" : "INDIVIDUAL",
  "country" : "US",
  "createdAt" : 1541789972000,
  "depositAddresses" : {
    "ETH" : "0x98B031783d0efb1E65C4072C6576BaCa0736A912",
    "BTC" : "14CriXWTRoJmQdBzdikw6tEmSuwxMozWWq"
  },
  "totalBalances" : { 
    "BTC" : 1.0000000,
    "ETH" : 0.1000000000000000000
  },
  "availableBalances" : { 
    "BTC" : 1.0000000,
    "ETH" : 0.1000000000000000000
  },
  "profileData" : [ {
    "fieldId" : "individualCellphoneNumber",
    "fieldType" : "CELLPHONE",
    "value" : null,
    "note" : "Must be verified by user.",
    "status" : "OPEN"
  }, {
    "fieldId" : "individualEmail",
    "fieldType" : "EMAIL",
    "value" : "johnnyquest22@yolo.com",
    "note" : "Must be verified by user.",
    "status" : "OPEN"
  }, {
    "fieldId" : "individualLegalName",
    "fieldType" : "STRING",
    "value" : "Johnny Quest",
    "note" : null,
    "status" : "PENDING"
  }, {
    "fieldId" : "individualDateOfBirth",
    "fieldType" : "DATE",
    "value" : null,
    "note" : null,
    "status" : "OPEN"
  }, {
    "fieldId" : "individualSsn",
    "fieldType" : "STRING",
    "value" : null,
    "note" : null,
    "status" : "NULL"
  }, {
    "fieldId" : "individualResidenceAddress",
    "fieldType" : "ADDRESS",
    "value" : {
        "street1": "1 Market St",
        "street2": "Suite 402",
        "city": "San Francisco",
        "state": "CA",
        "postalCode": "94105",
        "country": "US"
    },
    "note" : null,
    "status" : "PENDING"
  }, {
    "fieldId" : "individualGovernmentId",
    "fieldType" : "DOCUMENT",
    "value" : [],
    "note" : null,
    "status" : "OPEN"
  }, {
    "fieldId" : "individualSourceOfFunds",
    "fieldType" : "PAYMENT_METHOD",
    "value" : null,
    "note" : "Payment method not yet submitted",
    "status" : "OPEN"
  } ]
}

Examples

{
  "type":"INDIVIDUAL",
  "country": "US",
  "subaccount": true,
  "profileFields":[
    {
      "fieldId": "individualLegalName",
      "value": "Johnny Quest"
    },
    {
      "fieldId": "individualEmail",
      "value": "JohnnyQuest22@yolo.com"
    },
    {
      "fieldId": "individualResidenceAddress",
      "value": {
        "street1": "1 Market St",
        "street2": "Suite 402",
        "city": "San Francisco",
        "state": "CA",
        "postalCode": "94105",
        "country": "US"
      }
    }
  ]
}
'''
This is a Python 3.7 Module that creates a Wyre Account
using secret key authentication.

You can only use this module for creating INDIVIDUAL accounts
if you already have a business account set up.

If you do not have a business account with a secretKey/ApiKey, 
go through the signup process for a test account here: https://www.testwyre.com/
'''

# You can file account_validation_helpers file here: https://github.com/nickolasteixeira/Wyre_API/blob/master/account_validation_helpers.py
# This file helps for validating entries from users.
# Currently this process is a command line interface program
import account_validation_helpers as avh
import hashlib
import hmac
import json
import os
import requests
import time
import urllib.parse


class WyreApi:
    ACCOUNT_ID = os.getenv("ACCOUNT_ID")
    API_KEY = os.getenv("WYRE_APIKEY")
    SEC_KEY = os.getenv("WYRE_TOKEN")
    API_VER3 = "/v3"
    API_ACCOUNT_PATH = "/accounts"
    API_URL = "https://api.testwyre.com"
    # These are the object attributes that you'll want to fill in before sending the request to Wyre's API. Feel free to add more if you want a thorough onboarding process for your users
    # Reference for more fields: https://docs.sendwyre.com/docs/account-resource#section-field-ids
    OBJ_ATTRS = ('type', 'country', 'individualLegalName',
                 'individualEmail', 'individualCellphoneNumber')
    # 'individualResidenceAddress', 'individualDateOfBirth', 'individualSsn')

    '''
        This method initializes all the OBJ_ATTRS above to this class object.
        It takes in a createObj object if you want to pass one in, if not,
        you'll go through the fillInfo method process below.
    '''

    def __init__(self, createObj=None):
        if not createObj:
            createObj = WyreApi.OBJ_ATTRS

        self.fillInfo(createObj)





    '''
        This method loops through each OBJ_ATTR tuple above in the class 
        attributes and set's an the obj attributes to the newly created WyreAPI 
        object. It also goes through and validates each entry from the user.
        You can find the avh validateEntry and printAccountSetup methods
        here: https://github.com/nickolasteixeira/Wyre_API/blob/master/account_validation_helpers.py
    '''

    def fillInfo(self, createObj):
        avh.printAccountSetup()
        # loop through all the obj_attrs and initialize them to the obj

        for attr in createObj:
            setattr(self, attr, self.validateEntry(attr))

        avh.printCreateAccount()





    '''
        This method validates all entries from the users. It first finds the 
        validation function based on the attribute being passed and then calls 
        that function to validate the user's entry
        You can find the switchCase function here: https://github.com/nickolasteixeira/Wyre_API/blob/master/account_validation_helpers.py 
    '''

    def validateEntry(self, attr):
        # finds the function to use based on the object attr
        # from the account_validation_helpers.py file
        func = avh.switchCase(attr)
        # validates the text input with the function assigned to the
        # obj attribute from OBJ_ATTRS (Class attribute)
        text = func(self, attr)
        # returns the text to then get set to the specific attribute of the obj
        return text





    '''
        This method calculates the auth signature hash required for secret key 
        authentication
    '''

    def calc_auth_sig_hash(self, url_body):
        # calculates a signature per Wyre API:
        # https://docs.sendwyre.com/docs/authentication#secret-key-signature-auth
        message, secret = bytes(
            url_body, 'utf-8'), bytes(WyreApi.SEC_KEY, 'utf-8')
        newhash = hmac.new(secret, message, hashlib.sha256)
        return newhash.hexdigest()






    '''
        This method calculates a timesteamp required for the secret key 
        authentication
    '''

    def calcTimeStamp(self):
        # creates a timestamp to the millisecond
        return str(round(time.time() * 1000))





    '''
        This method creates an account and sends a request to Wyre's API
        API Endpoint:https://api.sendwyre.com/v3/accounts
    '''

    def createAccount(self):
        # additional timesteamp for the URL per Wyre Specs on the documentation
        # https://docs.sendwyre.com/docs/authentication#secret-key-signature-auth
        params = {
            "timestamp": self.calcTimeStamp()
        }
        # Data for the post request to create the account
        # These are fields required to create an "INDIVIDUAL" account
        # https://docs.sendwyre.com/docs/account-resource#section-field-ids
        post_data = {
            "type": self.type,
            "country": self.country,
            "subaccount": True,
            "profileFields": [
                {"fieldId": "individualLegalName",
                            "value": self.individualLegalName},
                {"fieldId": "individualEmail",
                            "value": self.individualEmail},
                {"fieldId": "individualCellphoneNumber",
                            "value": self.individualCellphoneNumber},
                # {"fieldId": "individualResidenceAddress", "value": self.individualResidenceAddress},
                # {"fieldId": "individualDateOfBirth", "value": self.individualDateOfBirth},
                # {"fieldId": "individualSsn", "value": self.individualSsn}
            ]}
        # concatinating the URL to then create a Signature hash
        url = WyreApi.API_URL + WyreApi.API_VER3 + WyreApi.API_ACCOUNT_PATH + \
            "?" + urllib.parse.urlencode(params, encoding='utf-8')
        # headers needed to authorize the post request
        # https://docs.sendwyre.com/docs/authentication#secret-key-signature-auth
        headers = {
            'X-API-Key': WyreApi.API_KEY,
            'X-API-Signature': self.calc_auth_sig_hash(url + json.dumps(post_data))
        }
        # sending a request with the post data, timestamp and signed headers
        response = requests.post(url, headers=headers, json=post_data)
        if response.status_code == 200:
            # print success message
            return json.loads(response.text)
        else:
            print(response.text)




if __name__ == "__main__":
    # =========== Creating an account =========== #
    account = WyreApi()
    # You can either pass in an iterable with the
    # required obj attributes. Ex below:
    # createObj = ('type', 'country', 'individualLegalName', 'individualEmail')
    # account = WyreApi(createObj)

    # Or you can create an account without passing in an argument
    new_account = account.createAccount()
    if new_account:
      print(new_account)
################### Generate a secrey key ###################
# First generate your own secret key/Api, if you do not already have one.
# If you do not have a business account with a secretKey/ApiKey, 
# go through the signup process for a test account here: https://www.testwyre.com/

# If you do, skip down to Create a Wyre Account in this view. 


################### Create a Wyre Account ###################
# After receiving your secret key, your next step should be create an account.
# In this example below, I'm using the test env. When you are ready, use the production url: https://api.sendwyre.com

# Feel free to input your own account object below. 

curl -X POST \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR-BEARER-TOKEN" \
-d '{"type":"INDIVIDUAL","country": "US","subaccount": true,"profileFields":[{"fieldId": "individualLegalName","value": "YOUR_NAME"},{"fieldId": "individualEmail","value": "YOUREMAIL@EMAIL.com"},{"fieldId": "individualResidenceAddress","value": {"street1": "1 Market St","street2": "Suite 402","city": "San Francisco","state": "CA","postalCode": "94105","country": "US"}}]}' \
https://api.testwyre.com/v3/accounts

👥
More information