Register individual profile
Learn how to create an individual user profile, the foundational step for onboarding a new user. Understand this initial process of registering an individual on the platform before proceeding with identity verification.
Use Cases
- You want to onboard an individual user who is a natural person, not a business or corporate entity.
- You want to onboard an individual user who will use an account for personal purposes.
- You want to onboard an individual user who is a single employee, contractor, or affiliate of a corporate entity.
Prerequisites
- Before starting to collect individual user information from your customers, refer to the User Protection Guidelines, which all platform consumers and partners must follow and adhere to with regard to securing customer data.
- You will need to collect the user information from the individual customer. This activity must be accomplished before calling the first API in the onboarding workflow. Information can be collected in-app from the partner's mobile or web application.
Individual User data
The data that needs to be collected from the customer can be broken down into these groups:
- API mandatory (minimum) user details — are the vital identity information necessary to create a user in the system.
- User demographic information — includes additional statistics and location details for users.
API Workflow (v1)
1
Create an individual user profile in the program (segmented)
You have the option to gradually collect user information through a segmented profile form to lower onboarding friction and improve sign-up conversion.
You can call the Create User (POST /users) to create a user by passing the API mandatory (minimal) information first:
Create User request passing only the API mandatory (minimal) information
curl --location --request POST 'https://{{identity_base_url}}/{{program_code}}/v1/users' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: ••••••' \
--data-urlencode 'first_name="John"' \
--data-urlencode 'last_name="Smith"' \
--data-urlencode 'mobile_country_code="65"'\
-—data-urlencode 'mobile="999999999"' \
--data-urlencode 'preferred_name="John Smith"'\
--data-urlencode 'email="john.smith@matchmove.com"'\
--data-urlencode 'password="p@ssw0rd"'\
--data-urlencode 'nationality="Singaporean"'Create User response (minimal information provided)
{
"id": "cd896adb395fa384a5a8b174a007c34c",
"email": "john.smith@matchmove.com",
"name": {
"first": "John",
"middle": null,
"last": "Smith",
"preferred": "John Smith"
},
"nature_of_business": "",
"purpose_of_account": "",
"mobile": {
"country_code": "65",
"number": "99999999"
},
"nationality": "Singaporean",
"countryofissue": null,
"country_of_issue": null,
"country_code_of_issue": null,
"identification": {
"type": "",
"number": "",
"issue": null,
"expiry": null
},
"alt_id_countryofissue": null,
"alt_id_country_code_of_issue": null,
"alt_identification": {
"type": "",
"number": null,
"issue": null,
"expiry": null
},
"birthday": null,
"place_of_birth": null,
"gender": null,
"title": "",
"marital_status": null,
"mothers_maiden_name": null,
"mothers_first_name": null,
"mothers_last_name": null,
"customer_id": null,
"links": [
{
"rel": "users.wallets",
"href": "https://beta-api.mmvpay.com/{{program_code}}/v1/users/wallets",
"method": "GET"
}
],
"status": {
"is_active": false,
"text": "inactive",
"state": "pending"
},
"date": {
"registration": "2025-07-22T16:05:52+08:00"
},
"partner_id": null,
"agent_id": null,
"client_reference_id": null,
"customer_bank_reference": null,
"employer_name": null,
"employment_type": null,
"source_of_funds": null,
"occupation": null,
"volume_of_assets": null,
"account_type": "individual",
"risk_assessment_status": "UNKNOWN"
}Create User API-required fields enumerations:
mobile_country_codeallowed values are listed in the Mobile Country Code Enumeration (GET /users/enumerations/mobile_country_code).nationalityallowed values are listed in the Nationality Enumeration (GET /users/enumerations/nationalities).marital_statusallowed values are listed in the Marital Status Enumeration (GET /users/enumerations/marital_status).genderallowed values are listed in the Genders Enumeration (GET /users/enumerations/genders).country_code_of_issueallowed values are listed in the Countries Enumeration (GET /users/enumerations/countries). Use the country code.country_of_issueallowed values are listed in the Countries Enumeration (GET /users/enumerations/countries). Use the country description.titleallowed values are listed in the Titles Enumeration (GET /users/enumerations/titles).id_typeallowed values are listed in the ID Types Enumeration (GET /users/enumerations/id_types).
*These enumerations are all part of the Identity API category; you can access them by using the {{identity_base_url}} . See Utilize Enumerations section to learn more.
Other field notes:
preferred_nameis usually the (First Name + Last Name), which will be used as the default cardholder name for card programs. For non-card programs, we can just pass the same, just to satisfy the API requirement.passwordis the password used for the direct B2C products of MatchMove. Due to backwards compatibility, this field has been maintained as an API requirement. As such, any dummy password that satisfies the field requirement may be passed.
User identifier as a partner foreign key
When a new individual user is created, a user identifier (user.id) will be generated. In the example above, the user identifier will be the "id": "cd896adb395fa384a5a8b174a007c34c".
It is recommended that you store this MatchMove user identifier in your internal database and map it with your users. This user identifier will be heavily used in most post-user creation API, and it will be convenient for you to have it accessible.
2
Add additional required user information (segmented)
When the user has already signed up and can log in to your application, you can ask them to complete their user profile to gain access to your services.
Call the Update User (PUT /users) to update the user profile with their demographic information.
Update User-restricted fields:
first_namemiddle_name(optional)last_namepreferred_name
Updates to the following fields are not allowed when:
- The user is already KYC
approved - The user status is already
active - The user has already been issued an account/wallet.
Update User request passing the user's demographic information
curl --location --request PUT 'https: //{{identity_base_url}}/{{program_code}}/v1/users' \
--header 'X-Auth-User-ID: {{user_id}}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: ••••••' \
--data-urlencode 'gender=male' \
--data-urlencode 'title=Mr' \
--data-urlencode 'birthday=1990-09-16' \
--data-urlencode 'id_type=passport' \
--data-urlencode 'id_number=S1234546D' \
--data-urlencode 'country_of_issue=Singapore' \
--data-urlencode 'nationality=Singaporean' \
--data-urlencode 'id_expiry_date=2029-09-16' \
--data-urlencode 'id_date_issue=2024-01-01'Update User response (demographic information)
{
"id": "cd896adb395fa384a5a8b174a007c34c",
"email": "johnsmith@matchmove.com",
"name": {
"first": "John",
"middle": null,
"last": "Smith",
"preferred": "John Smith"
},
"nature_of_business": "",
"purpose_of_account": "",
"mobile": {
"country_code": "65",
"number": "99999999"
},
"nationality": "Singaporean",
"countryofissue": "Singapore",
"country_of_issue": "Singapore",
"country_code_of_issue": "SGP",
"identification": {
"type": "passport",
"number": "S1234546D",
"issue": "2024-01-01T00:00:00+08:00",
"expiry": "2029-09-16T00:00:00+08:00"
},
"alt_id_countryofissue": null,
"alt_id_country_code_of_issue": null,
"alt_identification": {
"type": "",
"number": null,
"issue": null,
"expiry": null
},
"birthday": "1990-09-16",
"place_of_birth": null,
"gender": "male",
"title": "Mr",
"marital_status": null,
"mothers_maiden_name": null,
"mothers_first_name": null,
"mothers_last_name": null,
"customer_id": null,
"links": [
{
"rel": "users.wallets",
"href": "https://{{server}}/{{program_code}}/v1/users/wallets",
"method": "GET"
}
],
"status": {
"is_active": false,
"text": "inactive",
"state": "pending"
},
"date": {
"registration": "2025-06-04T16:13:37+08:00"
},
"partner_id": null,
"agent_id": null,
"client_reference_id": null,
"customer_bank_reference": null,
"employer_name": null,
"employment_type": null,
"source_of_funds": null,
"occupation": null,
"volume_of_assets": null,
"account_type": "individual",
"risk_assessment_status": "CLEARED"
}3
[Alternative] Create an individual user profile in the program (complete)
If onboarding friction is not an issue, partners can also onboard and create a user in one go, passing both the mandatory (minimal) and demographic information.
Create User request passing all required information
curl --location --request POST 'https://{{identity_base_url}}/{{program_code}}/v1/users' \
--header 'Content-Type: application/x-www-form-urlencoded' \--header 'Authorization: ••••••' \
--data-urlencode 'first_name="John"' \
--data-urlencode 'last_name="Smith"' \
--data-urlencode 'mobile_country_code="65"'\
--data-urlencode 'mobile="999999999"' \
--data-urlencode 'preferred_name="John Smith"'\
--data-urlencode 'email="john.smith@matchmove.com"'\
--data-urlencode 'password="p@ssw0rd"'\
--data-urlencode 'nationality="Singaporean"' \
--data-urlencode 'gender=male' \
--data-urlencode 'title=Mr' \
--data-urlencode 'birthday=1990-09-16' \
--data-urlencode 'id_type=passport' \
--data-urlencode 'id_number=S1234546D' \
--data-urlencode 'country_of_issue=Singapore' \
--data-urlencode 'nationality=Singaporean' \
--data-urlencode 'id_expiry_date=2029-09-16'
--data-urlencode 'id_date_issue=2024-01-01'Create User response (all required information)
{
"id": "cd896adb395fa384a5a8b174a007c34c",
"email": "johnsmith@matchmove.com",
"name": {
"first": "John",
"middle": null,
"last": "Smith",
"preferred": "John Smith"
},
"nature_of_business": "",
"purpose_of_account": "",
"mobile": {
"country_code": "65",
"number": "99999999"
},
"nationality": "Singaporean",
"countryofissue": "Singapore",
"country_of_issue": "Singapore",
"country_code_of_issue": "SGP",
"identification": {
"type": "passport",
"number": "S1234546D",
"issue": "2024-01-01T00:00:00+08:00",
"expiry": "2029-09-16T00:00:00+08:00"
},
"alt_id_countryofissue": null,
"alt_id_country_code_of_issue": null,
"alt_identification": {
"type": "",
"number": null,
"issue": null,
"expiry": null
},
"birthday": "1990-09-16",
"place_of_birth": null,
"gender": "male",
"title": "Mr",
"marital_status": null,
"mothers_maiden_name": null,
"mothers_first_name": null,
"mothers_last_name": null,
"customer_id": null,
"links": [
{
"rel": "users.wallets",
"href": "https://{{server}}/{{program_code}}/v1/users/wallets",
"method": "GET"
}
],
"status": {
"is_active": true,
"text": "active",
"state": "active"
},
"date": {
"registration": "2025-06-04T16:13:37+08:00"
},
"partner_id": null,
"agent_id": null,
"client_reference_id": null,
"customer_bank_reference": null,
"employer_name": null,
"employment_type": null,
"source_of_funds": null,
"occupation": null,
"volume_of_assets": null,
"account_type": "individual",
"risk_assessment_status": "CLEARED"4
Submit the residential and billing addresses of the user
The residential and billing addresses of an individual user are vital information that will be considered during the full KYC verification of the user. The residential address determines the regulatory requirements that will be applied to the user, while the billing address will be the reference for card ordering and delivery processes.
Call the Update User Addresses (PUT /users/addresses/residential) to update the user profile with their residential addresses.
Update User Addresses request (residential)
curl --location --request PUT 'https://{{identity_base_url}}/{{program_code}}/v1/users/addresses/residential' \
--header 'X-Auth-User-ID: {{user_id}}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: ••••••' \
--data-urlencode 'address_1=50' \
--data-urlencode 'address_2=Sunrise St' \
--data-urlencode 'city=01-01' \
--data-urlencode 'state=Singapore' \
--data-urlencode 'country=Singapore' \
--data-urlencode 'country_code=SGP' \
--data-urlencode 'zipcode=399999'Update User Addresses response (residential)
{
"residential": {
"address_1": "50",
"address_2": "Sunrise St",
"city": "01-01",
"country": "Singapore",
"country_code": "SGP",
"state": "Singapore",
"zipcode": "399999"
}
}Call the Update User Addresses (PUT /users/addresses/billing) to update the user profile with their billing addresses. The billing address can be the same as the residential address.
Update User Addresses request (billing)
curl --location --request PUT 'https://{{identity_base_url}}/{{program_code}}/v1/users/addresses/billing' \
--header 'X-Auth-User-ID: {{user_id}}' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: ••••••' \
--data-urlencode 'address_1=50' \
--data-urlencode 'address_2=Sunrise St' \
--data-urlencode 'city=01-01' \
--data-urlencode 'state=Singapore' \
--data-urlencode 'country=Singapore' \
--data-urlencode 'country_code=SGP' \
--data-urlencode 'zipcode=399999'Update User Addresses response (billing)
{
"billing": {
"address_1": "50",
"address_2": "Sunrise St",
"city": "01-01",
"country": "Singapore",
"country_code": "SGP",
"state": "Singapore",
"zipcode": "399999"
}
}5
Display the customer profile details for the user
Call the Get User (GET /user) to retrieve the active user profile and details.
Get User request
curl --location 'https://{{identity_base_url}}/{{program_code}}/v1/users' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--header 'Authorization: Basic ••••••' \
--data-urlencode 'id={{user_id}}'Get User response
{
"id": "cd896adb395fa384a5a8b174a007c34c",
"email": "john.smith@matchmove.com",
"name": {
"first": "John",
"middle": null,
"last": "Smith",
"preferred": "John Smith"
},
"nature_of_business": "",
"purpose_of_account": "",
"mobile": {
"country_code": "65",
"number": "99999999"
},
"nationality": "Singaporean",
"countryofissue": "Singapore",
"country_of_issue": "Singapore",
"country_code_of_issue": "SGP",
"identification": {
"type": "passport",
"number": "S1234546D",
"issue": "2024-01-01T00:00:00+08:00",
"expiry": "2029-09-16T00:00:00+08:00"
},
"alt_id_countryofissue": null,
"alt_id_country_code_of_issue": null,
"alt_identification": {
"type": "",
"number": null,
"issue": null,
"expiry": null
},
"birthday": "1990-09-16",
"place_of_birth": null,
"gender": "male",
"title": "Mr",
"marital_status": null,
"mothers_maiden_name": null,
"mothers_first_name": null,
"mothers_last_name": null,
"customer_id": null,
"links": [
{
"rel": "users.wallets",
"href": "https://beta-api.mmvpay.com/<product-code>/v1/users/wallets",
"method": "GET"
}
],
"status": {
"is_active": true,
"text": "active",
"state": "active"
},
"date": {
"registration": "2025-06-04T16:13:37+08:00"
},
"partner_id": null,
"agent_id": null,
"client_reference_id": null,
"customer_bank_reference": null,
"employer_name": null,
"employment_type": null,
"source_of_funds": null,
"occupation": null,
"volume_of_assets": null,
"account_type": "individual",Related Links
On this page
- Register individual profile