# Quick start

> Sign up for Moov, take your first test payment with a payment link and a test card, then onboard a connected account, using the Dashboard or the API.

> AI agents: search and read all Moov docs with the docs MCP server at https://docs.moov.io/mcp (no API key). Setup: https://docs.moov.io/guides/developer-tools/mcp-ai/docs-mcp/index.md

Sign up for Moov, take your first test payment with a payment link, then onboard your first connected account.

Everything on this page runs in [test mode](/guides/get-started/api-authentication/test-mode/index.md), so no real money moves. Steps that differ have a **Dashboard** tab and an **API** tab; pick one and stay with it, or mix them. To compare the Dashboard, Drops, Moov.js, and the API, see [integration options](/guides/get-started/integration-options/index.md). The [glossary](/guides/developer-tools/glossary/index.md) defines terms like account, payment method, and transfer.

## Sign up for Moov

[Sign up](https://dashboard.moov.io/signup) in the Moov Dashboard. You need Moov administrator or developer permissions for the steps on this page. After you sign up, you can sign in with a passkey from your browser, password manager, phone, or a USB security key.

You start in test mode. Your test account comes with sample accounts and data, and every [capability](/guides/accounts/capabilities/index.md) is already enabled, so you can take payments right away.

**You're ready when** the account switcher in the top left of the Dashboard shows your test account.

![Toggle for test account in Moov Dashboard](../../shared-images/mode-toggle.png)

## Create an API key

Skip this step if you're only using the Dashboard.

In the Dashboard, go to **Developers** and click **New API key**. Test mode and production mode each have their own keys.

1. Name the key after what it's for.
2. Copy the public key and secret key and store them somewhere secure. You can't view the secret key again.
3. Add the domains you'll call the API from. You can skip this for now; server-side calls with Basic authentication don't need it.

[*Video: create api keys*](https://docs.moov.io/guides/shared-images/create-api-keys.mp4)

Make your first call. The API examples on this page use Basic authentication from your terminal (`-u "{publicKey}:{secretKey}"`). List the accounts connected to your test account with the list accounts [endpoint](/api/moov-accounts/accounts/list/index.md):

```zsh
curl -X GET "https://api.moov.io/accounts" \
  -u "{publicKey}:{secretKey}" \
  -H "X-Moov-Version: v2026.07.00"
```

**You're ready when** the response is a `200` with a list of sample accounts. A `401` means the key pair is wrong. Before you call the API from a browser or mobile app, read [authenticate API requests](/guides/get-started/api-authentication/authentication/index.md) to set up access tokens.

You also need your partner account ID for API calls. In the Dashboard, open **Settings**; the ID appears below your account name and logo.

## Create a payment link

A [payment link](/guides/accept-payments/payment-links/index.md) is a Moov-hosted checkout page, so you can take a payment without building any UI. For this first payment, your own test account is the merchant and the funds land in its Moov wallet.

**Dashboard**

1. Go to **Payment links** and click **New payment link**.
2. On the **Accept payment** tab, enter an amount, title, and description.
3. Leave **Card payments** selected and choose your wallet.
4. Create the link.

[*Video: create payment link*](https://docs.moov.io/guides/shared-images/create-payment-link.mp4)

**API**

A payment link pays into a wallet, so first get your wallet's payment method ID with the list payment methods [endpoint](/api/sources/payment-methods/list/index.md):

```zsh
curl -X GET "https://api.moov.io/accounts/{partnerAccountID}/payment-methods?paymentMethodType=moov-wallet" \
  -u "{publicKey}:{secretKey}" \
  -H "X-Moov-Version: v2026.07.00"
```

Save the `paymentMethodID`, then create the link with the create payment link [endpoint](/api/money-movement/payment-links/create/index.md). Amounts are in cents, so `2500` is $25.00.

```zsh
curl -X POST "https://api.moov.io/accounts/{partnerAccountID}/payment-links" \
  -u "{publicKey}:{secretKey}" \
  -H "X-Moov-Version: v2026.07.00" \
  -d '{
    "partnerAccountID": "{partnerAccountID}",
    "merchantPaymentMethodID": "{walletPaymentMethodID}",
    "amount": { "currency": "USD", "value": 2500 },
    "display": {
      "title": "Whole Body Fitness",
      "description": "Drop-in class",
      "callToAction": "pay"
    },
    "payment": { "allowedMethods": ["card-payment"] }
  }'
```

**You're ready when** you have a link in the form `https://moov.link/p/{code}`. In the API response, it's the `link` field, and `status` is `active`.

## Pay with a test card

Open the link in your browser and pay with a test card:

| Field       | Value                           |
|-------------|---------------------------------|
| Card number | `4111111111111111` (Visa debit) |
| Expiration  | Any future date                 |
| CVV         | `111`                           |
| Postal code | `11111`                         |

**You're ready when** the checkout page confirms the payment. To test a decline, pay a new link with a [declined test card](/guides/get-started/api-authentication/test-mode/index.md#declined-card-transfers). The [test mode](/guides/get-started/api-authentication/test-mode/index.md#test-mode-data) guide lists every test card and trigger amount.

## Confirm the payment

Paying the link created a card transfer from the test card to your wallet.

**Dashboard**

Go to **Transfers**. The new transfer is at the top of the list; open it to see the card, the amount, and its status.

**API**

List the transfers created by the link with the list transfers [endpoint](/api/money-movement/transfers/list/index.md), filtering by the link's `code`:

```zsh
curl -X GET "https://api.moov.io/accounts/{partnerAccountID}/transfers?paymentLinkCode={code}" \
  -u "{publicKey}:{secretKey}" \
  -H "X-Moov-Version: v2026.07.00"
```

**You're done when** the transfer shows `source.cardDetails.status` `confirmed`, meaning the issuer approved the charge. The transfer `status` changes to `completed` when the funds settle to your wallet. In production, subscribe to [webhooks](/guides/webhooks/index.md) such as `transfer.updated` instead of polling.

## Onboard a connected account

Your platform takes payments on behalf of other businesses, so the next step is to onboard one. [Hosted onboarding](/guides/accounts/hosted-onboarding/index.md) sends the account owner a link to a secure, branded page where they enter their own details, link a bank account, and accept Moov's [platform agreement](/guides/accounts/requirements/platform-agreement/index.md) and your fee plan. Their personal information goes straight to Moov, so you don't store it.

Before you create the link, decide:

- **Capabilities**: what the account can do, such as `collect-funds.card-payments` and `wallet.balance` to accept cards. Request only what the account needs, because each capability adds verification [requirements](/guides/accounts/capabilities/reference/index.md). See [capabilities](/guides/accounts/capabilities/index.md).
- **Scopes**: what you and the account can do on each other's behalf. See [connected accounts](/guides/accounts/connections/index.md#scopes).
- **Fee plan**: the pricing the account agrees to. See [plan options](/guides/billing/plan-options/index.md). With the API, list your plans with the list fee plans [endpoint](/api/moov-accounts/billing/list-plans/index.md) and pass the plan's `planID` in `feePlanCodes`.

**Dashboard**

Go to **Accounts &gt; Onboarding links** and create a new onboarding link. Choose capabilities, select **Edit scopes** if you need scopes other than the preselected ones, and pick a fee plan. Then send the link by email or SMS.

[*Video: create onboarding link*](https://docs.moov.io/guides/get-started/quick-start/images/create-onboarding-link.mp4)

**API**

Create the link with the create onboarding invite [endpoint](/api/moov-accounts/onboarding/post/index.md), prefilling any details you have. `scopes` are the scopes your partner account gets on the new account; `grantScopes` are the scopes the new account gets.

```zsh
curl -X POST "https://api.moov.io/onboarding-invites" \
  -u "{publicKey}:{secretKey}" \
  -H "X-Moov-Version: v2026.07.00" \
  -d '{
    "returnURL": "https://mycompany.com/account",
    "termsOfServiceURL": "https://mycompany.com/terms-of-service",
    "scopes": ["accounts.read", "capabilities.read", "transfers.read", "transfers.write"],
    "grantScopes": ["accounts.read", "capabilities.read", "transfers.read", "transfers.write"],
    "capabilities": ["collect-funds.card-payments", "wallet.balance"],
    "feePlanCodes": ["b6134307-8922-4a72-bf3c-d0297bbe8a35"],
    "prefill": {
      "accountType": "business",
      "profile": {
        "business": {
          "legalBusinessName": "Whole Body Fitness LLC",
          "businessType": "llc",
          "email": "amanda@wbfgym.dev"
        }
      }
    }
  }'
```

Send the `link` from the response by email or SMS. Track it with the get onboarding invite [endpoint](/api/moov-accounts/onboarding/get/index.md) (`GET /onboarding-invites/{code}`); a `redeemedOn` timestamp means the account owner used it.

![Merchant onboarding flow](../../shared-images/onboarding-form.png)

**You're done when** the new account's capabilities show `status: enabled`, in the account's page in the Dashboard or with the list capabilities [endpoint](/api/moov-accounts/capabilities/list/index.md). To take a payment for the new account, repeat steps 3 to 5 with its account ID and wallet.

To onboard accounts inside your own app instead of sending a link, use the [onboarding Drop](/moovjs/drops/onboarding/index.md). See [create accounts](/guides/accounts/create-accounts/index.md) to compare every onboarding method.

## Fix onboarding errors

If an account doesn't finish onboarding, or verification needs more information, the Dashboard shows a banner on the account's page. Send the account a [resolution link](/guides/accounts/resolution-links/index.md), a temporary, secure link where they can correct or add the information needed to enable the capability.

**Dashboard**

Create a resolution link directly from the banner on the account's page.

![Alert for due items in Dashboard](../../shared-images/dashboard-resolution-alert.png)

**API**

Use the create resolution link [endpoint](/api/moov-accounts/resolution-links/create/index.md).

```zsh
curl -X POST "https://api.moov.io/accounts/{accountID}/resolution-links" \
  -u "{publicKey}:{secretKey}" \
  -H "X-Moov-Version: v2026.07.00" \
  -d '{ "recipient": { "email": "amanda@wbfgym.dev" } }'
```

## Troubleshoot

| Problem                                                 | Likely cause                                                                                   | Fix                                                                                                                                                           |
|---------------------------------------------------------|------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------|
| `401` on any API call                                   | Wrong public or secret key, or a production key used with test data                            | Check the key pair in **Developers**; see [common authentication errors](/guides/get-started/api-authentication/authentication/index.md#common-authentication-errors) |
| Payment link creation fails                             | `merchantPaymentMethodID` isn't a `moov-wallet` payment method                                 | List payment methods with `paymentMethodType=moov-wallet` and use that ID                                                                                     |
| A connected account's payment link or transfer fails    | Its [capabilities](/guides/accounts/capabilities/index.md) aren't enabled yet                          | Check its capabilities and send a resolution link for anything due                                                                                            |
| Account can't use wallets, send funds, or collect funds | It hasn't accepted the [platform agreement](/guides/accounts/requirements/platform-agreement/index.md) | Have the account owner finish hosted onboarding, or collect acceptance with the [terms of service Drop](/moovjs/drops/terms-of-service/index.md)                      |

## Next steps

- [Plan your integration](/guides/get-started/plan-your-integration/index.md): Answer a few questions about your use case and stack, and download an integration plan tailored to you.
- [Recipes](/guides/get-started/recipes/index.md): End-to-end API walkthroughs: card payments, bank payouts, wallets, webhooks, and refunds.
- [Customize payment links](/guides/accept-payments/payment-links/index.md): Add products, tax, surcharges, tips, and your brand colors to the checkout page.
- [Webhooks](/guides/webhooks/index.md): Get transfer and capability updates pushed to your server instead of polling.
- [Go live](/guides/go-live/launch-checklist/index.md): Work through the launch checklist when you're ready to move real money.

