Skip to main content

KYC / AML / KYB

info

This is only applicable for Programs with the KYC / AML or KYB features enabled.

The Figure Pay Core Banking API offers the ability to perform the required KYC / AML and KYB banking regulatory and compliance checks necessary to open accounts for your end users.

Register a Personal Profile

Profiles created by KYC-enabled Programs must pass KYC / AML checks prior to opening an account, applying for a card, and other functionality that the Figure Pay Banking API exposes.

At a minimum a profile must contain the following fields when it is created so it can be used for KYC / AML checks.

  • email
  • name
  • dob (Date of Birth)
  • phone_number
  • address
  • tax_id
POST /profiles

{
"type": "PERSONAL",
"email": "john.h.doe@example.com",
"name": {
"prefix": "Dr.",
"first_name": "John",
"middle_name": "Henry",
"last_name": "Doe",
"suffix": "Jr."
},
"dob": "1980-01-01",
"phone_number": {
"number": "5555555555",
"type": "HOME"
},
"address": {
"city": "Alexandria",
"state": "VA",
"street1": "42-2630 Hegal Place",
"street2": "Apt 2",
"zip": "22331",
"country": "USA"
},
"tax_id": {
"id_number": "555555555",
"id_type": "SSN"
}
}

Response:

{
"id": "a4ae438c-31e0-40b0-af7a-fd5e57f41f2d",
"created_dt": "2022-07-27T19:58:53.967295Z",
"updated_dt": "2022-07-27T19:58:53.967304Z",
"type": "PERSONAL",
"program_id": "e73fdc55-04b3-4931-aff2-db510f0eb252",
"email": "john.h.doe@example.com",
"name": {
"first_name": "John",
"last_name": "Doe",
"middle_name": "Henry",
"prefix": "Dr.",
"suffix": "Jr."
},
"dob": "1980-01-01",
"username": null,
"phone_number": {
"number": "5555555555",
"type": "UNKNOWN",
"extension": ""
},
"address": {
"street1": "42-2630 Hegal Place",
"street2": "Apt 2",
"city": "Alexandria",
"state": "VA",
"zip": "22331",
"country": "USA"
},
"shipping_address": null,
"tax_id": {
"has_id_number": true,
"id_type": "SSN"
},
"status": "ONBOARDING",
"business_info": null
}

Register a Business Profile

Business profiles created by KYB-enabled Programs must pass KYB checks prior to opening an account and other functionality that the Figure Pay Banking API exposes.

At a minimum a profile must contain the following fields when it is created so it can be used for KYB checks.

  • email
  • name
  • dob (Date of Birth)
  • phone_number
  • address
  • tax_id
POST /profiles

{
"type": "BUSINESS",
"email": "john.h.doe@example.com",
"name": {
"prefix": "Dr.",
"first_name": "John",
"middle_name": "Henry",
"last_name": "Doe",
"suffix": "Jr."
},
"dob": "1980-01-01",
"phone_number": {
"number": "5555555555",
"type": "HOME"
},
"address": {
"city": "Alexandria",
"state": "VA",
"street1": "42-2630 Hegal Place",
"street2": "Apt 2",
"zip": "22331",
"country": "USA"
},
"tax_id": {
"id_number": "555555555",
"id_type": "SSN"
},
"business_info": {
"business_name": "ShopRite",
"business_ein": "123456789",
"business_address":
{
"street1": "123 Main Street",
"city": "City",
"state": "AL",
"zip": "68164",
"country": "USA",
"type": "BUSINESS"
},
"business_structure": "CORPORATION"
}
}

Response:

{
"id": "a4ae438c-31e0-40b0-af7a-fd5e57f41f2d",
"created_dt": "2022-07-27T19:58:53.967295Z",
"updated_dt": "2022-07-27T19:58:53.967304Z",
"type": "BUSINESS",
"program_id": "e73fdc55-04b3-4931-aff2-db510f0eb252",
"email": "john.h.doe@example.com",
"name": {
"first_name": "John",
"last_name": "Doe",
"middle_name": "Henry",
"prefix": "Dr.",
"suffix": "Jr."
},
"dob": "1980-01-01",
"username": null,
"phone_number": {
"number": "5555555555",
"type": "UNKNOWN",
"extension": ""
},
"address": {
"street1": "42-2630 Hegal Place",
"street2": "Apt 2",
"city": "Alexandria",
"state": "VA",
"zip": "22331",
"country": "USA"
},
"shipping_address": null,
"tax_id": {
"has_id_number": true,
"id_type": "SSN"
},
"status": "ONBOARDING",
"business_info": {
"business_name": "ShopRite",
"business_ein": "123456789",
"business_address":
{
"street1": "123 Main Street",
"city": "City",
"state": "AL",
"zip": "68164",
"country": "USA",
"type": "BUSINESS"
},
"business_structure": "CORPORATION"
}
}

