International Disbursements

API Implementation Guide

Empirical workflow

Payer Authentication:

Endpoint: https://sandboxapi.kyckglobal.com/apis/userAuth

Country Currency Check

Endpoint: https://sandboxapi.kyckglobal.com/apis/getPaymentMethodBasedCountry

Payee Onboarding

Create Payment (Disbursement)

Endpoint: https://sandboxapi.kyckglobal.com/apis/bulkPaymentByJSON

Get PayStub

Endpoint: https://sandboxapi.kyckglobal.com/apis/getPayStub/:Reference_Id

Cancel Payment

EndPoint: https://sandboxapi.kyckglobal.com/apis/cancelPayment/:Reference_Id

Payee Management APIs

1. Payer Authentication

Use the Auth Token Request operation to obtain an auth token. The auth token is used to authenticate your session on the Direct Send platform, and it must be refreshed every 1 hour. Send a POST request to the /userAuth endpoint with your Direct Send account email address and password in the body of the request.

Successful Result

Direct Send generates a JWT authentication token based on the Payer Id with the information provided by [Company Name] from preset with or without a financial account linked.

Unexpected Conditions

Result

[Company Name] times out on the token request/Login

[Company Name] to retry the token request/Login.

Direct Send fails the token request.

Error codes sent to [Company Name] are listed in Possible Error Messaging document listed as item #3 in references section of this document.

JWT Lifetime:

1 Hour

Endpoint:

https://sandboxapi.kyckglobal.com/apis/userAuth

Request:

{
"email": "[userEmailAddress]",
"password": "[password]"
}

Response (successful result):

{
"success": true,
"token": "JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyVHlwZSI6Ikt5Y2siLCJlbWFpbCI6ImJlbHNpbmdlckBreWNrZ2xvYmFsLmNvbSIsInJvbGUiOiJLeWNrLVN1cGVyLUFkbWluIiwibG9naW5TdGF0dXMiOiJsb2dnZWRJbiIsImlhdCI6MTY2MjQ5MzYwMiwiZXhwIjoxNjYyNTgwMDAyfQ.bp14WXJEu1QiU_UfzjL6Es06vlVcRPj-jldljnF2D-c",
"user": {
"role": "Kyck-Super-Admin",
"userType": "Kyck"
}
}

2. Country Currency Coverage Check

The supported country / currency check for payments methods does a look up for all countries, and provides the list of payment methods & currencies (where applicable) that are supported for that country.

Successful Result

An array of objects will be returned for reference by [Company Name].

Alternate Flow

