Quick start
Everything on this page runs in test mode, 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. The glossary defines terms like account, payment method, and transfer.
Sign up for Moov
Sign up 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 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.

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.
- Name the key after what it's for.
- Copy the public key and secret key and store them somewhere secure. You can't view the secret key again.
- 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.
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:
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 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 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.
- Go to Payment links and click New payment link.
- On the Accept payment tab, enter an amount, title, and description.
- Leave Card payments selected and choose your wallet.
- Create the link.
A payment link pays into a wallet, so first get your wallet's payment method ID with the list payment methods endpoint:
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. Amounts are in cents, so 2500 is $25.00.
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. The test mode 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.
List the transfers created by the link with the list transfers endpoint, filtering by the link's code:
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 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 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 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-paymentsandwallet.balanceto accept cards. Request only what the account needs, because each capability adds verification requirements. See capabilities. - Scopes: what you and the account can do on each other's behalf. See connected accounts.
- Fee plan: the pricing the account agrees to. See plan options. With the API, list your plans with the list fee plans endpoint and pass the plan's
planIDinfeePlanCodes.
Go to Accounts > 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.
Create the link with the create onboarding invite endpoint, 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.
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 (GET /onboarding-invites/{code}); a redeemedOn timestamp means the account owner used it.

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. 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. See create accounts 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, a temporary, secure link where they can correct or add the information needed to enable the capability.
Create a resolution link directly from the banner on the account's page.

Use the create resolution link endpoint.
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 |
| 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 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 | Have the account owner finish hosted onboarding, or collect acceptance with the terms of service Drop |
Next steps
Answer a few questions about your use case and stack, and download an integration plan tailored to you.
End-to-end API walkthroughs: card payments, bank payouts, wallets, webhooks, and refunds.
Add products, tax, surcharges, tips, and your brand colors to the checkout page.
Get transfer and capability updates pushed to your server instead of polling.
Work through the launch checklist when you're ready to move real money.