Sandbox Environment Test Last Names

The sandbox environment supports special last names that will pass or fail KYC / AML checks. This can be used to quickly test that your application can handle both passing and failing KYC / AML scenarios. These last name triggers are case-insensitive and will occur when your last name contains the special last name.

Approve KYC / AML Last Name

  • kycApprove
    • If the program is KYB-enabled, the profile will be set to the PENDING_KYB_APPROVAL status. Otherwise, it will be set to APPROVED.

Denied KYC / AML Last Name

  • kycDenyEmail
  • kycDenyUserPhoto

Uploading Profile's Identification

We also require a photo of the profile's government issued ID and a selfie. The following are acceptable identification that can be used for KYC / AML checks.

  • Driver's License
  • State ID
  • Passport

To upload a document for a profile, we first need to generate a document ID that can be used. The following document types are supported for a profile.

  • USER_PHOTO
  • STATE_ID_FRONT
  • STATE_ID_BACK
  • DRIVERS_LICENSE_FRONT
  • DRIVERS_LICENSE_BACK
  • PASSPORT
POST /profiles/:profile_id/documents

{
"type": "USER_PHOTO"
}

Response:

{
"id": "ae89eb47-4a57-47e6-8b75-4f78e502ac03",
"type": "USER_PHOTO",
"created_dt": "2022-07-27T21:08:19.991939Z",
"status": "PENDING"
}

Once we have the generated document ID we can upload the document. The body of the request should be a multipart/form-data with the file field containing the file you want to upload.

POST /documents/:document_id/upload


Content-Type: multipart/form-data; boundary="boundary"

--boundary
Content-Disposition: form-data; name="file"

[file bytes]

Response:

{
"id": "ae89eb47-4a57-47e6-8b75-4f78e502ac03",
"is_uploaded": true,
"type": "USER_PHOTO"
}

Initiating a KYC / AML Check

A KYC / AML check can be started once the profile has all the neccessary information and the identification is uploaded. When the KYC / AML check is started, we'll use the latest uploaded identification for that KYC / AML attempt.

There is no response body returned.

POST /profiles/:profile_id/kyc-aml

Response:

HTTP 200

KYC / AML Status Check

The status of a profile can be retrieved by calling GET with the profile ID.

GET /profiles/:profile_id

Response:

{
"id": "423d2f77-697a-4f1e-8d7a-3b3362917d7c",
"created_dt": "2022-01-07T15:52:23.442264-05:00",
"updated_dt": "2022-01-07T15:52:23.442264-05:00",
"type": "BUSINESS",
"program_id": "f8621cf6-7019-44ea-9b79-a2f513caf71e",
"email": "john.h.doe@example.com",
"name": {
"prefix": "Dr.",
"first_name": "John",
"middle_name": "Henry",
"last_name": "Doe",
"suffix": "Jr."
},
"dob": "1980-01-01",
"phone_number": {
"number": "5555555555",
"type": "HOME"
},
"address": {
"city": "Alexandria",
"state": "VA",
"street1": "42-2630 Hegal Place",
"street2": "Apt 2",
"zip": "22331",
"country": "USA"
},
"shipping_address": {
"city": "Alexandria",
"state": "VA",
"street1": "612 N St Asaph St",
"street2": "",
"zip": "22314",
"country": "USA"
},
"tax_id": {
"id_number": "555-55-5555",
"id_type": "SSN"
},
"status": "APPROVED",
"business_info": {
"business_name": "Acme Co",
"business_ein": "987654321",
"business_address": {
"city": "Alexandria",
"state": "VA",
"street1": "123 Rolling Lane",
"zip": "22331",
"country": "USA"
},
"business_structure": "CORPORATION"
}
}

If the status is set to ACTION_REQUIRED, then the user has to take corrective actions and retry the KYC / AML process. The cause of the ACTION_REQUIRED status can be found by calling GET kyc-aml with the profile ID.

If the status is set to PENDING_KYB_APPROVAL, then the profile has to be manually approved before moving to APPROVED.

GET /profiles/:profile_id/kyc-aml

Response:

{
"profile_id": "423d2f77-697a-4f1e-8d7a-3b3362917d7c",
"denial_reasons": [
{
"name": "NAME_INPUTTED_IMPROPERLY",
"message": "First and last name not properly inputted"
}
]
}