[Calling the /fecthAllCountryDetails & /getCountryCurrency endpoints can provide the same results, but require multiple steps.

Unexpected Conditions

Result

[Company Name] times out on the request

[Company Name] to retry the get request.

[Company Name]’s JWT Token is expired

[Company Name] to refresh token and retry the onboarding request.

Endpoint:

https://sandboxapi.kyckglobal.com/apis/getpaymentMethodBasedCountry

Basic Request:

This request only includes a Header with the current JWT Token

Response (successful result):


{
"status": true,
"data": [
{
"countryName": "Puerto Rico",
"countryCode": "PRI",
"currency": "USD",
"pushToCard": false,
"pushToAccount": false,
"internationalIAch": false,
"internationalWire": true,
"payPal": false,
"cash": false,
"check": false,
"internationalBankAccount": false,
"employeePaycard": false,
"ach": true,
"ncrPay360": false,
"venmo": false,
"giftCard": false,
"reloadablePrepaidCard": false,
"cashSupportedReceiveCurrency": "USD",
"readyCode": false
},...

Field Definitions:

3. Create Single Payee

The Onboard Single Payee operation creates a new Payee record under the Payer Organization specified in the request body.

Successful Result

The Payee is onboarded successfully and Direct Send generates a Payee Id with the information provided by [Company Name], with or without a financial account linked.

Alternate Flow

  • If the Payee already exists for the given payer, then an error response to the onboarding request is sent with the existing Payee Id for the Payer to move forward with an update or payment call.
  • If the conditional required Payee profile or financial details are not provided in the correct format or missing, then a ‘true’ response is sent with the generated Payee Id as well as an appropriate error messaging.

Unexpected Conditions

Result

[Company Name] times out on the request

[Company Name] to retry the onboarding request.

[Company Name]’s JWT Token is expired

[Company Name] to refresh token and retry the onboarding request.

The minimum required Payee details are not provided in the correct format or are missing.

A ‘false’ response is sent with an appropriate error message is provided for [Company Name] to correct and retry the request.

 

Endpoint:

https://sandboxapi.kyckglobal.com/apis/onboardPayeeWithBeneficiary

Basic Request:

This request sample has the minimum field requirements for adding a payee.

IBAN Details

{
"payerId": "{{uat_payerid}}",
"email": "[email protected]",
"account": {
"iban": "ES0200492666702094515427"
},
"firstName": "Brad",
"lastName": "Bene test",
"phone": "",
"address": "AV JANDIA S-N APDO. 00000",
"region": "Madrid",
"city": "Madrid",
"postalCode": "35625",
"classification": "Individual",
"paymentMethod": "E"
}

Routing/Account Number Details

{
"payerId": "{{uat_payerid}}",
"email": "[email protected]",
"account": {
"routingCode": "004958786",
"destinationCountry": "ES",
"accountNumber": "2416015745"
},
"firstName": "Brad",
"lastName": "Bene test",
"phone": "",
"address": "AV JANDIA S-N APDO. 00000",
"region": "Madrid",
"city": "Madrid",
"postalCode": "35625",
"classification": "Individual",
"paymentMethod": "E"
}

Field Definitions:

Key

Type

Description

email

string

The payee’s email address.

account

object

The payee’s financial account details (alternate options between IBAN or Routing/Account number can be supplied)

payeeDetails

object

A JSON object the includes details about the payee.

PayerID

string

The payer organization’s unique identifier on the Direct Send platform.

4. Create Payment (Disbursement)

The Create Payments operation initiates one or more payments to the payees defined in the request body. This operation can submit payments for processing on multiple dates.

 

Successful Result

The payment is submitted into the Direct Send platform and queued for processing.

Alternate Flow

If the Payee already exists for the given payer, then an error response to the onboarding request is sent with the existing Payee Id for the Payer to move forward with an update or payment call.
Unexpected Conditions Result

[Company Name] times out on the request

[Company Name] to retry the onboarding request.

[Company Name]’s JWT Token is expired

[Company Name] to refresh token and retry the onboarding request.

The minimum required Payee details are not provided in the correct format or are missing.

A ‘false’ response is sent with an appropriate error message is provided for [Company Name] to correct and retry the request.

Endpoint:

POST – /bulkPaymentByJSON

Request:

{
"payerId": "[payerId]",
"payments": [
{
"payeeDetails": {
"payeeId": "[payeeId]",
"email": "[payeeEmailAddress]",
"payeeName": "[payeeName]"
},
"paymentReason": "Payout",
"PaymentDescription": " ",
"paymentData": {
"effectivePaymentDate": "[effectivePaymentDate]",
"amount": 5.00,
"paymentType": "[paymentType]"
},
"payeeCurrency": "[ISO Alpha-3 Currency Code]"
}
]
}
Key Type Description
PayerId string The payer organization’s unique identifier on the Direct Send platform.
payments array An array of payment objects the defines the payee, amount, and tax information for the payment.

Payments Array Field Definitions:

Key Type Description
payeeDetails object Object containing the required payee details.
paymentReason string Reporting category for this payment. Contact Direct Send support for the specific reasons available to your payers.
paymentData object Object containing required payment information.
payeeCurrency String This value can either be the currency held in the settlement account (typically USD) to have settlement currency be the lockside value, or can be the payee’s account currency (found in the /getPayeeById endpoint) to have the payment currency be the lockside value.

payeeDetails Object Field Definitions:

Key Type Description
payeeId string The Payee’s unique identifier on the Direct Send platform.
email string The Payee’s email address.
payeeName string The Payee’s full name.

paymentData Object Field Definitions:

Key Type Description
effectivePaymentDate string The date that the payment will be submitted for processing in MM/DD/YYYY format.
amount number The amount of the payment.
paymentType String sameDay or regular

List Of Payment Reasons:

  1. Payout
  2. Payout – Claim
  3. Payout – Title IV Fund
  4. Payout – Loan Proceeds
  5. New Payment
  6. Vendor Payment
  7. Contract Payment
  8. Loan Payment
  9. Other Income
  10. Refund – Title IV Excess
  11. Refund – Overpaid
  12. Refund – Duplicate Payment
  13. Refund – Financial Aid
  14. Refund – Tuition Credit new
  15. Refund – Title IV Excess (Parent PLUS Loan)
  16. Refund – Housing Credit Balance
  17. Refund – Student
  18. Refund – Tuition Credit Balance
  19. Refund – Fee
  20. Refund – Tuition Credit
  21. Refund – Title IV
  22. Refund – Credit Balance
  23. Refund – credits
  24. Refund – Scholarship
  25. Refund – Overpayment
  26. Refund – Deposit
  27. Rental Payments
  28. Tax proceeds
  29. Revenue Share
  30. Advance Pay
  31. Premium Refund
  32. Impounded Car Retrieval
  33. Plaintiff Cash Advance
  34. Prepaid Airtime
  35. Insurance Claims
  36. TipMeOut – Gratuity
  37. Settlement Advance
  38. Rebate
  39. Appeasement Payment

Response (success):

{
"success": true,
"fileId": "",
"accept": [
{
"payeeDetails": {
"payeeId": “",
"email": "[email protected]",
"payeeName": "Bradley elsinger",
"PayeeFirstName": "Bradley",
"PayeeLastName": "elsinger"
},
"paymentReason": "Payout",
"paymentData": {
"effectivePaymentDate": "09/07/2022",
"amount": 5
},
"PayerPaymentReferenceNum": "Loan Id: 1254620",
"accountId": "1",
"PaymentDescription": "This is a check payment for your loan",
"isConvenienceFeeDisabled": false,
"allowPaymentForDisabledUser": false,
"payerId": "K052674P",
"payerTXId": "823069590",
"payerName": "Brad's Test Company",
"createdByUserType": "Kyck-Super-Admin",
"payerMailingAddress": {
"mailingAddressLineTwo": "Building 15 Suite P-120",
"mailingPostalCode": "30305",
"mailingState": "GA",
"mailingCity": "Atlanta",
"mailingAddressLineOne": "3575 Piedmont Rd NE ",
"mailingCountry": "USA"
},
"PayerCustomerId": "BRADSTESTCOMPANY",
"createdBy": "[email protected]",
"payerEmail": "b",
"achType": "sameDay",
"paymentDetails": [
{
"Reference_ID": "", // USE THIS REFERENCE ID FOR /apis/getPayStub/{Reference_ID} CALL
"payeePaymentMethod": "international ach"
}
]
}
],
"reject": [],
"status": true
}

Response (fail):

{
"success": false,
"reason": "Effective payment should be future date",
"message": "Effective payment should be future date"
}

5. Get Pay Stub

Request:

https://sandboxapi.kyckglobal.com/apis/getPayStub/{{Reference_ID}}

Response (standard):

{
"success": true,
"payStub": {
"payerACHApproved": true,
"returnedReason": "",
"status": "Submitted",
"responseData": "",
"createdBy": "",
"name": "",
"returnStatus": false,
"achType": "sameDay",
"flag": false,
"paymentStatus": false,
"paymentReason": "Payout",
"PayerCustomerId": "",
"fileId": "",
"payerTXId": "",
"payerId": "",
"payeeAccountNumber": "",
"payeeDetails": {
"payeeName": "",
"payeeId": "",
"email": "",
"PayeeFirstName": "",
"PayeeLastName": "r"
},
"payeePaymentMethod": "venmo",
"cashCreatedDate": "",
"requestedDate": "09/06/2022",
"createdByUserType": "",
"payerMailingAddress": {
"mailingAddressLineTwo": "Building 15 Suite P-120",
"mailingPostalCode": "30305",
"mailingState": "GA",
"mailingCity": "Atlanta",
"mailingAddressLineOne": "3575 Piedmont Rd NE ",
"mailingCountry": "USA"
},
"payPeriodTo": null,
"typeOfACH": "Disbursement",
"paymentCreatedDate": "09/06/2022",
"cashFetch": "",
"Reference_ID": "RAAJ5B4XDVOUTUVEN",
"frequencyOrDate": "NA",
"cashStatus": "",
"createdHour": "",
"paymentData": {
"amount": 5,
"effectivePaymentDate": "09/07/2022"
},
"requestedTime": "4:06:34 PM",
"payerEmail": "",
"accountName": "",
"datetimestamp": 1662494794257,
"AccountType": "”,
"payerName": "",
"payPeriodFrom": null,
"cashBatchId": "",
"PaymentDescription": "This is a check payment for your loan",
"collectionReference_ID": "",
"collectionStatus": "Submitted",
"pendingReason": "",
"pendingReference_ID": "",
"paymentReference_ID": "",
"PayerPaymentReferenceNum": "Loan Id: 1254620",
"Trace_ID": "",
"cashLocation": ""
}
}

Response (fail):


{
"success": false,
"msg": "Paystub is not found"
}

6. Cancel Payment

Endpoint:

https://sandboxapi.kyckglobal.com/apis/cancelPayment/{{Reference_ID}}

Response (success):

{
"success": true,
"message": "The Payment has been cancelled Successfully"
}

Response (fail):

{
"success": false,
"msg": "Reference id is invalid"
}

Appendix A – Applicable Disbursement Statuses

The following are the applicable disbursement status(es) supported by Direct Send:

 

Barcode status

Description

Submitted

A state where a transaction has been initiated in the Direct Send system for processing.

Success

A state where a transaction has been sent to the respective disbursement endpoint.

Processing

An intermediary state where a transaction is being processed.

Pickup Ready

A state where a cash authorization code or barcode is ready for redemption.

Returned

A state where a transaction has been returned and requires action.

Rejected

A state where a transaction has been cancelled and a refund is being issue (if applicable).



		

Appendix B – Payee Management

C.1 Get Payee by Id

Request:

https://sandboxapi.kyckglobal.com/apis/getPayeeById/{{PayeeId}}

Response (success):

{
"success": true,
"data": [
{
"createdByName": "Brad Elsinger",
"pushToAccount": false,
"pushToCardAccount": [
{
"last4": "9913",
"allocation_version": "new",
"allocation": 100,
"isMasterCard": true,
"auditLog": [
{
"date": "2022-09-08T17:36:59.440Z",
"type": "create",
"user": "unknown name",
"email": "[email protected]"
}
],
"accountName": "PushToCard",
"createdTimeStamp": 1662658619440,
"allocationType": "percentage-allocation",
"type": "PushToCard",
"primaryAccount": false,
"accountStatus": "active",
"accountId": "acct_2Z10lU1zmOor_JCOOunma_i2Tpm",
"createdDate": "09/08/2022",
"accountApproved": true,
"createdTime": "1:36:59 PM",
"expirationDate": "2030-10"
}
],
"payerLegalName": "Brad's Test Company",
"payeeOnboardedDate": "09/08/2022",
"payeeInternationalAch": false,
"createdBy": "[email protected]",
"payeeInternationalBank": false,
"payeeNcrPay360Account": [
{
"accountStatus": "active",
"allocation_version": "old",
"allocation": 0,
"accountApproved": true,
"auditLog": [
{
"date": "2022-09-08T17:31:04.511Z",
"type": "create",
"user": "unknown name",
"email": "[email protected]"
}
],
"accountName": "NCRpay360",
"accountNumber": "4044015555",
"allocationType": "percentage-allocation",
"type": "NCRpay360",
"primaryAccount": false
}
],
"contactInfo": [
{
"contactNumber": "1234567890",
"contactType": "Mobile"
}
],
"payeeDisabled": false,
"payeeCheck": false,
"enableConvenienceFeeToAllPayee": false,
"payeeIncommCL": false,
"payerId": "Payer00253",
"payeePushDebit": false,
"payeeDetails": {
"isDBAasReceiverEnabled": false,
"sendSMS": true,
"contactInfo": [
{
"contactNumber": "1234567890",
"contactCode": "+1",
"contactType": "Mobile"
}
],
"payeeFirstName": "",
"payeeLastName": "",
"payeereferenceId": "5648375568",
"pstate": "GA",
"pcountry": "USD",
"pemail": "[email protected]",
"mcountry": "USD",
"mstate": "GA"
},
"payeeId": "Payee25301bthh",
"payeeInternationalWire": false,
"accountActive": false,
"createdByUserType": "Kyck-Super-Admin",
"payeeNcrPay360": true,
"payeeAch": false,
"blockNotification": false,
"payeeLastName": "elsinger",
"payeeEmail": "[email protected]",
"payeeFirstName": "Bradley",
"payeeVenmo": false,
"payeeDestinationCountry": "US",
"pushToCard": true,
"payeeEmployeePayCard": false,
"payeeMoneyGram": null,
"payeeMoneyGramAccount": null,
"payeePayPal": false,
"payeeReloadablePrepaidCard": false,
"payeeReferenceId": "5648375568",
"payeeStatus": "Onboarded",
"datetimestamp": 1662658264564,
"payeePaymentPreferences": {
"pushToCardStatus": true,
"venmoStatus": false,
"pach": false,
"pmoney": null,
"incommCLStatus": false,
"pushDebitStatus": false,
"iACHStatus": false,
"reloadablePrepaidCardStatus": false,
"checkStatus": false,
"ncrPay360Status": false,
"wireStatus": false,
"internationalBankStatus": false,
"pushToAccountStatus": false,
"employeePayCardStatus": false,
"paymentFreference": "Monthly",
"payPalStatus": false,
"pcash": true
},
"payeeFinancialAccountStatus": "Approved",
"payeeCash": true,
"payeeCashAccount": [
{
"accountStatus": "active",
"allocation_version": "old",
"allocation": 0,
"accountApproved": true,
"auditLog": [
{
"date": "2022-09-08T17:31:04.511Z",
"type": "create",
"user": "unknown name",
"email": "[email protected]"
}
],
"accountName": "incomm",
"allocationType": "percentage-allocation",
"type": "Cash",
"primaryAccount": true
}
]
}
]
}

Response (fail):

{
"success": false,
"message": "Payee not Found"
}

C.2 Update Payee

Endpoint:

PUT – https://sandboxapi.kyckglobal.com/apis/updatePayeeWithBeneficiary

Request:
IBAN Details

{
"payerId": "{{uat_payerid}}",
"payeeId": "Payeeeece07b0-84f3-4509-a14b-0e8ab2a3a23d",
"account": {
"iban": "ES0200492666702094515427"
},
"firstName": "Brad",
"lastName": "Bene test",
"phone": "",
"address": "AV JANDIA S-N APDO. 00000",
"region": "Madrid",
"city": "Madrid",
"postalCode": "35625",
"classification": "Individual",
"paymentMethod": "E"
}

Routing/Account Number Details
{
"payerId": "{{uat_payerid}}",
"payeeId": "Payeeeece07b0-84f3-4509-a14b-0e8ab2a3a23d",
"account": {
"routingCode": "004958786",
"destinationCountry": "ES",
"accountNumber": "2416015745"
},
"firstName": "Brad",
"lastName": "Bene test",
"phone": "",
"address": "AV JANDIA S-N APDO. 00000",
"region": "Madrid",
"city": "Madrid",
"postalCode": "35625",
"classification": "Individual",
"paymentMethod": "E"
}
Response (success):
{
"success": true,
"message": "Payee profile successfully Updated.",
"warnings": []
}

C.3 Update Payee Account Allocation

NOTE: Sum of allocations in the allocation object must equal 0 or 100!

Switching Account Allocation From One Account to Another

Endpoint:

PUT –apis/singlePayeeUpdate

Request Body:

{
"payerId": "{{payerId}}",
"payeeId": "{{payeeId}}",
"allocationWithAccountId": [
{
"payeeDisbursementAccountId": 1,
"allocation": 100
},
{
"payeeDisbursementAccountId": 2,
"allocation": 0
}
]
}

Splitting Account Allocation across Payee Accounts

Endpoint:

PUT –/apis/singlePayeeUpdate

Request Body:

{
"payerId": "{{payerId}}",
"payeeId": "{{payeeId}}",
"allocationWithAccountId": [
{
"payeeDisbursementAccountId": 1,
"allocation": 50
},
{
"payeeDisbursementAccountId": 2,
"allocation": 50
}
]
}

C.4 Soft Delete Payee

Endpoint:

POST – /apis/payerPayeeUpdateStatus

Request Body:

{
"payeeId": "[payeeId]l",
"payerId": "[payerId]",
"payeeDisabled": true
}