The Merchant Onboarding API handles the full registration and approval flow for new merchants. The process consists of three sequential steps:
Signup — Submit merchant details and documents
Search Merchant — Retrieve the merchant record by email
Approve Merchant — Approve the merchant and activate their account
https://app-api.edfapay.com
All endpoints (except Signup) require a Bearer Token in the Authorization header.
Authorization: Bearer <your_token>
Register a new merchant by submitting their details and required documents.
POST /public/signup
Header Value Acceptapplication/jsonContent-Typeapplication/jsonx-langen
JSON
{
"fullName": "John Doe",
"companyName": "My Company",
"address": "Riyadh",
"companyWebsite": "https://example.com",
"domainUrl": "app.edfapay.com",
"email": "[email protected] ",
"ibanNumber": "SA0380000000608010167510",
"freelancerCertificateNumber": "324321432",
"isFreeLance": true,
"mobileNumber": "+966-501234525",
"nationalId": "34324234321432",
"userType": "FreeLance",
"MethodType": [],
"unViewed": 0,
"merchantOnboardDocumentsRequests": [
{
"name": "CR_CERTIFICATE_doc",
"type": "CR_CERTIFICATE",
"data": {
"fileSize": 469513,
"fileName": "cr_certificate.pdf",
"contentType": "application/pdf",
"base64": "<base64_encoded_file>"
}
},
{
"name": "IBAN_CERTIFICATE_doc",
"type": "IBAN_CERTIFICATE",
"data": {
"fileSize": 469513,
"fileName": "iban_certificate.pdf",
"contentType": "application/pdf",
"base64": "<base64_encoded_file>"
}
},
{
"name": "NATION_ID_doc",
"type": "NATION_ID",
"data": {
"fileSize": 469513,
"fileName": "national_id.pdf",
"contentType": "application/pdf",
"base64": "<base64_encoded_file>"
}
},
{
"name": "NATION_ADDRESS_doc",
"type": "NATION_ADDRESS",
"data": {
"fileSize": 469513,
"fileName": "national_address.pdf",
"contentType": "application/pdf",
"base64": "<base64_encoded_file>"
}
}
]
}
Parameter Type Required Description fullNamestring✅ Yes Full name of the merchant owner. companyNamestring✅ Yes Name of the company. addressstring✅ Yes Physical address of the merchant. companyWebsitestringNo Company website URL. domainUrlstring✅ Yes The domain URL used for the partner's platform. emailstring✅ Yes Merchant's email address. Used to look up the merchant later. ibanNumberstring✅ Yes Merchant's IBAN number for payouts. isFreeLanceboolean✅ Yes true if the merchant is a freelancer, false for a company.freelancerCertificateNumberstringConditional Required if isFreeLance is true. crNumberstringConditional Commercial Registration number. Required if isFreeLance is false. mobileNumberstring✅ Yes Mobile number in E.164 format (e.g. +966-501234525). nationalIdstring✅ Yes National ID number of the merchant owner. userTypestring✅ Yes Merchant type. Values: FreeLance, Company. MethodTypearrayNo Payment method types. Pass empty array [] if not applicable. merchantOnboardDocumentsRequestsarray✅ Yes List of required documents. See Documents below.
Each document in merchantOnboardDocumentsRequests must follow this structure:
Field Type Description namestringInternal document name identifier. typestringDocument type. See supported types below. data.fileSizenumberFile size in bytes. data.fileNamestringOriginal file name with extension. data.contentTypestringMIME type (e.g. application/pdf, image/jpeg). data.base64stringBase64-encoded file content.
Supported Document Types:
Type Description CR_CERTIFICATECommercial Registration Certificate IBAN_CERTIFICATEIBAN Bank Certificate NATION_IDNational ID document NATION_ADDRESSNational Address document
JSON
{
"status": "success",
"message": "Merchant registered successfully."
}
Status Code Description 400 Bad RequestMissing or invalid fields in the request body. 409 ConflictA merchant with this email already exists.
Bash
curl -X 'POST' \
'https://app-api.edfapay.com/public/signup' \
-H 'Accept: application/json' \
-H 'Content-Type: application/json' \
-H 'x-lang: en' \
-d '{
"fullName": "John Doe",
"companyName": "My Company",
"email": "[email protected] ",
"isFreeLance": true,
...
}'
Search for a merchant by email to retrieve their record and ID. This is typically called after Signup to get the merchant_id needed for the Approve step.
GET /merchant-onboard/search
Header Value AuthorizationBearer <your_token>
Parameter Type Required Description textstring✅ Yes The merchant's email address to search for. pageNumberintegerNo Page number for pagination. Default: 0. pageSizeintegerNo Number of results per page. Default: 1.
JSON
{
"data": {
"content": [
{
"id": "d90200e2-1811-4094-a3a4-a85e30fb0898",
"fullName": "John Doe",
"email": "[email protected] ",
"mobileNumber": "+966-501234525"
}
]
}
}
Field Type Description data.content[].idstring (UUID)Merchant's unique ID. Use this as merchant_id in the Approve request. data.content[].fullNamestringMerchant's full name. data.content[].emailstringMerchant's email address. data.content[].mobileNumberstringMerchant's mobile number.
Status Code Description 200 OK with empty contentNo merchant found for the given email. 401 UnauthorizedMissing or invalid Bearer token.
Bash
curl -X 'GET' \
'https://app-api.edfapay.com/merchant-onboard/search?pageNumber=0&pageSize=1&[email protected] ' \
-H 'Authorization: Bearer <your_token>'
Approve a registered merchant and activate their account. This finalizes the onboarding process.
POST /merchant-onboard/approve/{merchant_id}
Header Value Content-Typeapplication/jsonAuthorizationBearer <your_token>x-langen
Parameter Type Required Description merchant_idstring (UUID)✅ Yes The merchant's unique ID retrieved from the Search step.
JSON
{
"name": "John Doe",
"feeProfileId": null,
"emailAddress": "[email protected] ",
"mobileNumber": "+966-501234525",
"nameAR": "جون دو",
"country": "682",
"city": "1",
"state": "",
"active": true,
"logo": null,
"registeredMobileNumber": "+966-501234525",
"currencyCode": "1",
"businessCategoryId": "e28ae68c-87d3-478d-afdd-f6020f0182a8"
}
Parameter Type Required Description namestring✅ Yes Merchant's full name (English). nameARstring✅ Yes Merchant's full name (Arabic). emailAddressstring✅ Yes Merchant's email address. mobileNumberstring✅ Yes Merchant's mobile number. registeredMobileNumberstring✅ Yes Mobile number used during registration. countrystring✅ Yes Country code ID (e.g. 682 for Saudi Arabia). citystring✅ Yes City code ID. statestringNo State/region. activeboolean✅ Yes Set to true to activate the merchant account. currencyCodestring✅ Yes Currency code ID (e.g. 1 for SAR). businessCategoryIdstring (UUID)✅ Yes UUID of the business category. feeProfileIdstring / nullNo Fee profile UUID, or null to use the default profile. logostring / nullNo Logo URL or null.
JSON
{
"status": "success",
"message": "Merchant approved successfully."
}
Status Code Description 400 Bad RequestMissing or invalid fields. 401 UnauthorizedMissing or invalid Bearer token. 404 Not FoundMerchant with the given ID does not exist.
Bash
curl -X 'POST' \
'https://app-api.edfapay.com/merchant-onboard/approve/d90200e2-1811-4094-a3a4-a85e30fb0898' \
-H 'Content-Type: application/json' \
-H 'Authorization: Bearer <your_token>' \
-H 'x-lang: en' \
-d '{
"name": "John Doe",
"emailAddress": "[email protected] ",
"mobileNumber": "+966-501234525",
"nameAR": "جون دو",
"country": "682",
"city": "1",
"active": true,
"registeredMobileNumber": "+966-501234525",
"currencyCode": "1",
"businessCategoryId": "e28ae68c-87d3-478d-afdd-f6020f0182a8",
"parentBusinessUnitId": "1d1ff5cb-e945-4d5e-a461-ac217f09ed23"
}'
1. POST /public/signup → Submit merchant details & documents
↓
2. GET /merchant-onboard/search → Find merchant by email → get merchant_id
↓
3. POST /merchant-onboard/approve/{merchant_id} → Approve & activate merchant
The email field is the primary identifier used to link steps 1 → 2 → 3.
All document files must be base64-encoded before submission.
The merchant_id returned in the Search response is required for the Approve call.
Steps 2 and 3 require a valid Bearer token with admin/operator privileges.