Linking Payee Accounts

Linking Payee Accounts APIs

Business Logic

This API includes the following processing logic:

  • Idempotent Check -- If the account number is already linked with the given customer, the API returns the existing link information. Otherwise, it creates a new record.
    • Note: For an external card, an Idempotent check is performed based on Program Code, Customer Token, Account Number, Expiry Month, or Expiry Year.
    • For a GreenDot account, an Idempotent check is performed based on Program Code, Customer Token, or Account Token.
  • Checking Eligibility
    • We verify that the target card BIN is eligible for a Fast Funds transfer, using the MasterCard send or Visa Direct gateways, depending on the partner configuration.
    • Note: Card will be eligible for fund transfer if receiving eligibility = true and funds availability = IMMEDIATE.
  • Database Encryption Levels -- These include:
    • AccountNumber
    • ExpiryMonth
    • ExpiryYear
  • Status
    • Link Profile status is InActive upon creating a link for the first time. After creating a successful first transfer, the link status changes to Active.
    • Validation can occur on the Expiry month and year while creating/updating the link information.

Create Transfer

Create a transfer API to unify customer creation, account linking, setup linkage, and transfer in one.

Syntax / URL

POST /programs/{programCode}/transfers

Request

Request Parameters

FieldDataTypeDescriptionRequired
transferIdentifierGUIDIf the transaction is initiated through the Transfers API, the transferIdentifier that uniquely identifies the initiating transfer is included.yes
transferTypeTransferTypeTwo new transfer types to be added for Harmony:

