Merchants
Weave 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_onboarding 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
File Upload
Files 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 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 type of file being uploaded. Possible values: identity_document, asylum_document, passport, proof_of_address, bank_account_confirmation, cipc_registration_document, additional_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"
}
Supporting documentation that is self-hosted e.g. in an S3 bucket, can be referenced in File Upload API instead of providing the raw data.
Initiate a POST request to the https://api.stitch.money/v2/files URL to upload a file using a URL. Set the Content-Type header to application/json.
| Field | Type | Description |
|---|---|---|
url | string | The URL of the self-hosted file. Must be a non-empty string. |
type | string | Indicates the type of file being uploaded. Possible values: identity_document, asylum_document, passport, proof_of_address, bank_account_confirmation, cipc_registration_document, additional_document. |
The response contains a file id.
{
"id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM=",
"file": {
"url": "https://myurl.com"
}
}
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/v2/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "demo-merchant-001",
"businessType": "company",
"countryCode": "ZA",
"company": {
"name": "Stitch Demo Retail Ltd",
"categoryCode": "5611",
"phone": "+27123456789",
"url": "https://stitchdemo.co.za",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "Stitch Demo Retail Ltd"
},
"verification": {
"status": "verified",
"registrationNumber": "2020/123456/07",
"registrationDate": "2020-02-15",
"legalName": "Stitch Demo Retail Ltd",
"taxNumber": "9876543210",
"directors": [
{
"idType": "identity_document",
"idNumber": "8001015009083",
"name": "John Smith",
"dateOfBirth": "1980-01-01",
"gender": "male",
"nationality": "ZA",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
}
}
]
}
},
"documents": [
{ "id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM=" }
]
}'
curl -X POST https://api.stitch.money/v2/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "demo-merchant-002",
"businessType": "company",
"countryCode": "ZA",
"company": {
"name": "Stitch Demo Retail Ltd",
"categoryCode": "7372",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "Stitch Demo Retail Ltd"
},
"verification": {
"status": "not_verified",
"registrationNumber": "2020/123456/07"
}
},
"documents": [
{ "id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM=" }
]
}'
curl -X POST https://api.stitch.money/v2/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "demo-merchant-003",
"businessType": "individual",
"countryCode": "ZA",
"company": {
"name": "Stitch Demo Retail Ltd",
"categoryCode": "5945",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "John Smith"
}
},
"individual": {
"idType": "identity_document",
"idNumber": "8001015009083",
"name": "John Smith",
"dateOfBirth": "1980-01-01",
"gender": "male",
"nationality": "ZA",
"occupation": "Trader",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"verification": {
"status": "verified"
}
}
}'
curl -X POST https://api.stitch.money/v2/merchants \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"externalReference": "demo-merchant-004",
"businessType": "individual",
"countryCode": "ZA",
"company": {
"name": "Stitch Demo Retail Ltd",
"categoryCode": "7539",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "John Smith"
}
},
"individual": {
"idType": "identity_document",
"idNumber": "8001015009083",
"name": "John Smith",
"dateOfBirth": "1980-01-01",
"gender": "male",
"nationality": "ZA",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"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. Use company for Close Corporations. |
company | Company | Company object for company information. |
individual | Individual (optional) | Individual object for sole proprietor information. |
documents | array | List of supporting documentation. |
documents[].id | string | Unique ID of the uploaded document. |
Company Fields
| Field | Type | Description |
|---|---|---|
name | string | The company's trading name. |
categoryCode | string | The merchant category code (MCC). |
phone | string | The company's phone number in E.164 format. |
url | string (optional) | The company's website URL. |
email | string (optional) | The company's email address. |
address.street | string | The registered street address. |
address.city | string | The registered city. |
address.postalCode | string | The registered postal code. |
address.regionCode | string | ISO 3166-2 region code (e.g., "WC" for Western Cape). |
address.countryCode | string | ISO 3166-1 alpha-2 country code. |
bankAccount.number | string | The bank account number. |
bankAccount.bank | string | The bank name. Must be a valid BankBeneficiaryBankId value. |
bankAccount.accountHolderName | string | The account holder's name. |
bankAccount.verificationResult | string (optional) | Third-party Account Verification Service result. |
metadata | object (optional) | Arbitrary metadata associated with the company. |
verification.status | string | Possible values: verified or not_verified. |
verification.verificationProvider | string (optional) | The external verification provider. |
verification.verificationProviderId | string (optional) | A reference ID returned by the verification provider. |
verification.registrationNumber | string | The CIPC registration number. |
verification.registrationDate | string | ISO8601 date string. |
verification.legalName | string | The company's registered legal name. |
verification.taxNumber | string | The company's tax identification number. |
verification.risk.rating | string | A Client-assigned risk rating for the merchant. Possible values: low, medium or high. |
verification.risk.screen | boolean | Sanction and/or PEP/PIP screening conducted. |
verification.risk.vmss | boolean (optional) | Visa Merchant Screening Service check conducted. |
verification.risk.match | boolean (optional) | Mastercard MATCH check conducted. |
verification.directors | array (optional) | Array of Director objects. |
verification.beneficialOwners | array (optional) | Array of beneficial owners. Uses the Director schema. |
verification.authorizedSignatories | array (optional) | Array of authorized signatories. Uses the Director schema. |
verification.members | array (optional) | Array of Closed Corporation members. Uses the Director schema. |
Director Fields
| Field | Type | Description |
|---|---|---|
idType | string | The identification type. Possible values: passport, identity_document or asylum_document. |
idNumber | string | The national ID or passport number. |
name | string | The director's full legal name. |
dateOfBirth | string | The director's date of birth in format YYYYMMDD. |
gender | string | The director's gender. |
nationality | string | ISO 3166-1 alpha-2 country code. |
phone | string (optional) | The director's phone number in E.164 format. |
email | string (optional) | The director's email address. |
address.street | string | The director's registered street address. |
address.city | string | The director's registered city. |
address.postalCode | string | The director's registered postal code. |
address.regionCode | string | ISO 3166-2 region code (e.g., "WC" for Western Cape). |
address.countryCode | string | ISO 3166-1 alpha-2 country code. |
risk.screen | boolean | Sanction and/or PEP/PIP screening conducted. |
risk.dha | boolean | Department of Home Affairs (South Africa) query conducted. |
metadata | object (optional) | Arbitrary metadata. |
Individual Fields
| Field | Type | Description |
|---|---|---|
idType | string | The identification type. Possible values: passport, identity_document or asylum_document. |
idNumber | string | The national ID or passport number. |
name | string | The individual's full legal name. |
dateOfBirth | string | The individual's date of birth in format YYYYMMDD |
gender | string | The individual's gender |
nationality | string | ISO 3166-1 alpha-2 country code. |
phone | string | The individual's phone number in E.164 format. |
email | string | The individual's email address. |
address.street | string | The individual's registered street address. |
address.city | string | The individual's registered city. |
address.postalCode | string | The individual's registered postal code. |
address.regionCode | string | ISO 3166-2 region code (e.g., "WC" for Western Cape) |
address.countryCode | string | ISO 3166-1 alpha-2 country code. |
verification.status | string | Possible values: verified or not_verified. |
verification.provider | string (optional) | The external verification provider. |
verification.providerId | string (optional) | A unique reference ID returned by the verification provider. |
metadata | object (optional) | Arbitrary metadata. |
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": "demo-merchant-001",
"businessType": "company",
"countryCode": "ZA",
"mid": "991234567890123456",
"name": "Stitch Demo Retail Ltd",
"categoryCode": "5611",
"phone": "+27123456789",
"url": "https://stitchdemo.co.za",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "Stitch Demo Retail Ltd"
},
"documents": [
{
"id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM="
}
]
}
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "pending",
"externalReference": "demo-merchant-002",
"businessType": "company",
"countryCode": "ZA",
"mid": "991234567890123456",
"name": "Stitch Demo Retail Ltd",
"categoryCode": "7372",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "Stitch Demo Retail Ltd"
},
"documents": [
{
"id": "ZmlsZS83ZDRiMGNmYi0xMDBhLTRkMjUtYWViYy0zN2YyOWEwZDA3NTM="
}
]
}
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "active",
"externalReference": "demo-merchant-003",
"businessType": "individual",
"countryCode": "ZA",
"mid": "991112223334445556",
"name": "Stitch Demo Retail Ltd",
"categoryCode": "5945",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "John Smith"
}
}
{
"id": "bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk",
"status": "pending",
"externalReference": "demo-merchant-004",
"businessType": "individual",
"countryCode": "ZA",
"mid": "991998877665544332",
"name": "Stitch Demo Retail Ltd",
"categoryCode": "7539",
"phone": "+27123456789",
"email": "demo@stitchdemo.co.za",
"address": {
"street": "123 Main Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "John Smith"
}
}
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"
}
{
"title": "Invalid Input",
"code": "BAD_USER_INPUT",
"detail": "Failed to create merchant. Missing required documents: proof_of_address, bank_account_confirmation, cipc_registration_document"
}
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=demo-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. |
businessType | The merchant's business type. |
externalReference | A unique identifier provided by the client to reference or filter specific records. |
mid | A unique MID assigned by Stitch. |
status | The merchant's status on the Stitch platform. |
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.stitch.money/v2/merchants/bWVyY2hhbnQvNmM3OWVlZGEtY2E3Zi00ZDIwLThhNTgtN2JhYWI3MGY1ZTBk= \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-d '{
"company": {
"name": "New Stitch Demo Retail Ltd",
"phone": "+27123456788",
"url": "https://newstitchdemo.co.za",
"email": "demo@newstitchdemo.co.za",
"address": {
"street": "123 New Street",
"city": "Cape Town",
"postalCode": "8001",
"regionCode": "WC",
"countryCode": "ZA"
},
"bankAccount": {
"number": "1234567890",
"bank": "fnb",
"accountHolderName": "New Stitch Demo Retail Ltd"
}
}
}'
The response object is identical in structure to those returned by the POST and GET operations.