Merchant Onboarding API¶
Version 2.7
May 9, 2023
Table of Contents
Introduction¶
The Merchant Onboarding API is a RESTful web service designed to improve onboarding experience for Payroc partners and customers.
A simple form can be used to request new merchant setups for both PAD and Card payment processing.
Messages are HTTPS POST or HTTPS GET with JSON format being used for data exchange.
Process Overview¶
Customers can request an account setup for Merchant Onboarding API by contacting Payroc Merchant Services.
After receiving their account credentials, customers can construct and send request messages to Payroc’s API server
Payroc’s API server will return a response specifying whether a request has been queued for review or rejected due to validation errors
Payroc Merchant Services will review all queued requests and update the status to either approved or declined
A notification message is delivered to the customer’s server specifying whether a request has been approved or declined.
For approved requests, the notification will include the information required to commence payment processing.
Customers can choose to submit Status Update requests to determine the status of their merchant setups instead of receiving Notification messages.
Authentication¶
Authentication of requests is performed based on following values included in HTTP header:
X-User-ID
X-User-ID value must be base64 encoded API User ID assigned by Payroc
API User ID will be an ASCII string up to 32 bytes in length that can contain A-Z,a-z,0-9,-,_
X-Message-Hash
X-Message-Hash value must be base64 encoded result of hash function
Message hash is calculated using the API Key provided by Payroc and the entire JSON string included in the request
API Key will be an alphanumeric ASCII string up to 64 bytes in length
Hash is to be generated using HMAC-SHA256 algorithm - see RFC 2104 for details
HTTP header example:
Content-Type: application/json
X-User-ID: sample\_ID12345
X-Message-Hash: kCaHLZMAF+3Ov923dfPF+AkauzmSclAn1vnFaoTu/rk=
Response returned for failed authentication:
HTTP Code: 401
{ "message":"", "details":{} }
Request Fields¶
Templates setup by Payroc Merchant Services are used to control the field requirements for each API User ID. Examples of typical templates are provided in *Template Examples* section.
General Boarding Information¶
Field | Values | Description |
request_id | String [1-64] Alphanumeric, underscore, hyphen, space, period, comma, ampersand, colon, semicolon, slash, vertical slash, @ |
Unique identifier for the request. Requests including a previous request id will be rejected as duplicate. |
action | String [1-16] | Action ‘add’ - Create a new merchant ‘update’ - Update an existing merchant ‘deactivate’ - Deactivate an existing merchant Optional for “add” requests. Required for “update”, “deactivate” requests. |
terminal_id | String [8] Alphanumeric |
Terminal ID Required for “update” and “deactivate” requests. Rejected for “add” requests. |
legal_entity_name | String [1-30] Alphanumeric, space, hyphen, underscore, period, comma, ampersand |
Legal Entity Name Used as Chain name for Payment Facilitator setups |
legal_entity_type | String [6] | Legal Entity Type ‘CRPPRV’ - Private Corporation ‘CRPPUB’ - Public Corporation ‘NNPRFT’ - Non-Profit ‘GOVERN’ - Government ‘LLCPRV’ - Private LLC ‘LLCPUB’ - Public LLC ‘PRTPRV’ - Partnership Private ‘PRTPUB’ - Partnership Public ‘SOLEPR’ - Sole Proprietor |
legal_entity_contact_phone | String [1-25] Alphanumeric, space, hyphen, period, comma | Legal Entity Phone number |
legal_entity_contact_email | String [1-254] Multiple emails can be separated by comma |
Legal Entity Email address |
customer_service_phone | String [1-25] Alphanumeric, space, hyphen, period, comma | Customer Service Phone number |
url | String [1-128] URL address | Company URL |
dba_name | String [1-25] Alphanumeric and space | Doing Business As (DBA) name |
mcc | String [4] Numeric only | Merchant Category Code |
Address¶
Field | Values | Description | |
address | Object | Merchant address | |
street | String [1-50] Alphanumeric, space, hyphen, underscore, period, comma |
Street number PO BOX numbers are not allowed Unit or Apt number needs to be preceded by UNIT or APT |
|
city | String [1-20] Alphanumeric and underscore |
City name | |
province | String [2] Two-Letter abbreviation |
Province or State | |
pc_zip | String [1-16] | Canadian Postal Code or U.S. Zip Code | |
country | String [2] | Country “CA” or “US” |
Owner Information¶
Owner information must be an Authorized Signer to satisfy Amex compliance requirements.
Field | Values | Description | |
owner_information | Object | Owner information | |
name | String [1-30] Alphanumeric First and last name separated by space | Owner name | |
phone | String[1-25] Alphanumeric, space, hyphen, comma, period | Phone number | |
String [1-300] Multiple email addresses can be separated by comma |
Email address | ||
country | String [2] | Country Code Format:
ISO Alpha-2 Country Code
Example:
CA, US, GB
|
|
date_of_birth | String [8] Numeric value | Owner’s date of birth Format:
YYYYMMDD
|
Contact Details¶
Primary Contact¶
Field | Values | Description | |
primary_contact | Object | Primary contact information | |
name | String [1-30] Alphanumeric First and last name separated by space | Contact name | |
phone | String[1-25] Alphanumeric, space, hyphen, comma, period | Phone number | |
fax | String[1-25] Alphanumeric, space, hyphen, comma, period | Fax number | |
String [1-300] Multiple email addresses can be separated by comma |
Email address | ||
chargeback_contact | Object | Chargeback contact information | |
name | String [1-30] Alphanumeric First and last name separated by space | Contact name | |
phone | String [1-25] Alphanumeric, space, hyphen, comma, period | Phone number | |
fax | String [1-25] Alphanumeric, space, hyphen, comma, period | Fax number | |
String [1-300] Multiple email addresses can be separated by comma |
Email address |
Admin Contact¶
Field | Values | Description | |
admin_contact | Object | Admin contact information | |
name | String [1-30] Alphanumeric First and last name separated by space | Contact name | |
phone | String [1-25] Alphanumeric, space, hyphen, comma, period | Phone number | |
fax | String [1-25] Alphanumeric, space, hyphen, comma, period | Fax number | |
String [1-300] Multiple email addresses can be separated by comma |
Email address |
Techincal Contact¶
Field | Values | Description | |
tech_contact | Object | Technical contact information | |
name | String [1-30] Alphanumeric First and last name separated by space |
Contact name | |
phone | String [1-25] Alphanumeric, space, hyphen, comma, period | Phone number | |
fax | String [1-25] Alphanumeric, space, hyphen, comma, period | Fax number | |
String [1-300] Multiple email addresses can be separated by comma |
Email address |
PAD Boarding Details¶
Field | Values | Description | ||
pad_acceptance | String [1] | Specifies whether PAD payments are to be accepted “Y” or “N” | ||
pad | Object | PAD related parameters Required if pad_acceptance is set to Y |
||
account | Object | Merchant bank account | ||
bank | String [1-3] Numeric value | Bank number | ||
transit | String [1-5] Numeric value | Transit number | ||
account | String [7-12] Numeric value | Account number | ||
returned_item_account | Object | Merchant bank account for returned items, AKA NSF items | ||
bank | String [1-3] Numeric value | Bank number | ||
transit | String [1-5] Numeric value | Transit number | ||
account | String [7-12] Numeric value | Account number | ||
threshold | Object | Merchant risk thresholds | ||
max_transaction_amount | Integer value | Maximum transaction amount (in cents) | ||
max_monthly_transaction_count | Integer value | Maximum monthly transaction count | ||
max_monthly_transaction_volume | Integer value | Maximum monthly volume (in cents) | ||
funding_days | Integer [0-99] | Funding Days Number of banking days after settlement that merchant funds are to be issued. Optional |
Cheque Boarding Details¶
Field | Values | Description | ||
cheque_acceptance | String [1] | Specifies whether Cheque payments are to be accepted “Y” or “N” | ||
cheque | Object | Cheque related parameters Required if cheque_acceptance is set to Y |
||
account | Object | Merchant bank account | ||
bank | String [1-3] Numeric value | Bank number | ||
transit | String [1-5] Numeric value | Transit number | ||
account | String [7-12] Numeric value | Account number | ||
threshold | Object | Merchant risk thresholds | ||
max_transaction_amount | Integer value | Maximum transaction amount (in cents) | ||
max_monthly_transaction_count | Integer value | Maximum monthly transaction count | ||
max_monthly_transaction_volume | Integer value | Maximum monthly volume (in cents) | ||
funding_days | Integer [0-99] | Funding Days Number of banking days after settlement that merchant funds are to be issued. Optional |
EFT Payment Boarding Details¶
Field | Values | Description | ||
eft_payment_acceptance | String [1] | Specifies whether EFT payments are to be accepted “Y” or “N” | ||
eft_payment | Object | EFT payment related parameters Required if eft_payment_acceptance is set to Y |
||
account | Object | Merchant bank account | ||
bank | String [1-3] Numeric value | Bank number | ||
transit | String [1-5] Numeric value | Transit number | ||
account | String [7-12] Numeric value | Account number | ||
fees | Object | PAD related fees | ||
transaction | Integer value | Transaction fee (in cents) | ||
reject | Integer value | Reject fee (in cents) | ||
return | Integer value | Return fee (in cents) | ||
funding_days | Integer [0-99] | Funding Days Number of banking days after settlement that merchant funds are to be issued. Optional |
Card Payment Boarding Details¶
Field | Values | Description | ||
card_payment_acceptance | String [1] | Specifies whether card payments are to be accepted “Y” or “N” | ||
card_payment | Object | Card payment related parameters Required if card_payment_acceptance is set to Y |
||
credit_account | Object | Credit bank account | ||
bank | String [1-3] Numeric value | Bank number | ||
transit | String [1-5] Numeric value | Transit number | ||
account | String [7-12] Numeric value | Account number | ||
debit_account | Object | Debit bank account | ||
bank | String [1-3] Numeric value | Bank number | ||
transit | String [1-5] Numeric value | Transit number | ||
account | String [7-12] Numeric value | Account number | ||
interchange_plus | Object | Interchange Plus parameters | ||
convenience_fee | Object | Convenience Fee parameters | ||
discount_fee | Object | Discount Fee parameters |
If card payments are to be accepted by the merchant then the request must include at least one of the following objects:
interchange_plus
discount_fee
convenience_fee
Following combinations are allowed if more than one of the above objects is included:
interchange_plus, convenience_fee
discount_fee, convenience_fee
Interchange Plus¶
Field | Values | Description | ||||
interchange_plus | Object - child of card_payment | Interchange Plus parameters | ||||
visa | Object | Visa parameters | ||||
acceptance | Object | Specifies whether Visa card brand is to be accepted | ||||
credit | String [1] | Specifies whether Visa Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether Visa Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | Visa Credit fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
debit | Object | Visa Debit fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
commercial | Object | Visa Commercial fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
mcrd | Object | MasterCard parameters | ||||
acceptance | Object | Specifies whether MasterCard card brand is to be accepted | ||||
credit | String [1] | Specifies whether MasterCard Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether MasterCard Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | MasterCard Credit fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
debit | Object | MasterCard Debit fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
commercial | Object | MasterCard Commercial fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
amex | Object | AMEX parameters | ||||
acceptance | Object | Specifies whether AMEX card brand is to be accepted | ||||
credit | String [1] | Specifies whether AMEX Credit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | AMEX Credit fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
jcb | Object | JCB parameters | ||||
acceptance | Object | Specifies whether JCB card brand is to be accepted | ||||
credit | String [1] | Specifies whether JCB Credit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | JCB Credit fees | ||||
basis_points | Integer value | Basis points | ||||
transaction | Integer value | Transaction fees (in cents) |
Discount Fee¶
Field | Values | Description | ||||
discount_fee | Object - child of card_payment | Discount Fee parameters | ||||
visa | Object | Visa parameters | ||||
acceptance | Object | Specifies whether Visa card brand is to be accepted | ||||
credit | String [1] | Specifies whether Visa Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether Visa Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | Visa Credit fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
debit | Object | Visa Debit fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
commercial | Object | Visa Commercial fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
mcrd | Object | MasterCard parameters | ||||
acceptance | Object | Specifies whether MasterCard card brand is to be accepted | ||||
credit | String [1] | Specifies whether MasterCard Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether MasterCard Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | MasterCard Credit fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
debit | Object | MasterCard Debit fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
commercial | Object | MasterCard Commercial fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
amex | Object | AMEX parameters | ||||
acceptance | Object | Specifies whether AMEX card brand is to be accepted | ||||
credit | String [1] | Specifies whether AMEX Credit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | AMEX Credit fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) | ||||
jcb | Object | JCB parameters | ||||
acceptance | Object | Specifies whether JCB card brand is to be accepted | ||||
credit | String [1] | Specifies whether JCB Credit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | JCB Credit fees | ||||
discount_rate | Numeric value, 2 decimal places | Discount rate | ||||
transaction | Integer value | Transaction fees (in cents) |
Convenience Fee¶
Convenience fees can be setup as either a percentage or based on amount ranges. Tables are provided below with request field details for each option.
Convenience Fee - percentage option
Field | Values | Description | ||||
convenience_fee | Object - child of card_payment | Convenience Fee parameters | ||||
visa | Object | Visa parameters | ||||
acceptance | Object | Specifies whether Visa card brand is to be accepted | ||||
credit | String [1] | Specifies whether Visa Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether Visa Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | Visa Credit fees | ||||
rate | Numeric value, 2 decimal places | Rate | ||||
debit | Object | Visa Debit fees | ||||
rate | Numeric value, 2 decimal places | Rate | ||||
commercial | Object | Visa Commercial fees | ||||
rate | Numeric value, 2 decimal places | Rate | ||||
mcrd | Object | MasterCard parameters | ||||
acceptance | Object | Specifies whether MasterCard card brand is to be accepted | ||||
credit | String [1] | Specifies whether MasterCard Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether MasterCard Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | MasterCard Credit fees | ||||
rate | Numeric value, 2 decimal places | Rate | ||||
debit | Object | MasterCard Debit fees | ||||
rate | Numeric value, 2 decimal places | Rate | ||||
commercial | Object | MasterCard Commercial fees | ||||
rate | Numeric value, 2 decimal places | Rate |
Convenience Fee - amount range option
Field | Values | Description | ||||
convenience_fee | Object - child of card_payment | Convenience Fee parameters | ||||
visa | Object | Visa parameters | ||||
acceptance | Object | Specifies whether Visa card brand is to be accepted | ||||
credit | String [1] | Specifies whether Visa Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether Visa Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | Visa Credit fees | ||||
range | Array Object | Amount ranges & fees | ||||
debit | Object | Visa Debit fees | ||||
range | Array Object | Amount ranges & fees | ||||
commercial | Object | Visa Commercial fees | ||||
range | Array Object | Amount ranges & fees | ||||
mcrd | Object | MasterCard parameters | ||||
acceptance | Object | Specifies whether MasterCard card brand is to be accepted | ||||
credit | String [1] | Specifies whether MasterCard Credit is to be accepted ‘Y’ or ‘N’ | ||||
debit | String [1] | Specifies whether MasterCard Debit is to be accepted ‘Y’ or ‘N’ | ||||
fees | Object | Fees | ||||
credit | Object | MasterCard Credit fees | ||||
range | Array Object | Amount ranges & fees | ||||
debit | Object | MasterCard Debit fees | ||||
range | Array Object | Amount ranges & fees | ||||
commercial | Object | MasterCard Commercial fees | ||||
range | Array Object | Amount ranges & fees |
Range array syntax:
{"range":[[amount1, fee1],[amount2, fee2],[amount3, fee3]]}
Each array item includes maximum payment amount and associated fee to be charged for the range
Template Examples¶
Some of the factors used to determine the request field requirements for an API user account:
Type of merchant accounts to be setup, e.g., individual merchant account, Payment Facilitator sub-merchant
Fee model to be setup for merchant accounts, e.g., Interchange Plus, Discount Fee
Examples are provided below for templates that would typically apply for individual merchant and Payment Facilitator sub-merchant account setups. Request fields are specified as being Required, Optional, or Rejected where Rejected means that a value is not to be provided.
Payment Facilitator Sub-Merchant¶
Merchant Add¶
request_id | Required | ||||
action | Optional | ||||
terminal_id | Rejected | ||||
legal_entity_name | Required | ||||
legal_entity_type | Required | ||||
legal_entity_contact_phone | Required | ||||
legal_entity_contact_email | Required | ||||
customer_service_phone | Required | ||||
url | Required | ||||
dba_name | Required | ||||
mcc | Optional | ||||
address | Required | ||||
street | Required | ||||
city | Required | ||||
country | Required | ||||
province | Required | ||||
pc_zip | Required | ||||
owner_information | Required | ||||
name | Required | ||||
phone | Required | ||||
Required | |||||
country | Required | ||||
date_of_birth | Required | ||||
primary_contact | Required | ||||
name | Required | ||||
phone | Required | ||||
fax | Required | ||||
Required | |||||
chargeback_contact | Required | ||||
name | Required | ||||
phone | Required | ||||
fax | Required | ||||
Required | |||||
admin_contact | Optional | ||||
name | Required | ||||
phone | Required | ||||
fax | Required | ||||
Required | |||||
tech_contact | Optional | ||||
name | Required | ||||
phone | Required | ||||
fax | Required | ||||
Required | |||||
pad_acceptance | Required | ||||
pad | Required if pad_acceptance = Y otherwise ignored | ||||
account | Required | ||||
bank | Required | ||||
transit | Required | ||||
account | Required | ||||
returned_item_account | Optional | ||||
bank | Required | ||||
transit | Required | ||||
account | Required | ||||
threshold | Required | ||||
max_transaction_amount | Required | ||||
max_monthly_transaction_count | Required | ||||
max_monthly_transaction_volume | Required | ||||
fees | Required | ||||
transaction | Required | ||||
reject | Required | ||||
return | Required | ||||
funding_days | Optional | ||||
cheque_acceptance | Optional | ||||
cheque | Required if cheque_acceptance = Y otherwise ignored | ||||
account | Required | ||||
bank | Required | ||||
transit | Required | ||||
account | Required | ||||
threshold | Optional | ||||
max_transaction_amount | Required | ||||
max_monthly_transaction_count | Required | ||||
max_monthly_transaction_volume | Required | ||||
fees | Required | ||||
transaction | Required | ||||
reject | Required | ||||
return | Required | ||||
funding_days | Optional | ||||
eft_payment_acceptance | Optional | ||||
eft_payment | Required if eft_payment_acceptance = Y otherwise ignored | ||||
account | Required | ||||
bank | Required | ||||
transit | Required | ||||
account | Required | ||||
fees | Required | ||||
transaction | Required | ||||
reject | Required | ||||
return | Required | ||||
funding_days | Optional | ||||
card_payment_acceptance | Required | ||||
card_payment | Required if card_payment_acceptance = Y otherwise ignored | ||||
credit_account | Rejected | ||||
debit_account | Rejected | ||||
interchange_plus | Required | ||||
visa | Required | ||||
acceptance | Required | ||||
credit | Required | ||||
debit | Required | ||||
fees | Rejected | ||||
mcrd | Required | ||||
acceptance | Required | ||||
credit | Required | ||||
debit | Required | ||||
fees | Rejected | ||||
amex | Required | ||||
acceptance | Required | ||||
credit | Required | ||||
fees | Rejected | ||||
jcb | Required | ||||
acceptance | Required | ||||
credit | Required | ||||
fees | Rejected | ||||
discount_fee | Rejected | ||||
convenience_fee | Rejected |
Individual Merchant¶
Merchant Add¶
request_id | Required | |||||
action | Optional | |||||
terminal_id | Rejected | |||||
legal_entity_name | Required | |||||
legal_entity_type | Required | |||||
legal_entity_contact_phone | Required | |||||
legal_entity_contact_email | Required | |||||
customer_service_phone | Required | |||||
url | Required | |||||
dba_name | Required | |||||
mcc | Optional | |||||
address | Required | |||||
street | Required | |||||
city | Required | |||||
country | Required | |||||
province | Required | |||||
pc_zip | Required | |||||
owner_information | Required | |||||
name | Required | |||||
phone | Required | |||||
Required | ||||||
country | Required | |||||
date_of_birth | Optional | |||||
primary_contact | Required | |||||
name | Required | |||||
phone | Required | |||||
fax | Required | |||||
Required | ||||||
chargeback_contact | Required | |||||
name | Required | |||||
phone | Required | |||||
fax | Required | |||||
Required | ||||||
admin_contact | Optional | |||||
name | Required | |||||
phone | Required | |||||
fax | Required | |||||
Required | ||||||
tech_contact | Optional | |||||
name | Required | |||||
phone | Required | |||||
fax | Required | |||||
Required | ||||||
pad_acceptance | Required | |||||
pad | Required if pad_acceptance = Y otherwise ignored | |||||
account | Required | |||||
bank | Required | |||||
transit | Required | |||||
account | Required | |||||
returned_item_account | Optional | |||||
bank | Required | |||||
transit | Required | |||||
account | Required | |||||
threshold | Required | |||||
max_transaction_amount | Required | |||||
max_monthly_transaction_count | Required | |||||
max_monthly_transaction_volume | Required | |||||
fees | Required | |||||
transaction | Required | |||||
reject | Required | |||||
return | Required | |||||
funding_days | Optional | |||||
cheque_acceptance | Required | |||||
cheque | Required if cheque_acceptance = Y otherwise ignored | |||||
account | Required | |||||
bank | Required | |||||
transit | Required | |||||
account | Required | |||||
threshold | Optional | |||||
max_transaction_amount | Required | |||||
max_monthly_transaction_count | Required | |||||
max_monthly_transaction_volume | Required | |||||
fees | Required | |||||
transaction | Required | |||||
reject | Required | |||||
return | Required | |||||
funding_days | Optional | |||||
eft_payment_acceptance | Required | |||||
eft_payment | Required if eft_payment_acceptance = Y otherwise ignored | |||||
account | Required | |||||
bank | Required | |||||
transit | Required | |||||
account | Required | |||||
fees | Required | |||||
transaction | Required | |||||
reject | Required | |||||
return | Required | |||||
funding_days | Optional | |||||
card_payment_acceptance | Required | |||||
card_payment | Required if card_payment_acceptance = Y otherwise ignored | |||||
credit_account | Required | |||||
bank | Required | |||||
transit | Required | |||||
account | Required | |||||
debit_account | Required | |||||
bank | Required | |||||
transit | Required | |||||
account | Required | |||||
interchange_plus | Optional | |||||
visa | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
debit | Required | |||||
fees | Required | |||||
credit | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
debit | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
commercial | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
mcrd | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
debit | Required | |||||
fees | Required | |||||
credit | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
debit | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
commercial | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
amex | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
fees | Required | |||||
credit | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
jcb | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
fees | Required | |||||
credit | Required | |||||
basis_points | Required | |||||
transaction | Required | |||||
discount_fee | Optional | |||||
visa | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
debit | Required | |||||
fees | Required | |||||
credit | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
debit | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
commercial | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
mcrd | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
debit | Required | |||||
fees | Required | |||||
credit | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
debit | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
commercial | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
amex | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
fees | Required | |||||
credit | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
jcb | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
fees | Required | |||||
credit | Required | |||||
discount_rate | Required | |||||
transaction | Required | |||||
convenience_fee | Optional | |||||
visa | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
debit | Required | |||||
fees | Required | |||||
credit | Required | |||||
rate | Optional | |||||
range | Rejected if rate specified otherwise Optional | |||||
debit | Required | |||||
rate | Optional | |||||
range | Rejected if rate specified otherwise Optional | |||||
commercial | Required | |||||
rate | Optional | |||||
range | Rejected if rate specified otherwise Optional | |||||
mcrd | Required | |||||
acceptance | Required | |||||
credit | Required | |||||
debit | Required | |||||
fees | Required | |||||
credit | Required | |||||
rate | Optional | |||||
range | Rejected if rate specified otherwise Optional | |||||
debit | Required | |||||
rate | Optional | |||||
range | Rejected if rate specified otherwise Optional | |||||
commercial | Required | |||||
rate | Optional | |||||
range | Rejected if rate specified otherwise Optional |
Request Examples¶
Payment Facilitator Request Examples¶
Merchant Add - PAD Processing¶
{
"request_id": "request0001",
"legal_entity_name":"Sample",
"legal_entity_type":"CRPPUB",
"legal_entity_contact_phone":"416 123-4567",
"legal_entity_contact_email":"contact@example.com",
"customer_service_phone":"416 123-4567",
"url":"www.example.com",
"dba_name": "Retailer",
"address":{
"street":"2275 Upper Middle Rd.",
"city":"Oakville",
"country": "CA",
"province": "ON",
"pc_zip": "L6H0C3"
},
"pad_acceptance": "Y",
"pad":{
"account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"returned_item_account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
}
},
"cheque_acceptance": "N"
}
- Notes:
- returned_item_account object is optional for PAD processing
Merchant Add - Cheque Processing¶
{
"request_id": "request0001",
"legal_entity_name":"Sample",
"legal_entity_type":"CRPPUB",
"legal_entity_contact_phone":"416 123-4567",
"legal_entity_contact_email":"contact@example.com",
"customer_service_phone":"416 123-4567",
"url":"www.example.com",
"dba_name": "Retailer",
"address":{
"street":"2275 Upper Middle Rd.",
"city":"Oakville",
"country": "CA",
"province": "ON",
"pc_zip": "L6H0C3"
},
"pad_acceptance": "N",
"cheque_acceptance": "Y",
"cheque":{
"account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
}
}
}
Merchant Add - PAD & Cheque Processing¶
{
"request_id": "request0001",
"legal_entity_name":"Sample",
"legal_entity_type":"CRPPUB",
"legal_entity_contact_phone":"416 123-4567",
"legal_entity_contact_email":"contact@example.com",
"customer_service_phone":"416 123-4567",
"url":"www.example.com",
"dba_name": "Retailer",
"address":{
"street":"2275 Upper Middle Rd.",
"city":"Oakville",
"country": "CA",
"province": "ON",
"pc_zip": "L6H0C3"
},
"pad_acceptance": "Y",
"pad":{
"account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"returned_item_account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
}
},
"cheque_acceptance": "Y"
}
- Notes:
- returned_item_account object is optional for PAD processing
Merchant Update - Add Cheque Processing for merchant accepting PAD¶
{
"request_id": "request1",
"action": "update",
"terminal_id": "EXAMPLE1",
"cheque_acceptance": "Y"
}
Merchant Update – Add PAD processing for merchant accepting Cheque payments¶
{
"request_id": "request1",
"action": "update",
"terminal_id": "EXAMPLE1",
"pad_acceptance": "Y",
"pad":{
"returned_item_account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
}
}
}
- Notes:
- returned_item_account object is optional for PAD processing
Merchant Update –Account information & Risk Thresholds¶
{
"request_id": "request1",
"action": "update",
"terminal_id": "EXAMPLE1",
"pad":{
"account":{
"bank": "001",
"transit": "12345",
"account":"123456789"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
}
}
}
{
"request_id": "request1",
"action": "update",
"terminal_id": "EXAMPLE1",
"cheque":{
"account":{
"bank": "001",
"transit": "12345",
"account":"123456789"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
}
}
}
- Notes:
- Account information and thresholds can be updated by including either the pad or cheque object in a boarding request as the same fields are used for PAD & Cheque payment processing. Update requests are not currently supported that include both the pad and cheque objects.
Individual Merchant Request Examples¶
Merchant Add¶
Request including only PAD payment acceptance:
{
"request_id": "request0001",
"legal_entity_name":"Sample",
"legal_entity_type":"CRPPUB",
"legal_entity_contact_phone":"416 123-4567",
"legal_entity_contact_email":"contact@example.com",
"customer_service_phone":"416 123-4567",
"url":"www.example.com",
"dba_name": "Retailer",
"address":{
"street":"2275 Upper Middle Rd.",
"city":"Oakville",
"country": "CA",
"province": "ON",
"pc_zip": "L6H0C3"
},
"owner_information":{
"name":"Owner Name",
"phone": "416 123-4567",
"email": "o@example.com",
"country": "CA",
"date_of_birth": "20000101"
},
"primary_contact":{
"name":"Contact A",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "a@example.com"
},
"chargeback_contact":{
"name":"Contact B ",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "b@example.com"
},
"admin_contact":{
"name":"Contact C",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "c@example.com"
},
"tech_contact":{
"name":"Contact D",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "d@example.com"
},
"pad_acceptance": "Y",
"pad":{
"account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"returned_item_account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
},
"fees":{
"transaction": "8",
"reject": "1500",
"return": "1500"
}
},
"cheque_acceptance": "N",
"eft_payment_acceptance": "N",
"card_payment_acceptance": "N"
}
Request including PAD and Card payments with both Interchange Plus fees and Convenience fees:
{
"request_id": "request0001",
"legal_entity_name":"Sample",
"legal_entity_type":"CRPPUB",
"legal_entity_contact_phone":"416 123-4567",
"legal_entity_contact_email":"contact@example.com",
"customer_service_phone":"416 123-4567",
"url":"www.example.com",
"dba_name": "Retailer",
"mcc": "1234",
"address":{
"street":"2275 Upper Middle Rd.",
"city":"Oakville",
"country": "CA",
"province": "ON",
"pc_zip": "L6H0C3"
},
"owner_information":{
"name":"Owner Name",
"phone": "416 123-4567",
"email": "o@example.com",
"country": "CA",
"date_of_birth": "20000101"
},
"primary_contact":{
"name":"Contact A",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "a@example.com"
},
"chargeback_contact":{
"name":"Contact B ",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "b@example.com"
},
"admin_contact":{
"name":"Contact C",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "c@example.com"
},
"tech_contact":{
"name":"Contact D",
"phone": "416 123-4567",
"fax": "416 123-4567",
"email": "d@example.com"
},
"pad_acceptance": "Y",
"pad":{
"account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"returned_item_account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
},
"threshold":{
"max_transaction_amount":"199999",
"max_monthly_transaction_count":"500",
"max_monthly_transaction_volume":"6900000"
},
"fees":{
"transaction": "8",
"reject": "1500",
"return": "1500"
}
},
"cheque_acceptance": "N",
"eft_payment_acceptance": "N",
"card_payment_acceptance": "Y",
"card_payment":{
"credit_account":{
"bank":"001",
"transit":"12345",
"account": "123456789"
},
"debit_account":{
"bank":"001",
"transit":"12345",
"account": "123456789"
},
"interchange_plus":{
"visa":{
"acceptance": {"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"basis_points":"15", "transaction":"110"},
"debit": {"basis_points":"15", "transaction":"110"},
"commercial": {"basis_points":"15", "transaction":"110"}
},
},
"mcrd":{
"acceptance": {"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"basis_points":"15", "transaction":"110"},
"debit": {"basis_points":"15", "transaction":"110"},
"commercial": {"basis_points":"15", "transaction":"110"}
}
}
"amex":{
"acceptance": {"credit":"Y"},
"fees":{
"credit": {"basis_points":"15", "transaction":"110"},
}
}
"jcb":{
"acceptance": {"credit":"Y"},
"fees":{
"credit": {"basis_points":"15", "transaction":"110"},
}
}
},
"convenience_fee":{
"visa": {
"acceptance": {"credit":"Y", "debit":"Y" },
"fees":{
"credit": {"rate":"0.75"},
"debit": {"rate":"0.75"},
"commercial": {"rate":"0.75"}
}
},
"mcrd":{
"acceptance":{"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"rate":"0.75"},
"debit": {"rate":"0.75"},
"commercial":{"rate":"0.75"}
}
}
}
}
}
Following is sample snippet for merchant setup with Discount Fee setup:
{
"discount_fee": {
"visa": {
"acceptance":{"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"discount_rate":"2.50", "transaction":"10"},
"debit": {"discount_rate":"2.50", "transaction":"10"},
"commercial": {"discount_rate":"2.50", "transaction":"10"}
}
},
"mcrd": {
"acceptance": {"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"discount_rate":"2.50", "transaction":"10"},
"debit": {"discount_rate":"2.50", "transaction":"10"},
"commercial": {"discount_rate":"1.00" , "transaction":"110"}
}
}
"amex": {
"acceptance": {"credit":"Y"},
"fees":{
"credit": {"discount_rate":"2.50", "transaction":"10"},
}
}
"jcb": {
"acceptance": {"credit":"Y"},
"fees":{
"credit": {"discount_rate":"2.50", "transaction":"10"},
}
}
}
}
Following is sample snippet for merchant setup with Convenience Fee amount ranges:
{
"convenience_fee":{
"visa":{
"acceptance": {"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"range":[[1000, 105],[2000, 250],[3000, 315]]},
"debit": {"range":[[1000, 105],[2000, 250],[3000, 315]]},
"commercial": {"range":[[1000, 105],[2000, 250],[3000, 315]]}
}
},
"mcrd": {
"acceptance": {"credit":"Y", "debit":"Y"},
"fees":{
"credit": {"range":[[1000, 105],[2000, 250],[3000, 315]]},
"debit": {"range":[[1000, 105],[2000, 250],[3000, 315]]},
"commercial": {"range":[[1000, 105],[2000, 250],[3000, 315]]}
}
}
}
}
Merchant Update¶
{
"request_id": "request1",
"action": "update",
"terminal_id": "EXAMPLE1",
"pad":{
"account":{
"bank": "001",
"transit": "12345",
"account":"123456789"
},
"returned_item_account":{
"bank": "001",
"transit": "12345",
"account": "1234556"
}
}
}
Merchant Deactivate¶
{
"request_id": "request1",
"action": "deactivate",
"terminal_id": "EXAMPLE1"
}
Response¶
For successful requests, HTTP 202 will be returned with the following object:
{
"message": "",
"details":{}
}
For failed requests, HTTP 4xx code is returned. Depending on the scenario, the following object may be returned with the error messages attached to the corresponding fields:
{
"message": "Invalid data",
"details":{
"legal_entity_name":"0",
"legal_entity_type":"Invalid",
"address":{
"street":"0",
"city":"0",
"country": "0",
"province": "Invalid",
"pc_zip": "0"
}
}
}
Note: fields with a “0” or empty string indicate that the values passed validation
For some HTTP codes, such as 405, 415, 404, an empty body will be returned.
Notification¶
A notification ( HTTP POST with JSON string ) is sent back to customer’s server after a request has been reviewed and approved or declined by Payroc Merchant Services.
Customer’s server is expected to return an HTTP 200 code when the notification is received. Delivery of notification will be retried up to 3 times if HTTP 200 is not returned by the customer’s server.
HTTP Headers will include:
Content-Type
application/json
X-User-ID
This is the same X-User-ID which submitted the request
X-Message-Hash
X-Message-Hash will be calculated using the secret key from the API user specified by X-User-ID and the JSON payload in the notification.
The hash will be generated using HMAC-SHA256 algorithm - see RFC 2104 for details.
X-Message-Hash will be base64 encoded.
Fields that can be included in the notification message
Field | Values | Description | |||||
status | String[1-32] | ‘Pending’, ‘Approved’, ‘Declined’ | |||||
message | String | Reserved | |||||
details | Object | ||||||
request_id | String | ||||||
action | String[1-16] | ‘add’, ‘update’, ‘deactivate’ | |||||
pad | Object | If PAD payment is setup | |||||
terminal_id | String[8] | Assigned by Payroc | |||||
cheque | Object | If Cheque payment is setup | |||||
terminal_id | String[8] | ||||||
eft_payment | Object | If EFT payment is setup | |||||
terminal_id | String[8] | ||||||
card_payment | Object | If Card payment is setup | |||||
interchange_plus | Object | ||||||
terminal_id | String[8] | ||||||
bp_gateway_id | String | Certain customer only | |||||
bp_secret_key | String | Certain customer only | |||||
acquirer_merchant_id | Object | ||||||
visa | String[16] | Assigned by Payroc for VISA | |||||
mcrd | String[16] | Assigned by Payroc for MCRD | |||||
amex | String[16] | Assigned by Payroc for AMEX | |||||
jcb | String[16] | Assigned by Payroc for JCB | |||||
convenience_fee | Object | ||||||
terminal_id | String[8] | ||||||
acquirer_merchant_id | Object | ||||||
visa | String[16] | Assigned by Payroc for VISA | |||||
mcrd | String[16] | Assigned by Payroc for MCRD | |||||
amex | String[16] | Assigned by Payroc for AMEX | |||||
jcb | String[16] | Assigned by Payroc for JCB | |||||
discount_fee | Object | ||||||
terminal_id | String[8] | ||||||
bp_gateway_id | String | Certain customer only | |||||
bp_secret_key | String | Certain customer only | |||||
acquirer_merchant_id | Object | ||||||
visa | String[16] | Assigned by Payroc for VISA | |||||
mcrd | String[16] | Assigned by Payroc for MCRD | |||||
amex | String[16] | Assigned by Payroc for AMEX | |||||
jcb | String[16] | Assigned by Payroc for JCB |
Sample notification for approved request:
{
"status": "Approved",
"message": "",
"details": {
"request_id": "request0001",
"action": "add",
"pad":{
"terminal_id":"INTG0001"
},
"card_payment":{
"interchange_plus":{
"terminal_id":"INTG0001",
"acquirer_merchant_id":{
"visa": "1234567890123456",
"mcrd": "1234567890123456",
"amex": "1234567890123456",
"jcb": "1234567890123456"
},
"bp_gateway_id":"100000123000",
"bp_secret_key":"9c24c7bd1d2b2354e4bd84a578e91b46"
}
}
}
}
Sample notification for declined request:
{
"status": "Declined",
"message": "",
"details":{
"request_id": "request0001",
"action": "add",
"message":"Merchant already exists"
}
}
Status Update¶
Status update process provides Payroc’s customers/partners with an alternative to Notification process. Instead of receiving a Notification message from Payroc’s API server, customers/partners would be able to submit a request to determine if the status of a merchant setup has been updated.
Status update for a merchant setup can be obtained by submitting a HTTPS GET including the boarding request_id along with a timestamp;
https://api.caledoncard.com/boarding/request/<url_encoded_request_id>/<epoch>
Timestamp (epoch) is to specify when the status update request was initiated.
HTTP header must include same set of values as specified in Authentication section:
Content-Type: application/json
X-User-ID: <Base 64 encoded User ID>
X-Message-Hash: <Base64 encoded result of hash function>
Message hash for status update requests is calculated using the API Key provided by Payroc and request_id concatenated with epoch. Hash is to be generated using HMAC-SHA256 algorithm.
Status Update responses include:
HTTP 401 Unauthorized will be returned if the request failed to pass the authentication.
{
"message": "",
"details": {}
}
HTTP 400 Bad request will be returned if the epoch is outside of allowed time period
{
"message": "Request expired",
"details": {}
}
HTTP 404 Not found will be returned if the request ID does not exist
{
"message": "",
"details": {}
}
HTTP 200 Ok will be returned if the boarding request is still pending.
{
"message":"",
"status":"Pending",
"details":{}
}
HTTP 200 Ok will be returned if the boarding request has been approved
{
"message": "",
"status":"Approved",
"details":{
"request_id": "request0001",
"action": "add",
"pad":{
"terminal_id":"INTG0001"
},
"card_payment":{
"interchange_plus":{
"terminal_id":"INTG0001",
"acquirer_merchant_id":{
"visa": "1234567890123456",
"mcrd": "1234567890123456",
"amex": "1234567890123456",
"jcb": "1234567890123456"
},
"bp_gateway_id":"100000123000",
"bp_secret_key":"9c24c7bd1d2b2354e4bd84a578e91b46"
}
}
}
}
HTTP 200 will be returned if the boarding request was declined.
{
"message":"",
"status":"Declined",
"details":{
"request_id":"request0001",
"action": "add",
"message":"Merchant already exists"
}
}