KYC & KYB
Know Your Customer (KYC) and Know Your Business (KYB) verification is mandatory for users who send funds through the PayItFast platform. PayItFast uses a tiered verification system with transaction limits that vary by jurisdiction. Verification is powered by Sumsub under the hood.
Prerequisite
Users must be created via the User Management endpoints before KYC or KYB can be submitted. Level 0 (basic) data is collected during account creation.
KYC Overview
Verification Levels
PayItFast uses a tiered KYC system. Each level unlocks progressively higher transaction limits.
| Level |
Name |
Requirements |
Purpose |
| Level 0 |
Basic KYC (Trial) |
First name, last name, DOB, country, email, phone, address |
Collected during account creation. Allows trial transactions. |
| Level 1 |
Standard KYC |
ID document, selfie, address verification, phone confirmation |
Enables standard transaction limits |
| Level 2 |
Enhanced KYC |
Proof of source of funds (PSoF), address proof |
Enables higher transaction limits |
Automatic Prompting
When transaction limits are exceeded, the API will return STANDARD_KYC_REQUIRED (Level 1 needed) or ENHANCED_KYC_REQUIRED (Level 2 needed) to indicate which verification tier is required.
KYC Statuses
| Status |
Description |
Retryable |
user_created |
Account established |
-- |
user_approved |
Basic screening clearance |
-- |
user_rejected |
Rejected by PayItFast |
-- |
user_manual_review |
Compliance team reviewing |
-- |
kyc_initiated |
Verification process started |
-- |
kyc_pending |
Documentation submitted, awaiting verification |
-- |
kyc_success |
User successfully verified |
-- |
kyc_failed |
Verification unsuccessful |
Yes |
kyc_manual_review |
Compliance reviewing submission |
Yes |
kyc_edd_pending |
Advanced verification initiated |
Yes |
kyc_rejected |
Permanently rejected |
No |
kyc_blocked |
Blocked status |
No |
kyc_expired |
Credentials expired during monitoring |
Yes |
Endpoints Overview
KYC Endpoints
POST
/v2/kyc/standard
Submit Standard KYC (Level 1)
POST
/v2/kyc/advanced
Submit Advanced KYC (Level 2)
POST
/v2/kyc/share/same-vendor
Share KYC via Sumsub token
POST
/v2/kyc/share/third-vendor
Share KYC from third-party provider
POST
/v2/kyc/share/add-docs
Submit additional KYC documents
GET
/v2/kyc/user
Get KYC status
KYB Endpoints
POST
/v2/kyb/standard
Submit Standard KYB (Level 1)
POST
/v2/kyb/advanced
Submit Advanced KYB (Level 2)
GET
/v2/kyb/user
Get KYB status
Submit Standard KYC (Level 1)
Initiate the Standard KYC verification flow for an individual user. This returns a redirect URL that opens the PayItFast KYC widget (powered by Sumsub), where the user completes country selection, document upload, liveness verification, and review.
POST
/v2/kyc/standard
Request Body
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
User email. Use @kycfailure.sandbox domain to simulate failure in sandbox. |
| redirectUrl |
string |
Required |
URL to redirect the user after KYC submission |
| firstName |
string |
Optional |
First name (pre-fills the KYC widget) |
| lastName |
string |
Optional |
Last name (pre-fills the KYC widget) |
| country |
string |
Optional |
Country code (pre-fills the KYC widget) |
Request Example
POST /v2/kyc/standard
Content-Type: application/json
Authorization: Basic <base64(username:password)>
{
"email": "john@example.com",
"redirectUrl": "https://www.yourapp.com/kyc-complete",
"firstName": "John",
"lastName": "Doe",
"country": "US"
}
Response
{
"redirectUrl": "https://pay-widget.payitfast.com/user/initiate-kyc?token=TOKEN",
"userId": "UX-1231231253213"
}
Response Fields
| Field |
Type |
Description |
| redirectUrl |
string |
URL to redirect the user to the KYC verification widget |
| userId |
string |
Unique user identifier |
Submit Advanced KYC (Level 2)
Initiate the Advanced (Enhanced) KYC verification flow for a user who has already passed Level 1. This is required when the user exceeds standard transaction limits. The user will be asked to provide proof of source of funds and address proof.
POST
/v2/kyc/advanced
Request Body
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
User email address |
| redirectUrl |
string |
Required |
URL to redirect the user after submission |
Request Example
POST /v2/kyc/advanced
Content-Type: application/json
Authorization: Basic <base64(username:password)>
{
"email": "john@example.com",
"redirectUrl": "https://www.yourapp.com/kyc-advanced-complete"
}
Response
{
"redirectUrl": "https://pay-widget.payitfast.com/user/initiate-advanced-kyc?token=TOKEN",
"userId": "UX-1231231253213"
}
Share KYC via Sumsub Token
For organizations with a tripartite Sumsub agreement. Transfers existing KYC data from your Sumsub account to PayItFast via a share token, allowing users to skip the verification widget entirely.
POST
/v2/kyc/share/same-vendor
Request Body
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
User email address |
| name |
string |
Required |
Full name of the user |
| token |
string |
Required |
Sumsub share token (see below for how to obtain) |
Obtaining the Sumsub Share Token
Call the Sumsub API to generate a share token for an existing applicant:
curl --request POST \
'https://api.sumsub.com/resources/accessTokens/-/shareToken?applicantId={{sumsubApplicantId}}&forClientId=payitfast.com_123'
Request Example
POST /v2/kyc/share/same-vendor
Content-Type: application/json
Authorization: Basic <base64(username:password)>
{
"email": "john@doe.com",
"name": "John Doe",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
}
Response
{
"email": "john@doe.com",
"status": "kyc_success",
"userId": "UX-1201923942",
"userName": "John Doe"
}
Error Responses
| HTTP Status |
Error Code |
Description |
422 |
INVALID_TOKEN_DETAILS |
Email or phone does not match the share token data |
422 |
TOKEN_DATA_INCOMPLETE |
Required KYC information is missing from the token |
400 |
KYC_IMPORT_FAILED |
Invalid token format |
Share KYC from Third-Party Provider
For partners using a non-Sumsub KYC provider. Submit identity documents directly via a multipart form upload. The documents will be reviewed by the compliance team.
POST
/v2/kyc/share/third-vendor
Content Type
This endpoint requires Content-Type: multipart/form-data since it accepts file uploads.
Request Body (multipart/form-data)
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
User email |
| userId |
string |
Required |
Customer unique ID |
| firstName |
string |
Required |
Given name |
| lastName |
string |
Required |
Family name |
| gender |
string |
Required |
"male" or "female" |
| dob |
string |
Required |
Date of birth (YYYY-MM-DD) |
| phoneNo |
string |
Required |
Phone with +countryCode prefix (e.g. +12125551234) |
| country |
string |
Required |
Residence country (ISO 3166-1 alpha-2) |
| nationality |
string |
Required |
Citizenship (ISO 3166-1 alpha-2) |
| street |
string |
Required |
Street address |
| city |
string |
Required |
City |
| state |
string |
Required |
State / Province |
| postalCode |
string |
Required |
Postal code |
| idDocType |
string |
Required |
"passport", "id_card", or "drivers" |
| idDocFrontSide |
binary |
Required |
Front side of ID document (image file) |
| idDocBackSide |
binary |
Required |
Back side of ID document (image file) |
| idDocIssuerCountry |
string |
Required |
Document issuing country (ISO 3166-1 alpha-2) |
| idDocExpiryDate |
string |
Required |
Document expiry date (YYYY-MM-DD) |
| idDocUserName |
string |
Required |
Name as printed on the document |
| selfie |
binary |
Required |
User photograph / selfie (image file) |
Request Example
curl -X POST https://sandbox-api.payitfast.com/v2/kyc/share/third-vendor \
-H "Authorization: Basic <base64(username:password)>" \
-F "email=john@example.com" \
-F "userId=UX-241125161812424" \
-F "firstName=John" \
-F "lastName=Doe" \
-F "gender=male" \
-F "dob=1990-05-15" \
-F "phoneNo=+12125551234" \
-F "country=US" \
-F "nationality=US" \
-F "street=123 Main St" \
-F "city=Springfield" \
-F "state=IL" \
-F "postalCode=62701" \
-F "idDocType=passport" \
-F "idDocFrontSide=@/path/to/passport-front.jpg" \
-F "idDocBackSide=@/path/to/passport-back.jpg" \
-F "idDocIssuerCountry=US" \
-F "idDocExpiryDate=2030-12-31" \
-F "idDocUserName=John Doe" \
-F "selfie=@/path/to/selfie.jpg"
Response
{
"status": "kyc_pending"
}
Add Additional Documents
Submit additional supporting documents for a user whose transaction volume has reached a threshold requiring enhanced documentation, or when the compliance team has requested supplementary evidence.
POST
/v2/kyc/share/add-docs
Content Type
This endpoint requires Content-Type: multipart/form-data since it accepts file uploads.
Request Body (multipart/form-data)
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
User email |
| additionalDocType |
string |
Required |
Document type (e.g. "bank_statement") |
| additionalDoc |
binary |
Required |
PDF file of the supporting document |
Request Example
curl -X POST https://sandbox-api.payitfast.com/v2/kyc/share/add-docs \
-H "Authorization: Basic <base64(username:password)>" \
-F "email=john@example.com" \
-F "additionalDocType=bank_statement" \
-F "additionalDoc=@/path/to/bank_statement.pdf"
Get KYC Status
Retrieve the current KYC verification status for an individual user. If the KYC was rejected, the response includes rejectLabels describing the reasons.
GET
/v2/kyc/user
Query Parameters
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
User email address |
Request Example
GET /v2/kyc/user?email=john@example.com
Authorization: Basic <base64(username:password)>
Response
{
"status": "kyc_success",
"rejectLabels": []
}
Response Fields
| Field |
Type |
Description |
| status |
string |
Current KYC status (see KYC Statuses table) |
| rejectLabels |
array |
Array of rejection reason codes (empty when not rejected). See Reject Labels. |
Submit Standard KYB (Level 1)
Initiate the Standard KYB verification for a business user. Basic KYB must be approved before Standard KYB can be submitted. The response contains a verification link that expires in 12 hours.
POST
/v2/kyb/standard
Request Body
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
Business email address |
Request Example
POST /v2/kyb/standard
Content-Type: application/json
Authorization: Basic <base64(username:password)>
{
"email": "finance@acmecorp.com"
}
Response
{
"link": "https://verify.payitfast.com/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
"expiresIn": "12h"
}
Response Fields
| Field |
Type |
Description |
| link |
string |
Verification URL to redirect the business user to complete KYB |
| expiresIn |
string |
Link expiry duration (e.g. "12h") |
Error Responses
| HTTP Status |
Error Code |
Description |
400 |
BASIC_KYB_NOT_APPROVED |
Basic KYB must be approved before Standard KYB can be submitted |
400 |
STANDARD_KYB_ALREADY_APPROVED |
Standard KYB has already been completed for this user |
400 |
USER_BLOCKED_OR_REJECTED |
The user account is blocked or rejected |
500 |
KYB_LINK_GENERATION_FAILED |
Internal error generating the verification link |
Submit Advanced KYB (Level 2)
Initiate the Advanced KYB verification for a business user. Standard KYB must be approved before Advanced KYB can be submitted. Uses the same request and response structure as Standard KYB.
POST
/v2/kyb/advanced
Request Body
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
Business email address |
Request Example
POST /v2/kyb/advanced
Content-Type: application/json
Authorization: Basic <base64(username:password)>
{
"email": "finance@acmecorp.com"
}
Response
{
"link": "https://verify.payitfast.com/?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
"expiresIn": "12h"
}
Error Responses
| HTTP Status |
Error Code |
Description |
400 |
STANDARD_KYB_NOT_APPROVED |
Standard KYB must be approved before Advanced KYB can be submitted |
400 |
ADVANCED_KYB_ALREADY_APPROVED |
Advanced KYB has already been completed for this user |
400 |
USER_BLOCKED_OR_REJECTED |
The user account is blocked or rejected |
Get KYB Status
Retrieve the current KYB verification status for a business user.
GET
/v2/kyb/user
Query Parameters
| Parameter |
Type |
Required |
Description |
| email |
string |
Required |
Business email address |
Request Example
GET /v2/kyb/user?email=finance@acmecorp.com
Authorization: Basic <base64(username:password)>
Response
{
"status": "user_approved",
"rejectLabels": []
}
KYB Status Values
| Status |
Description |
user_approved |
Business user approved |
kyb_pending |
KYB verification in progress |
user_rejected |
Business user rejected |
kyb_rejected |
KYB verification rejected |
kyb_blocked |
Business user blocked |
kyb_manual_review |
Under manual compliance review |
Reject Labels
When a KYC submission is rejected, the rejectLabels array in the status response contains one or more of the following codes explaining the reason for rejection.
Document Issues
| Label |
Description |
DIGITAL_DOCUMENT |
Digital version submitted instead of physical document |
DOCUMENT_DAMAGED |
ID document too damaged to read |
DOCUMENT_PAGE_MISSING |
Both sides of the document are required |
INCOMPLETE_DOCUMENT |
Document in incomplete format |
SCREENSHOTS |
Screenshots are not accepted |
UNSATISFACTORY_PHOTOS |
Photos are illegible, blurred, or cropped |
Identity Verification
| Label |
Description |
BAD_FACE_MATCHING |
Face mismatch between selfie and ID photo |
BAD_SELFIE |
Selfie test failed |
SELFIE_MISMATCH |
Selfie does not match the submitted documents |
Data Inconsistencies
| Label |
Description |
AGE_REQUIREMENT_MISMATCH |
User outside the 18-70 age range |
PROBLEMATIC_APPLICANT_DATA |
DOB, name, or gender mismatch between fields |
INCONSISTENT_PROFILE |
Documents appear to belong to different people |
Fraud & Compliance
| Label |
Description |
ADVERSE_MEDIA |
Flagged in adverse media, under compliance review |
BLACKLIST / BLOCKLIST |
Suspected fraudulent account |
CRIMINAL |
Convicted criminal |
FORGERY |
Deep fake or document tampering detected |
FRAUDULENT_PATTERNS |
Fraudulent behavior patterns detected |
PEP |
Politically exposed person |
SANCTIONS |
Flagged on international sanctions lists |
Administrative
| Label |
Description |
DUPLICATE |
Same ID document used with multiple email addresses |
EXPIRATION_DATE |
Document expired or expires within 1 month |
ID_INVALID |
Invalid identity document |
INCOMPATIBLE_LANGUAGE |
Document language not supported |
COMPROMISED_PERSONS |
Incomplete name on document |
SPAM |
Irrelevant images submitted or 6+ consecutive failures |
GRAPHIC_EDITOR |
Document appears to have been edited with graphics tools |
Supported ID Documents
The following identity document types are accepted for KYC verification.
| Document Type |
Supported Countries |
| National ID |
All 69 supported countries |
| Passport |
All countries except Brazil (BR) |
| Driving License |
Australia (AU), Canada (CA), United States (US) only |
Next Steps
After completing KYC or KYB verification, users can begin transacting on the platform:
Orders & Payments
Create payin and payout orders once the user has passed verification.
View Orders docs
Webhooks
Receive real-time notifications for KYC status changes including kyc_success, kyc_rejected, and more.
View Webhooks docs