Merchants
Connect allows clients to register and manage merchants on the Stitch platform. A merchant is a registered entity for which the client processes transactions on their behalf.
Each merchant is assigned a unique Merchant ID (MID) generated by Stitch and must be verified before they can transact. If a merchant has been pre-verified, the business verification data can be submitted to Stitch via the API. Contact support@stitch.money for more information on pre-verification.
Integration Overview
Follow the steps described in the client token guide to obtain a client token with the client_merchant_manage
scope.
The Stitch REST API URL https://api.stitch.money/v2/merchants can be used for all merchant management requests.
Merchant Registration
The initial step involves registering a merchant on the platform. The following information must be submitted on registration:
- Basic Information: The merchant's trading name and contact information
- Business Type: The merchant's business structure i.e. sole proprietorship or business entity
- Business Classification: The Merchant Category Code (MCC) that identifies the category of business.
- Address Details: The merchant's physical address and region
- Bank Account: The merchant's bank account details for settlement
Document Upload
Documents can be uploaded to Stitch and referenced during merchant creation. The Upload File API returns a id
that can be included in the documents
array.
Initiate a POST
request to the https://api.stitch.money/v2/files
URL to upload a file. This API follows the RFC 2388 specification for defining a file. Set the Content-Type
header to multipart/form-data
.
curl --location 'https://api.stitch.money/v2/files' \
--header 'Authorization: Bearer YOUR_ACCESS_TOKEN' \
--form 'file=@"postman-cloud:///1f050393-ec6f-46b0-88bc-75947ec7cb9b"' \
--form 'type="identity_document"'
Field | Type | Description |
---|---|---|
file.name | string | The name of the uploaded file. Must be a non-empty string. |
file.type | string | The MIME type of the file. Only application/pdf , image/jpeg and image/png are supported. |
file.data | any | The raw binary content of the file. |
type | string | Indicates the purpose of the file being uploaded. Possible values: verification_document or identity_document . |
The file is uploaded to Stitch's server and securely stored. The response contains a file id
and associated metadata in the file
object.
{
"id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM=",
"file": {
"name": "id.png",
"type": "application/pdf",
"size": "1024"
}
}
Stitch returns an error response in the following format if the file is not uploaded successfully:
{
"title": "Internal Server Error",
"code": "INTERNAL_SERVER_ERROR",
"detail": "Failed to upload file. Please try again later"
}
Merchant Creation
Stitch supports two business verification options: verified
and not_verified
. Set the company.verification.status
field in the request body to verified
if Know Your Business (KYB) checks have been performed. The verified information must be submitted in the request for validation.
Use not_verified
if the merchant has not been pre-verified. Stitch conducts the relevant KYB checks and activates the merchant once compliance requirements have been satistifed. The registrationNumber
field is required for both scenarios.
The company.verification
object is not required if the business is a sole proprietorship i.e. the businessType
is set to individual
. Instead, the individual
object must be populated in the request.
Initiate a POST
request to the https://api.stitch.money/v2/merchants
URL to create a merchant for a registered company or individual. Set the Content-Type
header to application/json
.
- Company (Verified)
- Company (Not Verified)
- Individual (Verified)
- Individual (Not Verified)
curl -X POST https://api.stitch.money/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "merchant-001",
"businessType": "company",
"countryCode": "ZA",
"company": {
"name": "Blue Crane Retail Ltd.",
"categoryCode": "5611",
"phone": "+27831234567",
"url": "https://bluecraneretail.co.za",
"address": {
"street": "10 Bree Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "Blue Crane Retail Ltd."
},
"verification": {
"status": "verified",
"registrationNumber": "2020/123456/07",
"registrationDate": "2020-02-15",
"legalName": "Blue Crane Retail Ltd.",
"taxNumber": "9876543210",
"directors": [
{
"name": "Thabo Mokoena",
"dateOfBirth": "1980-07-12",
"gender": "male",
"nationality": "ZA",
"phone": "+27831234568",
"email": "lilo@bluecraneretail.co.za",
"address": {
"street": "21 Long Street",
"city": "Cape Town",
"postalCode": "8000",
"regionCode": "WC",
"countryCode": "ZA"
}
}
]
}
},
"documents": [
{ "id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM=" }
]
}'
curl -X POST https://api.stitch.money/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "merchant-002",
"businessType": "company",
"countryCode": "ZA",
"company": {
"name": "Startify Solutions",
"categoryCode": "7372",
"phone": "+27711234567",
"address": {
"street": "4 Sandton Drive",
"city": "Sandton",
"postalCode": "2196",
"regionCode": "GT",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1122334455",
"bank": "absa",
"accountHolderName": "Startify Solutions"
},
"verification": {
"status": "not_verified",
"registrationNumber": "9999999999"
}
},
"documents": [
{ "id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM=" }
]
}'
curl -X POST https://api.stitch.money/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "merchant-003",
"businessType": "individual",
"countryCode": "ZA",
"company": {
"name": "Nomzamo Crafts",
"categoryCode": "5945",
"phone": "+27611234567",
"address": {
"street": "12 Market Street",
"city": "Durban",
"postalCode": "4001",
"regionCode": "KZN",
"countryCode": "ZA"
},
"bankAccount": {
"number": "4455667788",
"bank": "standard_bank",
"accountHolderName": "Nomzamo Dube"
}
},
"individual": {
"idType": "identity_document",
"idNumber": "8001015009083",
"name": "Nomzamo Dube",
"dateOfBirth": "1980-01-01",
"gender": "female",
"nationality": "ZA",
"phone": "+27611234567",
"email": "nomzamo@example.com",
"address": {
"street": "12 Market Street",
"city": "Durban",
"postalCode": "4001",
"regionCode": "KZN",
"countryCode": "ZA"
},
"verification": {
"status": "verified"
}
}
}'
curl -X POST https://api.stitch.money/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "merchant-004",
"businessType": "individual",
"countryCode": "ZA",
"company": {
"name": "Sipho’s Auto Repairs",
"categoryCode": "7539",
"phone": "+27651234567",
"address": {
"street": "35 Main Road",
"city": "Port Elizabeth",
"postalCode": "6001",
"regionCode": "EC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "9988776655",
"bank": "capitec",
"accountHolderName": "Sipho Nkosi"
}
},
"individual": {
"idType": "passport",
"idNumber": "A12345678",
"name": "Sipho Nkosi",
"dateOfBirth": "1975-09-21",
"gender": "male",
"nationality": "ZA",
"phone": "+27651234567",
"email": "sipho@example.com",
"address": {
"street": "35 Main Road",
"city": "Port Elizabeth",
"postalCode": "6001",
"regionCode": "EC",
"countryCode": "ZA"
},
"verification": {
"status": "not_verified"
}
}
}'
Field | Type | Description |
---|---|---|
externalReference | string (optional) | A unique reference for the merchant provided by the client. |
metadata | object (optional) | Arbitrary key-value metadata associated with the merchant. |
businessType | string | Possible values: individual or company . |
countryCode | string | ISO 3166-1 alpha-2 country code (e.g., "ZA" ). |
company.name | string | The company's trading name. |
company.categoryCode | string | The merchant category code (MCC). |
company.phone | string | The company's phone number in E.164 format. |
company.url | string (optional) | The company's website URL. |
company.address.street | string | The registered street address. |
company.address.city | string | The registered city. |
company.address.postalCode | string | The registered postal code. |
company.address.regionCode | string | ISO 3166-2 region code (e.g., "WC" for Western Cape). |
company.address.countryCode | string | ISO 3166-1 alpha-2 country code. |
company.bankAccount.number | string | The bank account number. |
company.bankAccount.bank | string | The bank name. Must be a valid BankBeneficiaryBankId value. |
company.bankAccount.accountHolderName | string | The account holder's name. |
company.metadata | object (optional) | Arbitrary metadata associated with the company. |
company.verification.status | string | Possible values: verified or not_verified . |
company.verification.verificationProvider | string (optional) | The external verification provider. |
company.verification.verificationProviderId | string (optional) | A reference ID returned by the verification provider. |
company.verification.registrationNumber | string | The CIPC registration number. |
company.verification.registrationDate | string | ISO8601 date string. |
company.verification.legalName | string | The company's registered legal name. |
company.verification.taxNumber | string | The company's tax identification number. |
company.verification.directors | array (optional) | Array of director objects. |
company.verification.directors[].name | string | The director's full legal name. |
company.verification.directors[].dateOfBirth | string | The director's date of birth in format YYYYMMDD . |
company.verification.directors[].gender | string | The director's gender. |
company.verification.directors[].nationality | string | ISO 3166-1 alpha-2 country code. |
company.verification.directors[].phone | string (optional) | The director's phone number in E.164 format. |
company.verification.directors[].email | string (optional) | The director's email address. |
company.verification.directors[].address.street | string | The director's registered street address. |
company.verification.directors[].address.city | string | The director's registered city. |
company.verification.directors[].address.postalCode | string | The director's registered postal code. |
company.verification.directors[].address.regionCode | string | ISO 3166-2 region code (e.g., "WC" for Western Cape). |
company.verification.directors[].address.countryCode | string | ISO 3166-1 alpha-2 country code. |
company.verification.directors[].metadata | object (optional) | Arbitrary metadata. |
company.verification.beneficialOwners | array (optional) | Array of beneficial owner objects. The schema is identical to the directors . |
individual.idType | string | The identification type. Possible values: passport or identity_document . |
individual.idNumber | string | The national ID or passport number. |
individual.name | string | The individual's full legal name. |
individual.dateOfBirth | string | The individual's date of birth in format YYYYMMDD |
individual.gender | string | The individual's gender |
individual.nationality | string | ISO 3166-1 alpha-2 country code. |
individual.phone | string | The individual's phone number in E.164 format. |
individual.email | string | The individual's email address. |
individual.address.street | string | The individual's registered street address. |
individual.address.city | string | The individual's registered city. |
individual.address.postalCode | string | The individual's registered postal code. |
individual.address.regionCode | string | ISO 3166-2 region code (e.g., "WC" for Western Cape) |
individual.address.countryCode | string | ISO 3166-1 alpha-2 country code |
individual.verification.verificationStatus | string | Possible values: verified or not_verified . |
individual.verification.verificationProvider | string (optional) | The external verification provider. |
individual.verification.verificationProviderId | string (optional) | A unique reference ID returned by the verification provider. |
individual.metadata | object (optional) | Arbitrary metadata. |
documents | array (optional) | Array of documents. |
documents[].id | string | Unique ID of the uploaded document. |
The response includes the merchant id
, the merchant's status and MID. The status
field indicates that merchant verification has been completed or not. A merchant must be in an active
state in order to transact.
The mid
field contains the unique processing MID assigned by Stitch and references the merchant's Stitch Acquiring account. The id
field is the Stitch API resource identifier and must be used for subsequent operations.
- Company (Verified)
- Company (Not Verified)
- Individual (Verified)
- Individual (Not Verified)
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "active",
"externalReference": "merchant-001",
"businessType": "company",
"countryCode": "ZA",
"mid": "991234567890123456",
"company": {
"name": "Blue Crane Retail Ltd.",
"categoryCode": "5611",
"phone": "+27831234567",
"url": "https://bluecraneretail.co.za",
"address": {
"street": "10 Bree Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "Blue Crane Retail Ltd."
},
"verification": {
"status": "verified",
"registrationNumber": "2020/123456/07",
"registrationDate": "2020-02-15",
"legalName": "Blue Crane Retail Ltd.",
"taxNumber": "9876543210",
"directors": [
{
"name": "Thabo Mokoena",
"dateOfBirth": "1980-07-12",
"gender": "male",
"nationality": "ZA",
"phone": "+27831234568",
"email": "thabo@bluecraneretail.co.za",
"address": {
"street": "21 Long Street",
"city": "Cape Town",
"postalCode": "8000",
"regionCode": "WC",
"countryCode": "ZA"
}
}
]
}
},
"documents": [
{
"id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM="
}
]
}
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "pending",
"externalReference": "merchant-002",
"businessType": "company",
"countryCode": "ZA",
"mid": "991234567890123456",
"company": {
"name": "Startify Solutions",
"categoryCode": "7372",
"phone": "+27711234567",
"address": {
"street": "4 Sandton Drive",
"city": "Sandton",
"postalCode": "2196",
"regionCode": "GT",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1122334455",
"bank": "absa",
"accountHolderName": "Startify Solutions"
},
"verification": {
"status": "not_verified",
"registrationNumber": "9999999999"
}
},
"documents": [
{
"id": "doc-002"
}
]
}
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "active",
"externalReference": "merchant-003",
"businessType": "individual",
"countryCode": "ZA",
"mid": "991112223334445556",
"company": {
"name": "Nomzamo Crafts",
"categoryCode": "5945",
"phone": "+27611234567",
"address": {
"street": "12 Market Street",
"city": "Durban",
"postalCode": "4001",
"regionCode": "KZN",
"countryCode": "ZA"
},
"bankAccount": {
"number": "4455667788",
"bank": "standard_bank",
"accountHolderName": "Nomzamo Dube"
}
},
"individual": {
"idType": "identity_document",
"idNumber": "8001015009083",
"name": "Nomzamo Dube",
"dateOfBirth": "1980-01-01",
"gender": "female",
"nationality": "ZA",
"phone": "+27611234567",
"email": "nomzamo@example.com",
"address": {
"street": "12 Market Street",
"city": "Durban",
"postalCode": "4001",
"regionCode": "KZN",
"countryCode": "ZA"
},
"verification": {
"status": "verified"
}
}
}
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "pending",
"externalReference": "merchant-004",
"businessType": "individual",
"countryCode": "ZA",
"mid": "991998877665544332",
"company": {
"name": "Sipho’s Auto Repairs",
"categoryCode": "7539",
"phone": "+27651234567",
"address": {
"street": "35 Main Road",
"city": "Port Elizabeth",
"postalCode": "6001",
"regionCode": "EC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "9988776655",
"bank": "Capitec",
"accountHolderName": "Sipho Nkosi"
}
},
"individual": {
"idType": "passport",
"idNumber": "A12345678",
"name": "Sipho Nkosi",
"dateOfBirth": "1975-09-21",
"gender": "male",
"nationality": "ZA",
"phone": "+27651234567",
"email": "sipho@example.com",
"address": {
"street": "35 Main Road",
"city": "Port Elizabeth",
"postalCode": "6001",
"regionCode": "EC",
"countryCode": "ZA"
},
"verification": {
"status": "not_verified"
}
}
}
Stitch returns an error response in the following format if the merchant is not created successfully:
{
"title": "Internal Server Error",
"code": "INTERNAL_SERVER_ERROR",
"detail": "Failed to create merchant. Please try again later"
}
Merchant Retrieval
Initiate a GET
request to retrieve a specific merchant by ID:
curl -X GET 'https://api.stitch.money/v2/merchants/bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk=' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
The response object is identical in structure to the one returned by the POST
request used to create a merchant.
You can list multiple merchants and filter the results using query parameters, such as externalReference
:
curl -X GET 'https://api.stitch.money/v2/merchants?externalReference=merchant-001' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
The response includes a data
field containing an array of merchant objects that match the specified filters.
Retrieval is paginated and supports the offset
and limit
query parameters to control result size and pagination. The default page size is 2000. A paginated query example is indicated below:
curl -X GET 'https://api.stitch.money/v2/merchants?limit=50&offset=100' \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
Query Parameters
Parameter | Description |
---|---|
offset | The number of records to skip before starting to return results. Used for pagination. |
limit | The maximum number of records to return in the response. Used to control page size. |
externalReference | A unique identifier provided by the client to reference or filter specific records. |
mid | A unique MID assigned by Stitch |
The default page size is 2000. Use the limit
field to reduce the number of records returned in a single response.
Merchant Management
Initiate a PATCH
request to update merchant data, including address information and bank account details. Note that all fields are optional.
curl -X PATCH https://api.example.com/merchants/bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk= \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"company": {
"name": "New Company Name",
"phone": "+27831234567",
"url": "https://newcompany.co.za",
"address": {
"street": "123 New Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1122334455",
"bank": "fnb",
"accountHolderName": "New Company Name"
}
}
}'
The response object is identical in structure to those returned by the POST
and GET
operations.