Create onboarding invite | Moov Documentation

Create onboarding invite

[Onboarding Drop
Use Moov.js Drops as an alternative to the API. Drops are customizable, pre-built UI components with error handling and secure PII data collection.

View pre-built Moov.js UI](https://docs.moov.io/moovjs/drops/onboarding/)

Create an invitation containing a unique link that allows the recipient to onboard their organization with Moov.

To access this endpoint using an access token you'll need to specify the /accounts.write scope.

POST

/onboarding-invites

Ask

curl -X POST "https://api.moov.io/onboarding-invites" \
  -H "Authorization: Bearer {token}" \
  -H "X-Moov-Version: v2026.07.00" \
  -d '{\n  "scopes": [\
    "accounts.read"\
  ],\n  "capabilities": [\
    "collect-funds.card-payments",\
    "send-funds.ach"\
  ],\n  "feePlanCodes": [\
    "merchant-direct"\
  ]\n}'

Ask

import { Moov } from "@moovio/sdk";

const moov = new Moov({
  security: {
    username: "",
    password: "",
  },
});

async function run() {
  const result = await moov.onboarding.createInvite({
    scopes: [\
      "accounts.read",\
    ],
    grantScopes: [\
      "transfers.write",\
    ],
    capabilities: [\
      "transfers",\
    ],
    feePlanCodes: [\
      "merchant-direct",\
    ],
    prefill: {
      accountType: "business",
      profile: {
        business: {
          legalBusinessName: "Whole Body Fitness LLC",
        },
      },
    },
  });

console.log(result);
}

run();

Ask

declare(strict_types=1);

require 'vendor/autoload.php';

use Moov\MoovPhp;
use Moov\MoovPhp\Models\Components;

$sdk = MoovPhp\Moov::builder()
    ->setSecurity(
        new Components\Security(
            username: '',
            password: '',
        )
    )
    ->build();

$request = new Components\OnboardingInviteRequest(
    scopes: [\
        Components\ApplicationScope::AccountsRead,\
    ],
    grantScopes: [\
        Components\ApplicationScope::TransfersWrite,\
    ],
    capabilities: [\
        Components\CapabilityID::Transfers,\
    ],
    feePlanCodes: [\
        'merchant-direct',\
    ],
    prefill: new Components\CreateAccount(
        accountType: Components\CreateAccountType::Business,
        profile: new Components\CreateProfile(
            business: new Components\CreateBusinessProfile(
                legalBusinessName: 'Whole Body Fitness LLC',
            ),
        ),
    ),
);

$response = $sdk->onboardingInvites->create(
    request: $request
);

if ($response->onboardingInvite !== null) {
    // handle response
}

Ask

package hello.world;

import io.moov.sdk.Moov;
import io.moov.sdk.models.components.*;
import io.moov.sdk.models.errors.GenericError;
import io.moov.sdk.models.errors.OnboardingInviteError;
import io.moov.sdk.models.operations.CreateOnboardingInviteResponse;
import java.lang.Exception;
import java.util.List;

public class Application {

public static void main(String[] args) throws GenericError, OnboardingInviteError, Exception {

Moov sdk = Moov.builder()
                .security(Security.builder()
                    .username("")
                    .password("")
                    .build())
            .build();

OnboardingInviteRequest req = OnboardingInviteRequest.builder()
                .scopes(List.of(
                    ApplicationScope.ACCOUNTS_READ))
                .capabilities(List.of(
                    CapabilityID.TRANSFERS))
                .feePlanCodes(List.of(
                    "merchant-direct"))
                .grantScopes(List.of(
                    ApplicationScope.TRANSFERS_WRITE))
                .prefill(CreateAccount.builder()
                    .accountType(CreateAccountType.BUSINESS)
                    .profile(CreateProfile.builder()
                        .business(CreateBusinessProfile.builder()
                            .legalBusinessName("Whole Body Fitness LLC")
                            .build())
                        .build())
                    .build())
                .build();

CreateOnboardingInviteResponse res = sdk.onboarding().createInvite()
                .request(req)
                .call();

if (res.onboardingInvite().isPresent()) {
            System.out.println(res.onboardingInvite().get());
        }
    }
}

Ask

from moovio_sdk import Moov
from moovio_sdk.models import components

with Moov(
    security=components.Security(
        username="",
        password="",
    ),
) as moov:

res = moov.onboarding.create_invite(scopes=[\
        components.ApplicationScope.ACCOUNTS_READ,\
    ], capabilities=[\
        components.CapabilityID.TRANSFERS,\
    ], fee_plan_codes=[\
        "merchant-direct",\
    ], grant_scopes=[\
        components.ApplicationScope.TRANSFERS_WRITE,\
    ], prefill=components.CreateAccount(
        account_type=components.CreateAccountType.BUSINESS,
        profile=components.CreateProfile(
            business=components.CreateBusinessProfile(
                legal_business_name="Whole Body Fitness LLC",
            ),
        ),
    ))

# Handle response
    print(res)

Ask

require 'moov_ruby'

Models = ::Moov::Models
s = ::Moov::Client.new(
  security: Models::Components::Security.new(
    username: '',
    password: ''
  )
)

req = Models::Components::OnboardingInviteRequest.new(
  scopes: [\
    Models::Components::ApplicationScope::ACCOUNTS_READ,\
  ],
  grant_scopes: [\
    Models::Components::ApplicationScope::TRANSFERS_WRITE,\
  ],
  capabilities: [\
    Models::Components::CapabilityID::TRANSFERS,\
  ],
  fee_plan_codes: [\
    'merchant-direct',\
  ],
  prefill: Models::Components::CreateAccount.new(
    account_type: Models::Components::CreateAccountType::BUSINESS,
    profile: Models::Components::CreateProfile.new(
      business: Models::Components::CreateBusinessProfile.new(
        legal_business_name: 'Whole Body Fitness LLC'
      )
    )
  )
)
res = s.onboarding.create_invite(request: req)

unless res.onboarding_invite.nil?
  # handle response
end

Ask

using Moov.Sdk;
using Moov.Sdk.Models.Components;
using System.Collections.Generic;

var sdk = new MoovClient(security: new Security() {
    Username = "",
    Password = "",
});

OnboardingInviteRequest req = new OnboardingInviteRequest() {
    Scopes = new List<ApplicationScope>() {
        ApplicationScope.AccountsRead,
    },
    GrantScopes = new List<ApplicationScope>() {
        ApplicationScope.TransfersWrite,
    },
    Capabilities = new List<CapabilityID>() {
        CapabilityID.Transfers,
    },
    FeePlanCodes = new List<string>() {
        "merchant-direct",
    },
    Prefill = new CreateAccount() {
        AccountType = CreateAccountType.Business,
        Profile = new CreateProfile() {
            Business = new CreateBusinessProfile() {
                LegalBusinessName = "Whole Body Fitness LLC",
            },
        },
    },
};

var res = await sdk.Onboarding.CreateInviteAsync(req);

// handle response

The request completed successfully.

Ask

Example

{
  "code": "N1IA5eWYNh",
  "link": "http://example.com",
  "returnURL": "string",
  "termsOfServiceURL": "string",
  "scopes": [\
    "accounts.read"\
  ],
  "grantScopes": [\
    "transfers.write"\
  ],
  "capabilities": [\
    "collect-funds.card-payments",\
    "send-funds.ach"\
  ],
  "feePlanCodes": [\
    "merchant-direct"\
  ],
  "redeemedAccountID": "string",
  "prefill": {
    "accountType": "business",
    "profile": {
      "business": {
        "legalBusinessName": "Whole Body Fitness LLC"
      }
    }
  },
  "partner": {
    "accountID": "string",
    "accountMode": "production",
    "displayName": "Bob's Widgets"
  },
  "createdOn": "2019-08-24T14:15:22Z",
  "revokedOn": "2019-08-24T14:15:22Z",
  "redeemedOn": "2019-08-24T14:15:22Z"
}

Response headers

A unique identifier used to trace requests.

The server could not understand the request due to invalid syntax.

Ask

Example

{
  "error": "string"
}

Response headers

A unique identifier used to trace requests.

The request contained missing or expired authentication.

Response headers

A unique identifier used to trace requests.

The user is not authorized to make the request.

Response headers

A unique identifier used to trace requests.

The requested resource was not found.

Response headers

A unique identifier used to trace requests.

The request conflicted with the current state of the target resource.

Ask

Example

{
  "error": "string"
}

Response headers

A unique identifier used to trace requests.

The request was well-formed, but the contents failed validation. Check the request for missing or invalid fields.

Ask

Example

{
  "returnURL": "string",
  "termsOfServiceURL": "string",
  "scopes": {
    "0": "first element failed validation..."
  },
  "capabilities": {
    "0": "first element failed validation..."
  },
  "feePlanCodes": {
    "0": "first element failed validation..."
  }
}

Response headers

A unique identifier used to trace requests.

Request was refused due to rate limiting.

Response headers

A unique identifier used to trace requests.

The request failed due to an unexpected error.

Response headers

A unique identifier used to trace requests.

The request failed because a downstream service failed to respond.

Response headers

A unique identifier used to trace requests.

Set this header to v2026.07.00 to use the API described in this specification. When omitted, the server defaults to v2024.01.00, which may not match the behavior documented here.

Possible values:

v2026.07.00

Request to create an onboarding invite.

List of capabilities you intend to request for this account. These values are used to determine what information to collect from the user during onboarding.

Possible values:

transfers,

send-funds,

send-funds.push-to-card,

money-transfer.push-to-card,

send-funds.ach,

send-funds.rtp,

send-funds.instant-bank,

collect-funds,

collect-funds.card-payments,

money-transfer.pull-from-card,

collect-funds.ach,

wallet,

wallet.balance,

card-issuing,

issuing.cardholder,

platform.production-app,

platform.wallet-transfers

List of fee plan codes to assign the account created by the invitee.

List of scopes you request to use on this account. These values are used to determine what can be done with the account onboarded.

Possible values:

accounts.read,

accounts.write,

analytics.read,

apple-pay-merchant.read,

apple-pay-merchant.write,

apple-pay.read,

apple-pay.write,

bank-accounts.read,

bank-accounts.write,

capabilities.read,

capabilities.write,

cards.read,

cards.write,

documents.read,

documents.write,

fed.read,

files.read,

files.write,

issued-cards.read,

issued-cards.write,

issued-cards.read-secure,

payment-methods.read,

ping.read,

profile-enrichment.read,

profile.read,

profile.write,

profile.disconnect,

representatives.read,

representatives.write,

transfers.read,

transfers.write,

wallets.read

List of scopes you grant to allow being used by the new account on yourself. These values are used to determine what the account onboarded can do.

Possible values:

accounts.read,

accounts.write,

analytics.read,

apple-pay-merchant.read,

apple-pay-merchant.write,

apple-pay.read,

apple-pay.write,

bank-accounts.read,

bank-accounts.write,

capabilities.read,

capabilities.write,

cards.read,

cards.write,

documents.read,

documents.write,

fed.read,

files.read,

files.write,

issued-cards.read,

issued-cards.write,

issued-cards.read-secure,

payment-methods.read,

ping.read,

profile-enrichment.read,

profile.read,

profile.write,

profile.disconnect,

representatives.read,

representatives.write,

transfers.read,

transfers.write,

wallets.read.

The account that created the onboarding invite.