InPerson P2P (enables no linked target identifier to be provided, only allows transferendpointtype to be “card”

Visa+Send (enables a Visa+ payname link to be in the target identifier field). Routes to Fiserv endpoint for Harmony program code.

existing Transfer type “PartnerP2P” should be used for remote / offline P2P between two Samsung Wallet users
yes
partnerReferenceDatastringOptional. When a valid disbursementExternal is processed, the partner can optionally provide information in the partnerReferenceData field which can be matched to the funding transfer request along with the corresponding transaction. Upon request, the partnerReferenceData can be included in the settlement report.

Note: Including the partnerReferenceData field in the request enables the partner to cross reference the report information with internal records.
no
InitiatorstringThis field contains the ID of the funding source account.no
transferRouteTransferRouteContains the information for a POST Transfer call involving a new source and target.yes
fraudDataFraudDataAdditional information for dealing with charge backs. The following data field are now identified and confirmed with Harmony and Fraud teams to be passed in this field:

- "PIN" or "FINGERPRINT" as String

- Samsung wallet creation date

- Device Hardware ID

- Last 4 digits of the phone number.

- UTC Timestamp of the last spend date with this card in the wallet (sender)

- UTC Timestamp of the Card provisioning on the Wallet
no

Elements in FraudData

FieldDataTypeDescriptionRequired
AuthenticationTypestringType of the Authentication user did in device to initiate the transfer.
"PIN" or "FINGERPRINT" as String

As of now, only these values are allowed:

“PIN”

”FINGERPRINT”
no
WalletCreationDateDateTimeSamsung wallet creation date
DateTime in UTC format when the transaction Wallet was created
no
DeviceIDstringDevice Hardware IDno
Last4Phonestringlast 4 digits of the phone numberno
LastSpendDateDateTimeUTC Timestamp of the last spend date with this card in the wallet (sender)no
CardProvisioningDateDateTimeUTC Timestamp of the Card provisioning in the WalletNote: one of these needed: TargetTransferEndpoint.identifier, or encryptedGFTProfile, or encryptedCustomer

TransferRoute

Field NameDataTypeDescriptionRequired
transactionAmountstringContains the amount to transfer.yes
transactionDescriptionstringDescription display in both source and target transaction historyno
sourceTransferEndpointTransferEndpointRepresents the source of the funds. Will be the cardlink to the preferred debit card in the Samsung wallet.no
targetTransferEndpointTransferEndpointRepresents the target of the funds. Will be DPAN data or linked account ID for Samsung P2P or remotely P2Pno
eCommTransactionIdentifierstringThis is an option field where partner will pass it to us to relate to Fiserv to send to Visa/MC. In case of P2P or Remote P2P this will be passed from Samsung.Conditional
encryptedCardAuthenticationDataencryptedCardAuthenticationDataWhenever Sender value is DPAN then cryptogram value will be passed in this encrypted format and is Mandatory.Conditional

TransferEndpoint

Field NameDataTypeDescriptionRequired
transferEndpointTypeTransferEndpointTypeRepresents the target type of the funds transfer.Yes
IdentifierGUIDTarget linked account ID if a linked account, or blank and replaced with card data blob for in-person P2P with the target DPAN/FPAN and expiration dateConditional
currencyOnly USDis supported at this time.Yes
encryptedPaymentInstrumentencrypted card data. See PaymentInstrumentNo
encryptedCustomerencrypted user data. See CustomerNo

TransferType
InPersonP2P
TransferEndpointTypeP2P Type
CardP2P Target
AccountP2P Source

FraudData

"fraudData": {    
    "authenticationType": "PIN",    
    "walletCreationDate": "2024-11-21T07:40:55.543Z",    
    "deviceID": "string",    
    "last4Phone": "string",    
    "lastSpendDate": "2024-11-21T07:40:55.543Z",    
    "cardProvisioningDate": "2024-11-21T07:40:55.543Z"  
}

CardAuthenticationData

Field NameDataTypeDescriptionFormatValues AllowedRequiredNotes
cardHolderAuthenticationVerificationStringThis is the cryptogram value which is generated based on Fiserv specification related to MasterCard/Visa.28 charactersBase64 encrypted stringConditionalIf the Value of the card passed in Transfer is the DPAN then this is Mandatory.

Example Plain text value before encryption as in the Transfer API payload under encryptedCardAuthenticationData

"cardAuthenticationData": {
"cardHolderAuthenticationVerification": "AAABBJg0VhI0VniQEjRWAAAAAAA="},

Example of request of Harmony in-person P2P mobile phone tap to Transfer

 
{
  "transferIdentifier": "27e91d46-d103-4f26-a4a8-2d823fcf2523",
  "transferType": "InPersonP2P",
  "initiator": "", -- customer token, PIID 
  "partnerReferenceData": "",
  "transferRoute": {
    "transactionAmount": "99",
    "transactionDescription": "Samsung P2P",
    "sourceTransferEndpoint": {
      "transferEndPointType": "account",
      "identifier": "e4b06240-b719-4c76-87c3-961f515e33eb",  -- Samsung source linked DPAN ID in Wallet
      "currency": "USD",
      "ecommTransactionIndicator": "07",
      "encryptedCardAuthenticationData": {
        "version": "EC_v1",
        "ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExwDdXm5e3P9+/nTAFW5Y+WJahmHhtbRlGwpmtoEJyiQCqBtC8NhQVsIVIq874XwY+8Yzk8LFCcdvoHn4zFwjMA==",
        "publicKeyHash": "PiRV5ko8JYGxAtcNb9WV4aVg7aXIp8EsstmeUqqWzT8=",
        "data": "DfAHBPjSNYP6umhaD9R0K4rNoQZpe/gWjwZs52o="
        }
    }
    "targetTransferEndpoint": {
      "transferEndPointType": "card",
      "identifier": "",  --- this is empty for mobile tap pay transfer
      "currency": "USD",
      "encryptedpaymentInstrument": {
        "version": "EC_v1",
        "ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExwDdXm5e3P9+/nTAFW5Y+WJahmHhtbRlGwpmtoEJyiQCqBtC8NhQVsIVIq874XwY+8Yzk8LFCcdvoHn4zFwjMA==",
        "publicKeyHash": "PiRV5ko8JYGxAtcNb9WV4aVg7aXIp8EsstmeUqqWzT8=",
        "data": "DfAHBPjSNYP6umhaD9R0K4rNoQZpe/gWjwZs52o="
      }      
   }, 
    "fraudData": {    
    "authenticationType": "PIN",    
    "walletCreationDate": "2024-11-21T07:40:55.543Z",    
    "deviceID": "string",    
    "last4Phone": "string",    
    "lastSpendDate": "2024-11-21T07:40:55.543Z",    
    "cardProvisioningDate": "2024-11-21T07:40:55.543Z"  
   }
}

Example of request of Samsung mobile phone remotely P2P Transfer

 
{
  "transferIdentifier": "27e91d46-d103-4f26-a4a8-2d823fcf2523",
  "transferType": "PartnerP2P",
  "initiator": "", -- customer token, PIID 
  "partnerReferenceData": "",
  "transferRoute": {
    "transactionAmount": "99",
    "transactionDescription": "Samsung P2P",
    "sourceTransferEndpoint": {
      "transferEndPointType": "account",
      "identifier": "e4b06240-b719-4c76-87c3-961f515e33eb",  -- source linked DPAN ID in sending profile Samsung Wallet
      "currency": "USD",
      "ecommTransactionIndicator": "07",
      "encryptedCardAuthenticationData": {
        "version": "EC_v1",
        "ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAExwDdXm5e3P9+/nTAFW5Y+WJahmHhtbRlGwpmtoEJyiQCqBtC8NhQVsIVIq874XwY+8Yzk8LFCcdvoHn4zFwjMA==",
        "publicKeyHash": "PiRV5ko8JYGxAtcNb9WV4aVg7aXIp8EsstmeUqqWzT8=",
        "data": "DfAHBPjSNYP6umhaD9R0K4rNoQZpe/gWjwZs52o="
      }
    }
    "targetTransferEndpoint": {
      "transferEndPointType": "account",
      "identifier": "9efce52b-ccf6-4944-bdad-30dd9f41c900",  --- The cardlink of the receiving DPAN ID in receiving profile Samsung Wallet
      "currency": "USD"
     
   }, 
  "fraudData": {
   "authenticationType": "FINGERPRINT",    
    "walletCreationDate": "2024-11-21T07:40:55.543Z",    
    "deviceID": "string",    
    "last4Phone": "string",    
    "lastSpendDate": "2024-11-21T07:40:55.543Z",    
    "cardProvisioningDate": "2024-11-21T07:40:55.543Z"  
    }
}

Response

Response Code

HttpCode: 201

TransferStatus
Pending
Completed
Failed
Declined
Authorized
Voided

Transfer Statuses

Transfer StatusReasonTransferStatusHttp Verb
88DeclinedPost, Get
91DeclinedPost, Get
89DeclinedPost, Get
8DeclinedPost, Get
105DeclinedPost, Get
106 AFTAuthorizedOCTCompletedAuthorizedPost, Get
93DeclinedPost, Get
87DeclinedPost, Get
82DeclinedPost, Get
12DeclinedPost, Get
10DeclinedPost, Get
85DeclinedPost, Get
11DeclinedPost, Get
4DeclinedPost, Get
3PendingPost, Get
15 SystemErrorFailedPost, Get
107 TimeoutReversedPending(Declined)Post, Get
22 TransactionDeclinedDeclined(Void)Post, Get
21 TransactionFailedFailedPost, Get
104Post, Get
2 TransferCompletedCompletedPost, Get
94 TransferVoidedDeclinedPost, Get
98 TransferVoidFailedDeclinedPost, Get

Sender

Field NameDataTypeDescriptionRequired
identifierstringSender’s customerTokenno
linkIdstringSender’s linked account idno
last4PANstringno
bankstringno
associationstringno

Receiver

Field NameDataTypeDescriptionRequired
identifierstringIf DPAN passed has a PPID (Samsung Profile ID), then this is looked up and provided back in this fieldno
last4PANstringno
bankstringno
associationstringno
payNamestringno
programstring“Debit”, “Credit”no
identifierstring
linkIdstring

Completed Transfer response example

HttpCode: 201

Check Bin Eligibility

API to get Eligibility of Bin.

Syntax / URL

POST /v1/programs/{programCode}/binEligibility

Request

Request Header

FieldRequired
(Y/N/C)
DescriptionFormatValues Allowed
ProgramCodeYPartner program codestringa-z, A-Z, hyphen, underscore, 0-9

Request Parameters

Field NameDataTypeDescriptionFormatValues AllowedRequiredRequirement
BinsBinList of Binstring0-9yesN/A
BinStringBinstring0-9yesMust be 1 - 8 characters long.

Request Body

{
  "Bins":[
  {
    Bin:"12345678"
  }
  ] 
}

HTTP Status Codes

HTTP Status CodeResponse Message
200Success
500Server Error

Response

Response Parameters

Response

FieldDescriptionFormatValues Allowed
BinEligibleListlist of BinEligibleBinEligible

BinEligible object

FieldDescriptionFormatValues Allowed
BinBin numberstringa-z, A-Z (Length should be either 6 or 8 )
BinStatusstatus of binstringa-z, A-Z
bankstringa-z, A-Z
associationstringa-z, A-Z
Programstringa-z, A-Z

BinStatus

BinStatusDescription
Eligiblethe bin number is available
Ineligiblethe bin number is not available
Invalidthe bin number is not valid

Response Body

{
  "bins": [
    {
      "bin": "12345678",
      "binStatus":"Eligible"
      "bank": "Chase Bank",
      "program": "Debit"
      "association":  "Visa"
    }
  ],
  "responseDetails": [
    {
      "code": 0,
      "subCode": 0,
      "description": "string"
    }
  ]
}