Instant Transfer Service
Instant Transfer Service APIs can be used for actions such as moving funds in near real-time to any eligible debit card.
Overview
For the Instant Transfer Service, there are two types of API flows, both of which are built based on Green Dot's Global Fund Transfer service:
- Standard Flow
- Single Phase Commit
The API Endpoints section below describes the APIs for both flows. For other related information, refer to these sections in that documentation:
- Crypto Primer for Banking as a Service
- OAuth 2.0 Authentication Workflow
- Valid/Invalid Character Constraints
Standard Flow Transfers
The standard Instant Transfer Model to move funds in near real-time to any eligible debit card involves the following three API calls:
- Create Customer Profile API (only once per recipient)
- Link Card API (only once when linking a new source account[i] or destination account, or when updating a destination account information)
- Transfer API (per transfer transaction, between individual accounts for A2A/P2P transfers, and for B2C disbursements, from the partner’s disbursing account to the recipient’s debit card account)
To accomplish this, the partner needs to call the referenced APIs in the API Reference page to complete each step while creating and linking a customer for the first time. After the customer profile is created, the Link Card API links multiple cards to that profile. Finally, after the linking is established, the partner can call the Transfer API to initiate a transfer.
Note:
- All responses are real-time and no Webhooks are generated in this model.
- Green Dot stores encrypted user and card data and uses tokens in the API calls.
A detailed discussion of these APIs is detailed below.
Instant Transfer Service API Endpoints
Create Customer Profile API
This API creates a recipient customer profile in the Green Dot instant transfer system. As part of that, the customer information goes through Green Dot's verification process configured for this partner before initiating any further API calls, ensuring all required information was passed and there are no OFAC or compliance problems with the recipient. The profile is needed before a customer links with an external card. The same customer profile can have multiple card accounts linked to it, and the target card accounts must always be linked to a target receiving customer.
Business Logic
- CustomerToken – If this field is left blank
- When this field is mandatory, the partner must provide a unique value.
- When this field is optional and the request contains a CustomerToken value, the same value is used. Otherwise, the Instant Transfer Service generates a GUID as the CustomerToken.
- Idempotent Check -- This check is based on the CustomerToken. If the request contains a value that already exists in the database, it returns the Record already exists error.
- DB Level Encryption -- This encryption is based on DateOfBirth.
- CustomerID in DB -- As per Green Dot standards, the CustomerID is a GUID that the Instant Transfer service generates.
API Call Structure
POST /programs/{programCode}/externalAccounts
Sample Request Body
{
"salt": "eb6c967d-765a-4b18-9a6e-d4eb4df69efa",
"customerToken": "eb6c967d-765a-4b18-9a6e-d4eb4df69efa",
"encryptedData": {
"version": "string",
"ephemeralPublicKey": "string",
"publicKeyHash": "string",
"data": "string"
}
}
Sample Encrypted Data (JSON)
{
"firstName": "string",
"lastName":"string",
"middleName":"string",
"email": "[email protected]",
"phoneNumber": "1234567890",
"dateOfBirth": "yyyy-mm-dd",
"address":{ "addressLine1": "string",
"addressLine2": "string",
"city": "string",
"state": "XX",
"zipcode": "12345"
},
}
Response Messages
HTTP Status Code | Response Message |
---|---|
201 | Customer profile created successfully |
401 | Unauthorized access, wrong token access or expired |
502 | Service unavailable, try again later or contact IT support |
503 | Server Error |
Sample Response Body
{
"customerToken": "eb6c967d-765a-4b18-9a6e-d4eb4df69efa",
"status": "Pending",
"responseDetails": [
{
"code": 0,
"subCode": 0,
"description": "string",
"url": "string"
}
]
}
Link Card API
After a recipient customer profile is created, the Link Card API creates links to target debit cards so they can be used as destinations for money movement transfers by either the person doing an A2A transfer or as the desired target account for a recipient of B2C disbursements.
Note: FundingType must = Card (debit cards)
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.
API Call Structure
POST /programs/{programCode}/externalAccounts/customers/{customerToken}/linkCard
Sample Request Body
{
"salt": "62ea6192-1b84-4107-864e-c96f494bbaff",
"encryptedData": {
"version": "EC_v1",
"ephemeralPublicKey": "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAElQYeCVWEp3dm2AnNN6hfh7B6BOBCUSKFETY7Ls0Rc/JS7NvNqKuXeSwX3OiBd6TdhjGISa+VSdytefwjV0doyA==",
"publicKeyHash": "t+rDLgzIWeXCY9qGd7VW6yypnJ3VqKUXVEYdhL/Q7Lo=",
"data": "k28+pf0bUw4cR4aC0CgASxSVLZdOuNcuNjhDgatQz7C/c0D/rC/KDPMA+AVZscWf/mHs0HeII0tZxNmKkJERrQ/EfBq6AbViH3lfvwokhbtr16LVh4GcW6ahJWTvIbyKWQAs2MAkgu5yu8D6DCHoEhGy2QbnAaqa6jVf7Uldb6xlLq6jf4MwNDUYSsMH2rqnuv8xaj8vwoSwm3BvKyojuzMwHh5xRAE8fdELuLiZa7PVav2kW8GU0G0Fmgre37mIK/6znWIN01bfD2rYAs2tBABdf1lduD2uthEIR7kUR0xwV3aK6+ErS2sJthlGOKUOoYVBJzgyFrqsfFBXbuNayX1EKkhTV9+HFhH3TafKrPSzpsBQPNaJCo59vMWX9opatFIWmN1rWFTOty95DG4zJ1urXt9KhXw7GptM0K82sTzq81VyHL9xTXQZnHt/4Zwvo+JxF6ejRaWM9p0HYCMr5Ln6dpWWWBQFRoZ8aT+Qdot5dywDZS3uEKqSJbLbJRg+hXsmXqEYkhc3yLs1erw2mgo="
}
}
Sample Encrypted Data (JSON)
{
"firstName": "string",
"lastName": "string",
"middleName": "string",
"nickName": "string",
"accountNumber": "string",
"expiryMonth": "string",
"expiryYear": "string",
"address": {
"addressLine1": "string",
"addressLine2": "string",
"city": "string",
"state": "string",
"zipCode": "string"
},
}
HTTP Status Code | Response Message |
---|---|
201 | Link created successfully |
400 | Missing or incorrect parameter |
404 | Not found |
500 | Server Error |
Response Body
{
"link": {
"linkId": "00000000-0000-0000-0000-000000000000"
},
"responseDetails": [
{
"code": 0,
"subCode": 0,
"description": "Success",
"url": "http://tbd"
}
]
}
Delete Link Card API
When a customer no longer needs to be linked with a card, the Delete Link Card API will remove this link.
API Call Structure
DELETE programs/{programCode}/externalAccounts/customers/{CustomerToken}/linkCard/{linkId}
Response Messages
HTTP Status Codes | Response Message |
---|---|
200 | Link was deleted successfully |
400 | Bad request when a deleted link attempts to initiate any transaction |
401 | Unauthorized access, wrong token access or expired |
503 | Service unavailable, try again later or contact IT support |
Transfers API
The Transfers API allows partners to enable their customers to move funds in near real-time from a Green Dot-issued account, a third party account, or a central disbursement payout account, and posting to an external account. We have two formats of the Transfer API for instant transfers to debit cards:
- Green Dot BaaS Account partners
- Green Dot Network or Money Movement only partners, please go to the related section below the Transfers API
API Call Structure
POST /programs/{programCode}/transfers
This endpoint is used to transfer funds from a program-funding source to a consumer account. The transferType value differentiates the transaction from a B2C, A2A, or P2P.
Note:
- For B2C Disbursements, Use transferType as DisbursementExternal
- For A2A Transfers transferring from a Green Dot BaaS account, use transferType as A2AOut
For B2C transfers, a configured account is required for the organization providing the funds. A static account ID is assigned, which the partner is expected to pass in the transfer request.
For A2A transfers from a Green Dot-issued account, the partner should pass the Green Dot Bank Account ID as the source identifier in the transfer request.
Sample Request Body
{
"transferIdentifier": "d8ef71d0-bbfc-4d02-823c-821cf0cd2d89",
"transferType": "A2AOut",
"transferAuthorizationType": "execute",
"partnerReferenceData": "",
"initiator": "FED00D17-01EB-40E1-86F9-3E9457F6C82C",
"transferRoute": {
"transactionAmount": 20,
"sourceTransferEndpoint": {
"transferEndpointType": "ProgramFundingSource",
"identifier": "FED00D17-01EB-40E1-86F9-3E9457F6C82C",
"currency": "USD"
},
"targetTransferEndpoint": {
"transferEndpointType": "card",
"identifier": "32A7FC9A-9502-4650-ACB9-C939E1F34DAA",
"currency": "USD"
}
},
"fraudData": {
"key": "string",
"key": {"prop1":"test",
"prop2":"BaaS"
}
}
}
Request Body Field Definitions
Field | Description |
---|---|
transferIdentifier | If the transaction is initiated through the Transfers API, the transferIdentifier that uniquely identifies the initiating transfer is included. |
transferType | Use transferType A2AOut for Debit Card transfers. Use TransferType DisbursementExternal for B2C Disbursements. |
transferAuthorizationType | This field must = execute. This is the only acceptable value. |
partnerReferenceData | Optional. 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. |
Initiator | Optional. This field contains the ID of the funding source account. |
transferRoute | Contains the information for a POST Transfer call involving a new source and target. |
transactionAmount | Contains the amount to transfer. |
sourceTransferEndpoint | Represents the source of the funds. |
transferEndpointType | Use ProgramFundingSource as the value. |
identifier | Use the funding source account ID. Use Greendot Account ID for A2A. |
currency | · If a currency code is provided in the request payload, it must be a valid 3-character ISO code and be valid for the program for which the call is made. · Currency is optional and will default to USD if not provided. · Only USD is supported for all programs. |
targetTransferEndpoint | Represents the target of the funds. |
transferEndpointType | Use card for DisbursementExternal and A2AOut. |
Identifier | The link token of the applicable target account. |
currency | Only USD is supported at this time. |
Response Messages
HTTP Status Code | Response Message |
---|---|
201 | Transfer successful |
400 | Missing or incorrect parameter |
404 | Not found |
500 | Server error |
Sample Response - A2A Out
{"transfer":{"transferIdentifier":"d8ef71d0-bbfc-4d02-823c-821cf0cd2d89","transferStatus":"completed"},"responseDetails":[{"code":0,"subCode":0,"description":"Success","url":"http://tbd"}]}
Response Parameters - A2AOut
Field | Description |
---|---|
transfer | Contains the returned information in response to the POST /transfer call. |
transferIdentifier | The unique transfer ID. |
transferStatus | Describes the status of the transfer. Values include: - Completed - Pending |
Retry Process
How it Works
If POST/transfers are called when a timeout with a downstream service has occurred:
- The HTTP response to the partner is 202. This indicates the Disbursement request is correctly pending a retry.
- Initially, the transfer status is pending and the Retry service attempts to obtain the latest transaction status exponentially, thus increasing the maximum wait time between retries to 24 hours. Interval retry time is expressed in minutes. For example: 1,1,2,3,5,8,13 and so on.
- If the transaction has not completed successfully after 24 hours, the OCC team needs to update the status from pending to failed. An alert is triggered if there are more than 24 transactions in a pending status at any point of time.
Valid/Invalid Character Constraints
Note: Invalid characters are listed in bold. Anything outside the range is considered invalid, too.
Ascii | Character | Allowed in Partner Reference Data |
---|---|---|
32 | space | Y |
33 | ! | Y |
34 | " | Y |
35 | # | Y |
36 | $ | Y |
37 | % | Y |
38 | & | Y |
39 | ' | Y |
40 | ( | Y |
41 | ) | Y |
42 | * | Y |
43 | + | Y |
44 | , | N |
45 | - | Y |
46 | . | Y |
47 | / | Y |
48 | 0 | Y |
49 | 1 | Y |
50 | 2 | Y |
51 | 3 | Y |
52 | 4 | Y |
53 | 5 | Y |
54 | 6 | Y |
55 | 7 | Y |
56 | 8 | Y |
57 | 9 | Y |
58 | : | Y |
59 | ; | N |
60 | < | Y |
61 | = | Y |
62 | > | Y |
63 | ? | Y |
64 | @ | Y |
65 | A | Y |
66 | B | Y |
67 | C | Y |
68 | D | Y |
69 | E | Y |
70 | F | Y |
71 | G | Y |
72 | H | Y |
73 | I | Y |
74 | J | Y |
75 | K | Y |
76 | L | Y |
77 | M | Y |
78 | N | Y |
79 | O | Y |
80 | P | Y |
81 | Q | Y |
82 | R | Y |
83 | S | Y |
84 | T | Y |
85 | U | Y |
86 | V | Y |
87 | W | Y |
88 | X | Y |
89 | Y | Y |
90 | Z | Y |
91 | [ | Y |
92 | backslash Y | Y |
93 | ] | Y |
94 | ^ | Y |
95 | _ | Y |
96 | ` | N |
97 | a | Y |
98 | b | Y |
99 | c | Y |
100 | d | Y |
101 | e | Y |
102 | f | Y |
103 | g | Y |
104 | h | Y |
105 | i | Y |
106 | j | Y |
107 | k | Y |
108 | l | Y |
109 | m | Y |
110 | n | Y |
111 | o | Y |
112 | p | Y |
113 | q | Y |
114 | r | Y |
115 | s | Y |
116 | t | Y |
117 | u | Y |
118 | v | Y |
119 | w | Y |
120 | x | Y |
121 | y | Y |
122 | z | Y |
123 | { | Y |
124 | | | N |
125 | } | Y |
126 | ~ | Y |
Realtime API Response Codes (valid for any APIs on this page)
Response Code Description | Response Code | Response Sub-Code Description | Response Sub-Code | HTTP Status Code |
---|---|---|---|---|
ValidationFailed | 4200 | Missing first name | 900 | 400 |
ValidationFailed | 4200 | Missing last name | 901 | 400 |
ValidationFailed | 4200 | Invalid first name value was specified | 906 | 400 |
ValidationFailed | 4200 | Invalid last name value was specified | 907 | 400 |
ValidationFailed | 4200 | Invalid ZipCode | 910 | 400 |
ValidationFailed | 4200 | Invalid Address Line1 | 911 | 400 |
ValidationFailed | 4200 | Invalid Address Line2 | 912 | 400 |
ValidationFailed | 4200 | Invalid State | 913 | 400 |
ValidationFailed | 4200 | Invalid City | 914 | 400 |
ValidationFailed | 4200 | Missing Program Code | 916 | 400 |
ValidationFailed | 4200 | Missing Account number | 917 | 400 |
ValidationFailed | 4200 | Missing Expiry Month | 918 | 400 |
ValidationFailed | 4200 | Missing Expiry Year | 919 | 400 |
ValidationFailed | 4200 | Invalid Account Number | 921 | 400 |
ValidationFailed | 4200 | Invalid Transfer Id | 924 | 400 |
ValidationFailed | 4200 | Missing Transfer Type | 925 | 400 |
ValidationFailed | 4200 | Missing Source Link Id | 927 | 400 |
ValidationFailed | 4200 | Invalid Currency | 929 | 400 |
ValidationFailed | 4200 | Invalid Transaction Description | 930 | 400 |
ValidationFailed | 4200 | Invalid CVV | 931 | 400 |
ValidationFailed | 4200 | Invalid Expiry Year | 933 | 400 |
ValidationFailed | 4200 | Invalid Expiry Month | 934 | 400 |
ValidationFailed | 4200 | Invalid Transfer Type | 935 | 400 |
ValidationFailed | 4200 | Invalid Source Link Id | 938 | 400 |
ValidationFailed | 4200 | Invalid Transaction Amount | 940 | 400 |
ValidationFailed | 4200 | Invalid Program Code | 943 | 400 |
ValidationFailed | 350 | X-GD-Request ID must be a GUID | 400 | |
ValidationFailed | 200 | Missing Request Id | 400 | |
ValidationFailed | 4200 | Invalid Initiator | 948 | 400 |
ValidationFailed | 4200 | Missing Currency | 949 | 400 |
ValidationFailed | 4200 | System Error - Business account status is pending | 966 | 400 |
ValidationFailed | 4200 | Invalid Target Customer Identifier | 975 | 400 |
ValidationFailed | 4200 | Missing Transfer Route | 994 | 400 |
ValidationFailed | 4200 | Missing Source Transfer Endpoint | 995 | 400 |
ValidationFailed | 4200 | Missing Target Transfer Endpoint | 996 | 400 |
ValidationFailed | 4200 | Missing CardInfo | 997 | 400 |
ValidationFailed | 4200 | Missing CustomerInfo | 998 | 400 |
ValidationFailed | 4200 | Missing Target Customer Identifier | 974 | 400 |
Transfer id exists | 4202 | Record already exists | 1502 | 200 |
OperationFailed | 4214 | SystemError | 1514 | 555 |
Success | 0 | Success | 0 | 201 |
Money Movement Only (GDN) Partners
For a Green Dot Partner not using Green Dot’s BaaS account services, please use the call below to execute instant transfers to any debit card.
API Call Structure
POST /programs/{programCode}/transfers/gft
Sample Request Body
{
"transferId":"0e38d18e-58b7-40cd-af2f-d173f1f82080",
"transferType":"DisbursementExternal",
"transferRoute":{
"transactionAmount":2.9,
"transactionDescription":"",
"partnerReferenceData": "",
"sourceTransferEndPoint":{
"transferEndPointType":"programFundingSource",
"identifier":"6C0536D0-AA9F-41B9-A74C-CCF01206F49E",
"currency":"USD"
},
"targetTransferEndPoint":{
"transferEndPointType":"card",
"identifier":"014CF701-AA90-4F2A-AE09-22ED10C727D6",
"currency":"USD"
}
}
}
Response Messages
HTTP Status Code | Response Message |
---|---|
201 | Transfer successful |
400 | Missing or incorrect parameter |
404 | Not found |
500 | Server error |
Sample Response Body
{
"transfer": {
"transferId": "f0be739c-1408-4611-bec7-cb2d2704a349",
"transferStatus": "Completed",
"transferStatusReason": "TransferCompleted",
"transactionDate": "2023-08-28T22:40:50.4859535-07:00",
"currency": "USD",
"transactionAmount": 2.9,
"totalFeeAmount": 0.04,
"totalTransactionNetAmount": 2.86,
"feeDetails": [
{
"feeType": "CustomerFee",
"feeAmount": 0.04
}
],
"processor": "MasterCardSend",
"network": "MoneySend"
},
"responseDetails": [
{
"code": 0,
"subCode": 0,
"description": "Success"
}
]
}
Single Phase Commit Transfers Endpoints
Single Commit API
URLs
https://{evn}.mul.secure2.greendot.com/enrollment/v1/api/flex/transfers/singlecommit
https://pie.mul.secure2.greendot.com/enrollment/v1/api/flex/transfers/singlecommit
https://prd.mul.secure2.greendot.com/enrollment/v1/api/flex/transfers/singlecommit
Sample Request Header Parameters
Field | Datatype | Required (Y/N) | Format | Description |
---|---|---|---|---|
Request-ID | string | Y | UUID | The request identifier (UUID format). |
x--Remapped-Authorization | string | Y | JWT | In the form of “Bearer {JWT }” |
Content-Type | string | Y | “application/json” |
Sample Request Body
{
"transferIdentifier": "4771cde6-e8ee-4458-8020-c905d704064f",
"transferType": "DisbursementExternal",
"initiator": "e4b06240-b719-4c76-87c3-961f515e33eb",
"transferdescription": "",
"transferRoute": {
"transactionAmount": 5,
"sourceTransferEndpoint": {
"transferEndPointType": "programFundingSource",
"identifier": "8EADF071-657B-4CFA-9FBA-7B77D77C3BE8",
"currency": "USD"
},
"targetTransferEndpoint": {
"transferEndPointType": "singlePhaseFunding",
"identifier": "6b5eed71-48d3-46e0-be44-4342c6826b60",
"currency": "USD",
"cardData": {
"expiration": {
"month": "12",
"year": "2022"
},
"firstName": "John",
"lastName": "Dee",
"address1": "123 Street",
"address2": "Apt 123",
"city": "Test",
"state": "AZ",
"zipCode": 12345
},
"userData": {
"firstName": "John",
"lastName": "Dee",
"zipCode": 12345
}
}
}
}
Request Body Parameters
Field | Datatype | Required (Y/N) | Format | Description |
---|---|---|---|---|
transferIdentifier | string | Y | GUID | If the transaction is initiated through the Transfers API, the transferIdentifier uniquely identifying the initiating transfer is included. |
transferType | string | Y | Max 50 characters | Use disbursementExternal. |
Initiator | string | N | Must be 36 characters | This is the account from which the transfer was initiated. It must be either the source or the target account. For a One Phase Commit Transfer, this is an optional field. If needed, the partner can pass the Payee Site ID. |
transferdescription | string | N | Max 100 characters | The transaction description. |
transferRoute | complex | Y | Contains the information for a POST transfer call involving a new source and new target. | |
transactionAmount | Decimal | Y | The transfer amount. | |
sourceTransferEndpoint | complex | Y | Represents the source of the funds. | |
transferEndpointType | string | Y | Max 50 characters | Use programFundingSource for disbursementExternal. |
sourceTransferEndpoint. identifier | string | Y | Must be 36 characters | The accountIdentifer of the partner’s Disbursement Business account. |
currency | string | Y | Must be 3 characters | If a currency code is provided in the request payload, it must be a valid 3-character ISO code and be valid for the program for which the call is being made. Note: Currently, only USD is supported for all programs. |
targetTransferEndpoint | complex | Y | Represents the target of the funds. | |
transferEndpointType | string | Y | Max 50 characters | targetTransferEndpoint. transferEndpointType as “singlePhaseFunding” |
targetTransferEndpoint. Identifier | GUID | Y | The External Card Identifier of the applicable account based on the transferEndpointType. For a Single Phase Commit, this will be the Payee Site ID. | |
encryptedCardData | Y | The encrypted card data. Refer to Encrypted Card Data Field Definitions. | ||
encryptedUserData | Y | The encrypted user data. Refer to Encrypted User Data Field Definitions. |
Encrypted Card Data Body
{
"CardData": {
"CardNumber": "string",
"Expiration": {
"CardExpirationMonth": "string",
"CardExpirationyear": "string"
},
"FirstName": "string",
"LastName": "string",
"AddressLine1": "string",
"AddressLine2": "string",
"City": "string",
"State": "string",
"ZipCode": "string"
}
}
Sample Encrypted Card Data Body
{
"CardData": {
"pan": "4111999999991234",
"expiration": {
"month": "12",
"year": "2020"
}
}
}
Encrypted Card Data Parameters
Field | Required (Y/N) | Description | Format | Values Allowed |
---|---|---|---|---|
cvv | N | Card verification value or security code. | 3-4 digits | 0-9 |
cardNumber | Y | Personal Account Number (PAN) on the customer card | 0-9 | |
expiration | Y | Card expiration date | MMYYYY | 0-9 |
firstName | Y | Cardholder’s first name | 2-35 Characters | a-z, A-Z, hyphen, space |
lastName | Y | Cardholder’s last name | 2-35 Characters | a-z, A-Z, hyphen, space |
address1 | Y | Customer address, line1 | Max 255 characters | , a-z, A-Z, 0-9, hyphen, space, /, period |
address2 | N | Customer address, line 2 | Max 255 characters | a-z, A-Z, 0-9, hyphen, space, /, period |
city | Y | City where customer lives | Max 50 characters | a-z, A-Z, hyphen, space |
state | Y | State where customer lives | Max 2 characters | A-Z, a-z |
zipCode | Y | Customer zip code | Max 5 digits | 0-9 |
Sample User Data Body
{
"UserData": {
"FirstName": "john",
"LastName": "doe",
"ZipCode": "91107"
}
}
User Data Parameters
Field | Required (Y/N/C) | Description | Format | Values Allowed |
---|---|---|---|---|
firstName | Y | Cardholder’s first name | 2-35 characters | a-z, A-Z, hyphen, space |
lastName | Y | Cardholder’s last name | 2-35 characters | a-z, A-Z, hyphen, space |
dateOfBirth | C | User’s date of birth | YYYY-MM-DD | Conditional value. Must be between 1901 and current year. |
zipCode | Y | User’s zip code | NNNNN | Must be 5 digits. |
Sample Single Commit Responses
Transfer Pending
Response:HTTP/1.1 201 Created
Date: Tue, 12 Apr 2022 19:47:33 GMT
Content-Type: application/json; charset=UTF-8
Content-Length: 121
Connection: keep-alive
x-correlation-id: be732974-aa3d-4b1b-aaea-5d64daf0b170
Strict-Transport-Security: max-age=31536000; includeSubdomains;
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
X-XSS-Protection: 1; mode=block
{
"transfer": {
"transferIdentifier": "c8b18a28-b87b-4c0f-ab77-87965c4c6199",
"transferStatus": "Pending"
}
}
Transfer Failed (HTTP 503)
This response indicates a timeout (HTTP 503) or internal exception.
{
"transfer": {
"transferIdentifier": "1d670075-a5bc-467d-856c-32ec44455fef",
"transferStatus": "failed"
},
"errors": [
{
"code": 4214,
"subcode": 1514,
"description": "system error"
}
]
}
Transfer Failed (HTTP 400)
This response indicates a data issue (HTTP 400) occurred.
{
"transfer": {
"transferIdentifier": "1d670075-a5bc-467d-856c-32ec44455fef",
"transferStatus": "failed"
},
"errors": [
{
"code": 4200,
"subcode": 945,
"description": "Invalid Request Id"
}
]
}
GET Transfer API
Partner Integration Environment URL
Production URL
Request Header Parameters
Field | Datatype | Required (Y/N) | Format | Description |
---|---|---|---|---|
Request-ID | string | Y | UUID | The request identifier (UUID format). |
x--Remapped-Authorization | string | Y | JWT | In the form of “Bearer {JWT }” |
Content-Type | string | Y | “application/json” |
URL Parameters
Field | Datatype | Required (Y/N) | Format | Description |
---|---|---|---|---|
externalAcctId | string | Y | GUID | Customer Payee Side ID. |
transferId | string | Y | GUID | The transferIdentifier that uniquely identifies the initiating transfer that will be included. |
Sample Request
GET https://qa.mul.secure2.greendot.com/enrollment/v1/api/flex/externalAccounts/acb07274-b4e8-446f-9ac5-c43fe117ec91/transfers/27e289ba-2002-492b-8497-db44b44bca6f HTTP/1.1
Accept-Encoding: gzip,deflate
x-Remapped-Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCIsImtpZCI6ImMzNmNlZGI4LTg3NTQtNDY1MS04NWYxLTY2NDI4ODY4YzAwZSJ9.eyJjbGllbnRpZCI6ImU1MWIyMDExYjNhMzRmYzE5Mzk0MTJkZWU4ZTRkOTIyIiwiaXNzIjoiaHR0cHM6Ly9ncmVlbmRvdC5jb20iLCJhdWQiOiJBbGwiLCJpYXQiOjE2MDI3ODMzMTYsImV4cCI6MjIzMzUwMzMxNn0.lT5Oeb1wL-cf8F15A4O7g8ixlrUYDV-GM-RIspQ5yUDp6NhVRCW7054nLvhyYYQIxiT5X1vKKA4QYLbSvcEMY1GxLUkSlassJRrqA8djucdpK5e9evGzN7knqQ3HR8arTLe8Ah6HrcznN_xbQ_UOvAvfLT8Sk7M3pIIUfEZhOtFyYtph4tJOmkJBsvU3yIBRlLb9k9Z4BhqCBftvQalIZ7RYIGJIQW6vX_fUQFKHI3-FjPkFXT3uOEzGr1LNyhHM5t31r525rZeuem5co1bXFiDaGBaRJbdNCMCxoNaM6e9CqzVcoupFW_u1jyPokFwIDLXrZtAzEn8RSBHA4QKVXg
X-Forwarded-For: 192.168.23.3
Request-ID: 5da118ce-29ef-4d86-81a4-2990ec1471fa
Content-Length: 0
Host: qa.mul.secure2.greendot.com
Connection: Keep-Alive
User-Agent: Apache-HttpClient/4.5.2 (Java/1.8.0_181)
Sample Response Body
{
"transfer": {
"transferId": "046D4980-6428-4CE4-9476-4755564F8517",
"transferStatus": "Completed",
"transactionDate": "Completed",
"currency": "USD",
"transactionAmount": "5.00",
"totalFeeAmount": "0.0",
"totalTransactionAmount": "5.00",
}
}
{
"responseDetails": [
{
"code": 0,
"subCode": 0,
"description": "string",
"url": "http://tbd"
}
]
}
Webhook Transfer Statuses
To notify a partner the result of a transfer, the GFT processor triggers transfer webhooks.
API Call Structure
POST https://yourendpoint.yourcompany.com/events/SinglePhaseTransfer
Webhook status types include:
- Completed - The transfer was successful.
- Failed - A system error occurred.
- Declined - The transfer was declined for one of the following reasons:
- The account was not eligible for transfer activity.
- The transfer request exceeded the transfer limit.
- The transfer was rejected due to fraud (OFAC).
- The transfer request was for less than the minimum transaction amount.
A sample of each type follows.
Sample Completed Transfer
{
"accounts": [
{
"accountIdentifier": "c63ff033-7df4-4bdf-a5aa-d8d1dfc4a05d",
"events": [
{
"eventIdentifier": "125d5986-4c07-4ab6-9c66-de3053e688a1",
"eventType": "singlePhaseTransfer",
"eventDateTime": "2022-03-14T17:10:08.129Z",
"singlePhaseTransfer": [
{
"transferIdentifier": "DBC79BB6-40D9-A63C-B69B-C7DBD9403CA6",
"transactionAmount": 5.0,
"transferStatus": " Completed",
"transferDateTime": "2022-03-11T23:13:13Z",
"response": {
"code": "0",
"subCode": "0",
"description": "success"
}
}
]
}
]
}
]
}
Sample Failed Transfer
{
"accounts": [
{
"accountIdentifier": "c63ff033-7df4-4bdf-a5aa-d8d1dfc4a05d",
"events": [
{
"eventIdentifier": "125d5986-4c07-4ab6-9c66-de3053e688a1",
"eventType": "singlePhaseTransfer",
"eventDateTime": "2022-03-14T17:10:08.129Z",
"singlePhaseTransfer": [
{
"transferIdentifier": "DBC79BB6-40D9-A63C-B69B-C7DBD9403CA6",
"transactionAmount": 5.0,
"transferStatus": "failed",
"transferDateTime": "2022-03-11T23:13:13Z",
"response": {
"code": "4200",
"subCode": "948",
"description": " InvalidTransferType"
}
}
]
}
]
}
]
}
Sample Declined Transfer
{
"accounts": [
{
"accountIdentifier": "c63ff033-7df4-4bdf-a5aa-d8d1dfc4a05d",
"events": [
{
"eventIdentifier": "125d5986-4c07-4ab6-9c66-de3053e688a1",
"eventType": "singlePhaseTransfer",
"eventDateTime": "2022-03-14T17:10:08.129Z",
"singlePhaseTransfer": [
{
"transferIdentifier": "DBC79BB6-40D9-A63C-B69B-C7DBD9403CA6",
"transactionAmount": 5.0,
"transferStatus": "declined",
" transferDateTime": "2022-03-11T23:13:13Z",
"response": {
"code": "4240",
"subCode": "1540",
"description": "Consumers monthly transaction limit reached"
}
}
]
}
]
}
]
}
Realtime API Response Codes
Response Code Description | Response Code | Response Sub-Code Description | Response Sub-Code | HTTP Status Code |
---|---|---|---|---|
ValidationFailed | 4200 | Missing first name | 900 | 400 |
ValidationFailed | 4200 | Missing last name | 901 | 400 |
ValidationFailed | 4200 | Invalid first name value was specified | 906 | 400 |
ValidationFailed | 4200 | Invalid last name value was specified | 907 | 400 |
ValidationFailed | 4200 | Invalid ZipCode | 910 | 400 |
ValidationFailed | 4200 | Invalid Address Line1 | 911 | 400 |
ValidationFailed | 4200 | Invalid Address Line2 | 912 | 400 |
ValidationFailed | 4200 | Invalid State | 913 | 400 |
ValidationFailed | 4200 | Invalid City | 914 | 400 |
ValidationFailed | 4200 | Missing Program Code | 916 | 400 |
ValidationFailed | 4200 | Missing Account number | 917 | 400 |
ValidationFailed | 4200 | Missing Expiry Month | 918 | 400 |
ValidationFailed | 4200 | Missing Expiry Year | 919 | 400 |
ValidationFailed | 4200 | Invalid Account Number | 921 | 400 |
ValidationFailed | 4200 | Invalid Transfer Id | 924 | 400 |
ValidationFailed | 4200 | Missing Transfer Type | 925 | 400 |
ValidationFailed | 4200 | Missing Source Link Id | 927 | 400 |
ValidationFailed | 4200 | Invalid Currency | 929 | 400 |
ValidationFailed | 4200 | Invalid Transaction Description | 930 | 400 |
ValidationFailed | 4200 | Invalid CVV | 931 | 400 |
ValidationFailed | 4200 | Invalid Expiry Year | 933 | 400 |
ValidationFailed | 4200 | Invalid Expiry Month | 934 | 400 |
ValidationFailed | 4200 | Invalid Transfer Type | 935 | 400 |
ValidationFailed | 4200 | Invalid Source Link Id | 938 | 400 |
ValidationFailed | 4200 | Invalid Transaction Amount | 940 | 400 |
ValidationFailed | 4200 | Invalid Program Code | 943 | 400 |
ValidationFailed | 350 | X-GD-Request ID must be a GUID | 400 | |
ValidationFailed | 200 | Missing Request Id | 400 | |
ValidationFailed | 4200 | Invalid Initiator | 948 | 400 |
ValidationFailed | 4200 | Missing Currency | 949 | 400 |
ValidationFailed | 4200 | System Error - Business account status is pending | 966 | 400 |
ValidationFailed | 4200 | Invalid Target Customer Identifier | 975 | 400 |
ValidationFailed | 4200 | Missing Transfer Route | 994 | 400 |
ValidationFailed | 4200 | Missing Source Transfer Endpoint | 995 | 400 |
ValidationFailed | 4200 | Missing Target Transfer Endpoint | 996 | 400 |
ValidationFailed | 4200 | Missing CardInfo | 997 | 400 |
ValidationFailed | 4200 | Missing CustomerInfo | 998 | 400 |
ValidationFailed | 4200 | Missing Target Customer Identifier | 974 | 400 |
Transfer id exists | 4202 | Record already exists | 1502 | 200 |
OperationFailed | 4214 | SystemError | 1514 | 555 |
Success | 0 | Success | 0 | 201 |
Webhook Transfer Status Codes
Message | Response Code | Sub Code | Description | Transaction Status |
---|---|---|---|---|
Success | 0 | 0 | Success | Completed |
ValidationFailed | 4200 | 900 | Missing first name | Failed |
ValidationFailed | 4200 | 901 | Missing last name | Failed |
ValidationFailed | 4200 | 903 | Missing ZipCode code | Failed |
ValidationFailed | 4200 | 906 | Invalid first name value was specified | Failed |
ValidationFailed | 4200 | 907 | Invalid last name value was specified | Failed |
ValidationFailed | 4200 | 910 | Invalid ZipCode | Failed |
ValidationFailed | 4200 | 911 | Invalid Address Line1 | Failed |
ValidationFailed | 4200 | 912 | Invalid Address Line2 | Failed |
ValidationFailed | 4200 | 913 | Invalid State | Failed |
ValidationFailed | 4200 | 914 | Invalid City | Failed |
ValidationFailed | 4200 | 915 | Invalid Country | Failed |
ValidationFailed | 4200 | 916 | Missing Program Code | Failed |
ValidationFailed | 4200 | 917 | Missing Account number | Failed |
ValidationFailed | 4200 | 918 | Missing Expiry Month | Failed |
ValidationFailed | 4200 | 919 | Missing Expiry Year | Failed |
ValidationFailed | 4200 | 921 | Invalid Account Number | Failed |
ValidationFailed | 4200 | 924 | Invalid Transfer Id | Failed |
ValidationFailed | 4200 | 925 | Missing Transfer Type | Failed |
ValidationFailed | 4200 | 927 | Missing Source Link Id | Failed |
ValidationFailed | 4200 | 929 | Invalid Currency | Failed |
ValidationFailed | 4200 | 930 | Invalid Transaction Description | Failed |
ValidationFailed | 4200 | 931 | Invalid CVV | Failed |
ValidationFailed | 4200 | 933 | Invalid Expiry Year | Failed |
ValidationFailed | 4200 | 934 | Invalid Expiry Month | Failed |
ValidationFailed | 4200 | 935 | Invalid Transfer Type | Failed |
ValidationFailed | 4200 | 938 | Invalid Source Link Id | Failed |
ValidationFailed | 4200 | 940 | Invalid Transaction Amount | Failed |
ValidationFailed | 4200 | 943 | Invalid Program Code | Failed |
ValidationFailed | 4200 | 948 | Invalid Initiator | Failed |
ValidationFailed | 4200 | 949 | Missing Currency | Failed |
ValidationFailed | 4200 | 952 | System Error - Missing Transaction Reference | Failed |
ValidationFailed | 4200 | 953 | System Error - Invalid Transaction Reference | Failed |
ValidationFailed | 4200 | 954 | System Error - Missing Sender User Profile Details | Failed |
ValidationFailed | 4200 | 955 | System Error - Missing Sender Account Details | Failed |
ValidationFailed | 4200 | 960 | System Error - Invalid Account Identifier | Failed |
ValidationFailed | 4200 | 962 | System Error - Transaction amount is less than Fee amount | Failed |
ValidationFailed | 4200 | 965 | TransferId already exist with different partner. Please try with new TransferId | Failed |
ValidationFailed | 4200 | 966 | System Error - Business account status is pending | Failed |
BusinessRuleFailure | 4200 | 971 | Transaction amount exceeds per transaction limit | Declined |
ValidationFailed | 4200 | 974 | Missing Target Customer Identifier | Failed |
ValidationFailed | 4200 | 975 | Invalid Target Customer Identifier | Failed |
BusinessRuleFailure | 4200 | 976 | Transaction exceeds per transaction limit count | Declined |
BusinessRuleFailure | 4200 | 977 | Transaction amount exceeds daily limit | Declined |
BusinessRuleFailure | 4200 | 978 | Transaction exceeds daily limit count | Declined |
BusinessRuleFailure | 4200 | 979 | Transaction amount exceeds weekly limit | Declined |
BusinessRuleFailure | 4200 | 980 | Transaction exceeds weekly limit count | Declined |
BusinessRuleFailure | 4200 | 981 | Transaction amount exceeds monthly limit | Declined |
BusinessRuleFailure | 4200 | 982 | Transaction exceeds monthly limit count | Declined |
ValidationFailed | 4200 | 983 | System Error - Missing Processor | Failed |
ValidationFailed | 4200 | 984 | System Error - Invalid Processor | Failed |
ValidationFailed | 4200 | 985 | Unable to verify Customer OFAC at this time. Please try again | Failed |
ValidationFailed | 4200 | 986 | Invalid Request | Failed |
Transaction Failed | 4200 | 987 | Account Not Eligible | Failed |
Transaction Failed | 4200 | 989 | Customer Is OFAC blocked | Declined |
Transaction Failed | 4200 | 990 | Customer Is OFAC partial match | Declined |
ValidationFailed | 4200 | 1000 | System Error - Missing Receiver User Profile Details | Failed |
ValidationFailed | 4200 | 1001 | System Error - Missing Receiver Account Details | Failed |
ValidationFailed | 4200 | 1001 | System Error – Missing Receiver Account Details | Failed |
Transfer id exists | 4202 | 1502 | Record already exists | We will return the existing transfer record status: - Pending - Completed - Failed - Declined |
OperationFailed | 4214 | 1514 | System Error | Failed |
MissingPaymentType | 4216 | 1516 | No Payment type configured for this partner | Failed |
InvalidPaymentType | 4217 | 1517 | Payment type configured for this partner is not supported | Failed |
NoPaymentProcessorConfigured | 4219 | 1519 | Cannot proceed transfer request - No Payment Processor is enabled for this partner | Failed |
MissingPartnerConfiguration | 4220 | 1520 | Cannot proceed transfer request - Partner configuration is not available | Failed |
AllPaymentProcessorDown | 4221 | 1521 | Cannot proceed transfer request - All the available Payment processors are down | Failed |
TransactionProcessingSuspended | 4222 | 1522 | Unauthorized access to Master Card Send | Failed |
Transaction Failed | 4223 | 1523 | No default account is defined for the consumer | Declined |
Transaction Failed | 4224 | 1524 | Card type is not supported for merchant | Declined |
Transaction Failed | 4225 | 1525 | Operation not allowed | Failed |
Transaction Failed | 4226 | 1526 | Country not supported for merchant | Failed |
Transaction Failed | 4227 | 1527 | Acquiring credential used for the funding transaction is no longer valid | Failed |
Transaction Failed | 4229 | 1529 | Card declined | Declined |
Transaction Failed | 4230 | 1530 | Fraud detected | Declined |
Transaction Failed | 4231 | 1531 | Card expired | Declined |
Transaction Failed | 4232 | 1532 | Per transaction maximum amount limit reached | Declined |
Transaction Failed | 4233 | 1533 | Exceeded Daily Load Amount | Declined |
Transaction Failed | 4234 | 1534 | Does Not Meet Per Transaction Load Amount | Declined |
Transaction Failed | 4235 | 1535 | Exceeded Monthly Load Amount | Declined |
AuthenticationFailed | 4236 | 1536 | Authentication Failed | Failed |
Account is not eligible | 4237 | 1537 | Partner has exceeded the daily limit configured in the system | Declined |
Account is not eligible | 4238 | 1538 | Per transaction maximum amount limit reached | Declined |
Account is not eligible | 4239 | 1539 | Amount is less than the minimum configured for the partner | Declined |
Account is not eligible | 4240 | 1540 | Consumers monthly transaction limit reached | Declined |
Account is not eligible | 4241 | 1541 | Per transaction maximum amount limit for the transaction type | Declined |
Account is not eligible | 4242 | 1542 | Amount is less than the minimum allowed for the transaction type | Declined |
Account is not eligible | 4243 | 1543 | Account Type not supported for the partner | Declined |
Account is not eligible | 4244 | 1544 | Partner not on boarded for the network to reach account | Declined |
Account is not eligible | 4245 | 1545 | Currency is not supported for the account | Declined |
Account is not eligible | 4246 | 1546 | Country is not supported for the account | Declined |
Declined | 4247 | 1547 | Transaction Declined | Declined |
Failed | 4249 | 1549 | Transaction Failed | Failed |
Transaction Failed | 4250 | 1550 | Unauthorized access to Visa Direct | Failed |
Transaction Failed | 4252 | 1552 | Transaction Failed in BaaS due to System error | Failed |
Declined | 4254 | 1554 | System Error-Duplicate adjustment identifier | Declined |
Transaction Failed | 4255 | 1555 | BaaS Account is Closed | Declined |
Transaction Failed | 4256 | 1556 | BaaS Account is Locked | Declined |
Transaction Failed | 4257 | 1557 | BaaS Account is Pending | Declined |
Declined | 4258 | 1558 | System Error-Program code not found | Declined |
Transaction Failed | 4260 | 1560 | System Error-Invalid Input | Failed |
Transaction Failed | 4261 | 1561 | System Error-Missing input value | Failed |
Transaction Failed | 4262 | 1562 | System Error-Duplicate value | Failed |
Transaction Failed | 4265 | 1565 | Load Not Allowed | Declined |
Transaction Failed | 4272 | 1572 | Invalid Merchant | Failed |
Transaction Failed | 4273 | 1573 | Visa Direct Limit Exceeded | Declined |
Transaction Failed | 4274 | 1574 | Transaction was rejected by VisaNet due to a message validation error. | Failed |
Updated 10 months ago