Follow this step by step guide to create accounts with our API, SDKs, and Moov.js.
The easiest way to create accounts will be through our hosted onboarding process (coming soon). You can create business or individual accounts, pre-fill data, and send a form link directly to merchants to complete.
The examples on this page show the flow of creating both business and individual accounts with our API, SDKs, and Moov.js, including the use of Moov’s pre-built onboarding Drop. We strongly recommend using Moov.js’s pre-built onboarding Drop.
The examples are broken out into individual steps, but a full example is provided at the end of each section. Before you create an account, familiarize yourself with capabilities and requirements.
This initial step is only required if you’re going to use Moov’s onboarding Drop.
Create an access token, which you’ll later include as the onboarding.token when onboarding accounts with Drops.
1
2
3
4
curl -X POST "https://api.moov.io/oauth2/token"\
-u "PUBLIC_KEY:PRIVATE_KEY"\
--data-urlencode "grant_type=client_credentials"\
--data-urlencode "scope=/accounts.write"\
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import{Moov,SCOPES}from'@moovio/node';constmoov=newMoov({accountID:"YOUR_MOOV_ACCOUNT_ID",publicKey:"PUBLIC_KEY",secretKey:"PRIVATE_KEY",domain:"YOUR_DOMAIN"});constscopes=[SCOPES.ACCOUNTS_CREATE];try{const{token}=awaitmoov.generateToken(scopes);// Do something with token
}catch(err){// Handle any errors
}
The examples below have been broken up into all the small tasks needed to create a business Moov account. However, when using the API, SDKs, or Moov.js, steps 2-4 can be consolidated into one step. See the full example for details.
You can provide a variety of information when creating an account. The example below only includes the minium required fields. The response object will include the newly created accountID which you will need to update the account.
mc,_:=moov.NewClient()mc.CreateAccount(ctx,moov.CreateAccount{Type:moov.AccountType_Business,Profile:moov.CreateProfile{Business:&moov.CreateBusinessProfile{Name:"Whole Body Fitness LLC",Type:"llc",Website:"wbfllc.com",},},})
constmoov=newMoov(credentialsObject);constaccountPayload={accountType:"business",profile:{business:{legalBusinessName:"Whole Body Fitness LLC",businessType:"llc",website:"wbfllc.com"}},foreignId:"your-correlation-id"};constaccount=awaitmoov.accounts.create(accountPayload);
constmoov=Moov(token);constaccountPayload={accountType:"business",profile:{business:{legalBusinessName:"Whole Body Fitness LLC",businessType:"llc",website:"wbfllc.com"}},foreignId:"your-correlation-id"};constaccount=awaitmoov.accounts.create({accountPayload});
With the onboarding Drop, you request capabilities when creating an account. After this step, you can jump ahead to step 4.
1
<moov-onboarding></moov-onboarding>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Get the onboarding Drop
constonboarding=document.querySelector("moov-onboarding");// After generating a token, set it on the onboarding element
onboarding.token="some-generated-token";// Include your accountID, which can be found in the Dashboard
onboarding.facilitatorAccountID="your-account-id";// Request capabilities
onboarding.capabilities=["transfers","send-funds","collect-funds","wallet"];// Open the onboarding flow when ready
onboarding.open=true;
Request capabilities for the account you’ve created by passing the accountID. You can find the account ID in the create account response, or you can find it by using the list accounts GETendpoint.
You can send the platform agreement via a token, or manually using the accountID. To send a token, you must generate the token and then update the account with that token. To send Moov the acceptance manually, you must capture the information from the customer and send it to Moov. Moov recommends anyone using a server integration update the terms of service using the manual method.
// Get the terms of service Drop
consttermsOfService=document.querySelector("moov-terms-of-service");// Provide the token
termsOfService.token="eyjh...";
Moov must verify business representatives before a business account send funds or collect funds from other accounts. A beneficial owner is any individual with ≥25% ownership of the business (owner), or someone with significant responsibility to control or manage the business (controller).
An account is not required to have an owner, but must have at least one controller. An account can have a maximum of 7 representatives.
mc,_:=moov.NewClient()varaccountIDstringmc.CreateRepresentative(ctx,accountID,moov.CreateRepresentative{Address:&moov.Address{AddressLine1:"12 Main Street",City:"Cabot Cove",StateOrProvince:"ME",PostalCode:"04103",Country:"US",},BirthDate:&moov.Date{Day:10,Month:11,Year:1985,},Email:"amanda@classbooker.dev",GovernmentID:&moov.GovernmentID{SSN:&moov.SSN{Full:"111111111",LastFour:"1111",},},Name:moov.Name{FirstName:"Amanda",LastName:"Yang",},Phone:&moov.Phone{Number:"8185551212",CountryCode:"1",},Responsibilities:&moov.Responsibilities{IsController:false,IsOwner:true,OwnershipPercentage:38,JobTitle:"CEO",},})
constmoov=newMoov(credentialsObject);constaccountID="accountID";constrepresentativePayload={address:{addressLine1:"12 Main Street",city:"Cabot Cove",stateOrProvince:"ME",postalCode:"04103",country:"US"},birthDate:{day:10,month:11,year:1985},email:"amanda@classbooker.dev",governmentID:{ssn:{full:"111111111",lastFour:"1111"}},name:{firstName:"Amanda",lastName:"Yang"},phone:{number:"8185551212",countryCode:"1"},responsibilities:{isController:false,isOwner:true,ownershipPercentage:38,jobTitle:"CEO"}};constaccount=awaitmoov.representatives.create(accountID,representativePayload);
constmoov=Moov(token);constaccountID="accountID";constrepresentativePayload={address:{addressLine1:"12 Main Street",city:"Cabot Cove",stateOrProvince:"ME",postalCode:"04103",country:"US"},birthDate:{day:10,month:11,year:1985},email:"amanda@classbooker.dev",governmentID:{ssn:{full:"111111111",lastFour:"1111"}},name:{firstName:"Amanda",lastName:"Yang"},phone:{number:"8185551212",countryCode:"1"},responsibilities:{isController:false,isOwner:true,ownershipPercentage:38,jobTitle:"CEO"}};constaccount=awaitmoov.representatives.create(accountID,representativePayload);
Depending on the account and capabilities requested, Moov might require additional verification and underwriting. You will receive alerts for any missing data in the Dashboard.
You can consolidate steps 2 through 4 using the create account POSTendpoint. The below example includes all the fields you can send to Moov in one step when creating a business account. After creating an account, you would still need to add representatives and provide beneficial owner confirmation (starting at steps 5 and 6).
mc,_:=moov.NewClient()thirdPartyID:=""// your system identifier
mc.CreateAccount(ctx,moov.CreateAccount{Type:moov.AccountType_Business,Profile:moov.CreateProfile{Business:&moov.CreateBusinessProfile{Address:&moov.Address{AddressLine1:"123 Main Street",AddressLine2:"Apt 302",City:"Boulder",StateOrProvince:"CO",PostalCode:"80301",Country:"US",},Type:moov.BusinessType_Llc,Description:"Local fitness center paying out instructors",DBA:"Whole Body Fitness",Email:"julesj@classbooker.dev",IndustryCodes:&moov.IndustryCodes{Naics:"713940",Sic:"7991",Mcc:"7997",},Name:"Whole Body Fitness LLC",Phone:&moov.Phone{Number:"8185551212",CountryCode:"1",},TaxID:&moov.TaxID{EIN:moov.EIN{Number:"123456789",},},Website:"www.wholebodyfitnessgym.com",},},RequestedCapabilities:[]moov.CapabilityName{moov.CapabilityName_Transfers,moov.CapabilityName_SendFunds,moov.CapabilityName_CollectFunds,moov.CapabilityName_Wallet,},CustomerSupport:&moov.CustomerSupport{Address:&moov.Address{AddressLine1:"123 Main Street",AddressLine2:"Unit 302",City:"Boulder",StateOrProvince:"CO",PostalCode:"80301",Country:"US",},Email:"julesj@classbooker.dev",Phone:&moov.Phone{Number:"8185551212",CountryCode:"1",},},ForeignID:thirdPartyID,Metadata:map[string]string{"Property1":"string","Property2":"string",},AccountSettings:&moov.AccountSettings{CardPayment:&moov.CardPaymentSettings{StatementDescriptor:"Jules Jackson",},},})
constmoov=newMoov(credentialsObject);constaccountPayload={accountType:"business",profile:{business:{address:{addressLine1:"123 Main Street",addressLine2:"Unit 302",city:"Boulder",stateOrProvince:"CO",postalCode:"80301",country:"US"},businessType:"llc",description:"Local fitness center paying out instructors",doingBusinessAs:"Whole Body Fitness",email:"amanda@classbooker.dev",industryCodes:{naics:"713940",sic:"7991",mcc:"7997"},legalBusinessName:"Whole Body Fitness LLC",phone:{number:"8185551212",countryCode:"1"},taxID:{ein:{number:"123-45-6789"}},website:"www.wholebodyfitnessgym.com",}},capabilities:["transfers","send-funds","collect-funds","wallet"],customerSupport:{address:{addressLine1:"123 Main Street",addressLine2:"Unit 302",city:"Boulder",stateOrProvince:"CO",postalCode:"80301",country:"US"},email:"amanda@classbooker.dev",phone:{number:"8185551212",countryCode:"1"},website:"www.wholebodyfitnessgym.com"},foreignId:"your-correlation-id",metadata:{property1:"string",property2:"string"},mode:"production",settings:{cardPayment:{statementDescriptor:"Whole Body Fitness"}},termsOfService:{token:"kgT1uxoMAk7QKuyJcmQE8nqW_HjpyuXBabiXPi6T83fUQoxsyWYPcYzuHQTqrt7YRp4gCwyDQvb6U5REM9Pgl2EloCe35t-eiMAbUWGo3Kerxme6aqNcKrP_6-v0MTXViOEJ96IBxPFTvMV7EROI2dq3u4e-x4BbGSCedAX-ViAQND6hcreCDXwrO6sHuzh5Xi2IzSqZHxaovnWEboaxuZKRJkA3dsFID6fzitMpm2qrOh4"},};constaccount=awaitmoov.accounts.create(accountPayload);
constmoov=Moov(token);constaccountPayload={accountType:"business",profile:{business:{address:{addressLine1:"123 Main Street",addressLine2:"Unit 302",city:"Boulder",stateOrProvince:"CO",postalCode:"80301",country:"US"},businessType:"llc",description:"Local fitness center paying out instructors",doingBusinessAs:"Whole Body Fitness",email:"amanda@classbooker.dev",industryCodes:{naics:"713940",sic:"7991",mcc:"7997"},legalBusinessName:"Whole Body Fitness LLC",phone:{number:"8185551212",countryCode:"1"},taxID:{ein:{number:"123-45-6789"}},website:"www.wholebodyfitnessgym.com",}},capabilities:["transfers","send-funds","collect-funds","wallet"],customerSupport:{address:{addressLine1:"123 Main Street",addressLine2:"Unit 302",city:"Boulder",stateOrProvince:"CO",postalCode:"80301",country:"US"},email:"amanda@classbooker.dev",phone:{number:"8185551212",countryCode:"1"},website:"www.wholebodyfitnessgym.com"},foreignId:"your-correlation-id",metadata:{property1:"string",property2:"string"},mode:"production",settings:{cardPayment:{statementDescriptor:"Whole Body Fitness"}},termsOfService:{token:"kgT1uxoMAk7QKuyJcmQE8nqW_HjpyuXBabiXPi6T83fUQoxsyWYPcYzuHQTqrt7YRp4gCwyDQvb6U5REM9Pgl2EloCe35t-eiMAbUWGo3Kerxme6aqNcKrP_6-v0MTXViOEJ96IBxPFTvMV7EROI2dq3u4e-x4BbGSCedAX-ViAQND6hcreCDXwrO6sHuzh5Xi2IzSqZHxaovnWEboaxuZKRJkA3dsFID6fzitMpm2qrOh4"},};constaccount=awaitmoov.accounts.create({accountPayload});
The examples below have been broken up into all the small tasks needed to create an individual Moov account. However, when using the API, SDKs, or Moov.js, steps 2-4 can be consolidated into one step. See the full example for details.
You can provide a variety of information when creating an account. The example below only includes the minium required fields. The response object will include the newly created accountID which you will need to update the account.
With the onboarding Drop, you request capabilities when creating an account. After this step, you can jump ahead to step 3.
1
<moov-onboarding></moov-onboarding>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Get the onboarding Drop
constonboarding=document.querySelector("moov-onboarding");// After generating a token, set it on the onboarding element
onboarding.token="some-generated-token";// Include your accountID, which can be found in the Dashboard
onboarding.facilitatorAccountID="your-account-id";// Request capabilities
onboarding.capabilities=["transfers","send-funds","wallet"];// Open the onboarding flow when ready
onboarding.open=true;
Request capabilities for the account you’ve created by passing the accountID. You can find the account ID in the create account response, or you can find it by using the list accounts GETendpoint.
You can send the platform agreement via a token, or manually using the accountID. To send a token, you must generate the token and then update the account with that token. To send Moov the acceptance manually, you must capture the information from the customer and send it to Moov. Moov recommends anyone using a server integration update the terms of service using the manual method.
// Get the terms of service Drop
consttermsOfService=document.querySelector("moov-terms-of-service");// Provide the token
termsOfService.token="eyjh...";
You can consolidate steps 1 through 3 using the create account POSTendpoint. The below example includes all the fields you can send to Moov in one step when creating an individual account.
mc,_:=moov.NewClient()mc.CreateAccount(ctx,moov.CreateAccount{Type:moov.AccountType_Individual,Profile:moov.CreateProfile{Individual:&moov.CreateIndividualProfile{Address:&moov.Address{AddressLine1:"123 Main Street",AddressLine2:"Apt 302",City:"Boulder",StateOrProvince:"CO",PostalCode:"80301",Country:"US",},BirthDate:&moov.Date{Day:9,Month:5,Year:1985,},Email:"julesjacksonyoga@moov.io",GovernmentID:&moov.GovernmentID{SSN:&moov.SSN{Full:"111111111",LastFour:"1111",},},Name:moov.Name{FirstName:"Jules",LastName:"Jackson",},Phone:&moov.Phone{Number:"8185551212",CountryCode:"1",},},},RequestedCapabilities:[]moov.CapabilityName{moov.CapabilityName_Transfers,moov.CapabilityName_SendFunds,moov.CapabilityName_Wallet,},ForeignID:"your-correlation-id",Metadata:map[string]string{"Property1":"string","Property2":"string",},AccountSettings:&moov.AccountSettings{CardPayment:&moov.CardPaymentSettings{StatementDescriptor:"Jules Jackson",},},TermsOfService:&moov.TermsOfServicePayload{Token:"kgT1uxoMAk7QKuyJcmQE8nqW_HjpyuXBabiXPi6T83fUQoxsyWYPcYzuHQTqrt7YRp4gCwyDQvb6U5REM9Pgl2EloCe35t-eiMAbUWGo3Kerxme6aqNcKrP_6-v0MTXViOEJ96IBxPFTvMV7EROI2dq3u4e-x4BbGSCedAX-ViAQND6hcreCDXwrO6sHuzh5Xi2IzSqZHxaovnWEboaxuZKRJkA3dsFID6fzitMpm2qrOh4",},})
constmoov=newMoov(credentialsObject);constaccountPayload={accountType:"individual",profile:{individual:{address:{addressLine1:"123 Main Street",addressLine2:"Apt 302",city:"Boulder",stateOrProvince:"CO",postalCode:"80301",country:"US"},birthDate:{day:"09",month:"05",year:"1985"},email:"julesjacksonyoga@moov.io",governmentID:{ssn:{full:"111111111",lastFour:"1111"}},name:{firstName:"Jules",lastName:"Jackson"},phone:{number:"8185551212",countryCode:"1"},}},capabilities:["transfers","send-funds","wallet"],foreignId:"your-correlation-id",metadata:{property1:"string",property2:"string"},mode:"production",settings:{cardPayment:{statementDescriptor:"Jules Jackson"}},termsOfService:{token:"kgT1uxoMAk7QKuyJcmQE8nqW_HjpyuXBabiXPi6T83fUQoxsyWYPcYzuHQTqrt7YRp4gCwyDQvb6U5REM9Pgl2EloCe35t-eiMAbUWGo3Kerxme6aqNcKrP_6-v0MTXViOEJ96IBxPFTvMV7EROI2dq3u4e-x4BbGSCedAX-ViAQND6hcreCDXwrO6sHuzh5Xi2IzSqZHxaovnWEboaxuZKRJkA3dsFID6fzitMpm2qrOh4"},};constaccount=awaitmoov.accounts.create(accountPayload);
constmoov=Moov(token);constaccountPayload={accountType:"individual",profile:{individual:{address:{addressLine1:"123 Main Street",addressLine2:"Apt 302",city:"Boulder",stateOrProvince:"CO",postalCode:"80301",country:"US"},birthDate:{day:"09",month:"05",year:"1985"},email:"julesjacksonyoga@moov.io",governmentID:{ssn:{full:"111111111",lastFour:"1111"}},name:{firstName:"Jules",lastName:"Jackson"},phone:{number:"8185551212",countryCode:"1"},}},capabilities:["transfers","send-funds","wallet"],foreignId:"your-correlation-id",metadata:{property1:"string",property2:"string"},mode:"production",settings:{cardPayment:{statementDescriptor:"Jules Jackson"}},termsOfService:{token:"kgT1uxoMAk7QKuyJcmQE8nqW_HjpyuXBabiXPi6T83fUQoxsyWYPcYzuHQTqrt7YRp4gCwyDQvb6U5REM9Pgl2EloCe35t-eiMAbUWGo3Kerxme6aqNcKrP_6-v0MTXViOEJ96IBxPFTvMV7EROI2dq3u4e-x4BbGSCedAX-ViAQND6hcreCDXwrO6sHuzh5Xi2IzSqZHxaovnWEboaxuZKRJkA3dsFID6fzitMpm2qrOh4"},};constaccount=awaitmoov.accounts.create({accountPayload});