Platform terms of service agreement
transfers must accept Moov's platform agreement before it can be used in a transfer. You collect the acceptance in your app and send it to Moov on the account.
Your app must display links to Moov's privacy policy and platform agreement, and the user must accept them. Choose how to record the acceptance:
| Method | How it works | Availability |
|---|---|---|
| Hosted onboarding | The onboarding form collects acceptance; nothing else to send | Everyone (simplest) |
| Terms of service Drop | Pre-built UI that shows the terms and generates a token | Everyone (recommended) |
| Moov.js methods | Accept the terms or get a token in your own UI | Everyone |
| Terms of service token | Get a token from the API and send it on the account | Approved partners only |
| Manual entry | Send the acceptance date, IP, user agent, and domain | Approved partners only |
Tokens are generated client-side, so authenticate your application first.
To confirm acceptance, check that account.tos-acceptance no longer appears in the account's capability requirements.currentlyDue.
Terms of service Drop
Moov.js is a browser client that collects PII data so you don’t have to be responsible for handling and storing sensitive customer information.
Moov.js provides a pre-built terms of service Drop. With the pre-built user interface, you can integrate our privacy policy and terms of service while simultaneously generating a token in the background. The token can be patched to an account using the accounts PATCH endpoint.
Alternate Moov.js implementation
Moov.js can also accept the terms and update the account in one call (moov.accounts.acceptTermsOfService), or just generate a token (moov.accounts.getTermsOfServiceToken). See platform terms of service agreement in the Moov.js reference.
API implementation
400 error.
To confirm the platform terms of service agreement acceptance via the API, you must send either a token, or enter the acceptance manually. You can provide this information when creating an account, or by updating an existing account. For server-side integrations, Moov recommends the manual method.
Terms of service token
You can retrieve and send the token when creating an account, or you can update the account after it's been created.
To send Moov the terms of service token, retrieve the token with the terms of service GET endpoint. Use the account POST endpoint to send the token when creating an account, or use the PATCH endpoint when updating an account.
# Get the terms of service token
curl -X GET "https://api.moov.io/tos-token" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2026.07.00"
# Send the token when creating an account
curl -X POST "https://api.moov.io/accounts" \
# ...
--data-raw '{
"accountType": "account-type",
"profile": {...},
"termsOfService": {
"token": "terms-of-service-token"
},
"foreignID": "unique-correlation-id"
}'
# Get the terms of service token
curl -X GET "https://api.moov.io/tos-token" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2026.07.00"
# Send the token when patching the account
curl -X PATCH "https://api.moov.io/accounts/{accountID}" \
# ...
--data-raw '{
"termsOfService": {
"token": "terms-of-service-token"
},
"foreignID": "unique-correlation-id"
}'
Manual entry
You'll need to capture a date-time, IP address, user agent and domain to manually enter a terms of service agreement. For manual entry when creating an account, use the create account POST endpoint. For manual entry when updating an account, use the patch account PATCH endpoint.
curl -X POST "https://api.moov.io/accounts" \
# ...
--data-raw '{
"accountType": "your-account-type",
"profile": {...},
"termsOfService": {
"manual": {
"acceptedDate": "accepted-date",
"acceptedIP": "accepted-ip",
"acceptedUserAgent": "accepted-user-agent",
"acceptedDomain": "accepted-domain"
}
},
"foreignID": "unique-correlation-id"
}'
curl -X PATCH "https://api.moov.io/accounts/{accountID}" \
-H "Authorization: Bearer {token}" \
-H "x-moov-version: v2026.07.00" \
--data-raw '{
"termsOfService": {
"manual": {
"acceptedDate": "accepted-date",
"acceptedIP": "accepted-ip",
"acceptedUserAgent": "accepted-user-agent",
"acceptedDomain": "accepted-domain"
}
},
"foreignID": "unique-correlation-id"
}'