Webhooks Overview
Webhooks Overview
Webhooks (also called Publish Notifications, or PNs) are how the BaaS platform delivers real-time event notifications to your system. Rather than polling for state changes, you register an HTTPS endpoint and Green Dot POSTs a structured payload to it whenever a relevant event occurs — a card transaction, an account status change, an ACH update, and so on.
Your endpoint is configured per event type, so you can route different event categories to different services, or fan them all into a single handler. Either approach is valid.
How It Works
- An event occurs on the platform (e.g., a POS authorization, an account status change).
- The BaaS platform constructs a webhook payload and POSTs it to your pre-configured endpoint over HTTPS.
- Your endpoint processes the payload and responds with HTTP
200or201and a valid JSON body (see Response Format below). - Green Dot logs the result. Non-
2xxresponses trigger the retry logic described below.
PCI note: Webhook payloads never include full PANs, CVVs, PINs, or expiration dates. Only the BIN and last 4 digits of the PAN are included.
Outbound HTTP Headers
Every webhook request from Green Dot includes these headers:
| Header | Value |
|---|---|
Accept | application/json, text/plain, text/html |
Accept-Encoding | gzip, deflate |
User-Agent | greendot-baas/3.0.0 |
x-GD-RequestId | Unique request identifier (echo this back in your response) |
API-Key | Your program's API key |
Authentication
Before posting a webhook, Green Dot authenticates to your endpoint. The following authentication types are supported:
- OAuth — Standard client credentials flow
- FormOAuth — OAuth over form-encoded body
- PartnerOAuth — Partner-managed OAuth
- FormUrlEncodedOAuth — URL-encoded form variant
- Certificate — Mutual TLS (mTLS)
API keys for PIE (test) and Production environments must be provided to Green Dot via a secure channel.
Example: OAuth token request
curl --location 'https://bank-events.XXXXX.com/api/v1/token' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'client_id=CLIENTID' \
--data-urlencode 'client_secret=SECRET' \
--data-urlencode 'grant_type=client_credentials' \
--data-urlencode 'scope=post:webhook'Example response
{
"access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires_in": 3600,
"token_type": "Bearer",
"scope": "post:webhook"
}Event Types
The platform emits webhooks for the following event categories:
| Event Type | Trigger |
|---|---|
transaction | Card authorizations, postings, and multi-clearing transactions |
statementReady | E-statement is available for an account |
accountUpdated | Account status changes |
interestPaid | Interest credited to a purse |
achTransfer | ACH transfer initiated or status updated |
failedTransfer | Retried transaction fails due to NSF |
nocAlert | Green Dot receives an ACH Notification of Change (NOC) |
userUpdated | User profile updated (name, address, email, phone) — delta only |
cardUpdated | Card ordered (new or replacement) |
checkUpdated | Check declined, approved, posted, or returned |
eWallet | Token activations, completions, and status updates |
billPayment | Bill pay debit, failed debit, or credit |
paperCheck | Paper check clearing status updated |
paperCheckOrder | Paper check order initiated, ordered, declined, or not received |
mailTracking | Physical card delivery stages |
promotional | Promotional transaction processed |
mrdcCheckDeposit | Mobile remote deposit capture (MRDC) check deposit fails |
p2pTransfer | Person-to-person transfer processed |
atmPinUpdate | Successful ATM PIN change |
amm | Auto Money Movement — ACH In, date-driven, failed events, rule expiry reminders |
adjustmentFinalStatus | Adjustment exhausted all retries |
directDepositSwitch | Events for Green Dot's Direct DD Switch enrollment feature |
Multi-clearing transactions: A single webhook can contain multiple events (one per clearing) in the same POST body.
Response Format
Your endpoint must respond with HTTP 200 or 201 and a JSON body. Use the response body to return a correlation ID — this helps Green Dot's support team trace issues on your end.
Required response headers
Echo back the x-GD-RequestId header that Green Dot sent in the request.
Example response
{
"responseDetails": [
{
"code": 0,
"description": "80172fdd-012f-4635-bb4f-dd71a637cc92",
"subCode": 0
}
]
}Response Code Reference
| Sub-Code | HTTP Status | Name | Description |
|---|---|---|---|
| 0 | 2xx | SUCCESS | Operation successful. |
| 10 | 404 | NOT_FOUND | Resource not found. |
| 100 | 400 | MALFORMED_SCHEMA | Payload could not be parsed. |
| 200 | 400 | INVALID_REQUEST | Request was invalid. See description for details. |
| 300 | 400 | REQUIRED_PROPERTY_MISSING | A required field is absent or empty. |
| 350 | 400 | INVALID_DATA_TYPE | Wrong data type (e.g., string where integer expected). |
| 400 | 400 | INVALID_FORMAT | String or number format is invalid. |
| 500 | 500 | INVALID_FIELD_LEN | Value is shorter or longer than the allowed length. |
| 503 | 503 | DOWNSTREAM_OFFLINE_NO_RETRY | Downstream system unavailable for extended/unknown period. Do not auto-retry. |
| 600 | 400 | DOWNSTREAM_OFFLINE_RETRY | Downstream system transiently unavailable. May auto-retry. |
| 610 | 400 | INVALID_ENUM_VALUE | Value not in the allowable set. |
| 620 | 400 | INVALID_AMOUNT | Amount value is invalid. |
| 630 | 400 | INVALID_DATE_RANGE | Date is outside the allowable range. |
| 640 | 400 | INVALID_PROPERTY | Property is not valid in this request context. |
| 700 | 400 | INVALID_STRING_CHARACTER | String contains an invalid character. |
| 720 | 400 | INVALID_DATE_FORMAT | Must be ISO 8601: YYYY-MM-DD |
| 725 | 400 | INVALID_UTC_DATETIME_FORMAT | Must be ISO 8601: YYYY-MM-DDTHH:MM:SS.SSSZ |
| 730 | 400 | INVALID_DATETIME_FORMAT_NO_TZ | Must be ISO 8601: YYYY-MM-DDTHH:MM:SS.SSS (timezone unknown) |
| 740 | 400 | INVALID_DATETIME_FORMAT_TZ_OFFSET | Must be ISO 8601: YYYY-MM-DDTHH:MM:SS.SSS±hh:mm |
| 750 | 400 | INVALID_HTTP_URL | Invalid HTTP URL format. |
| 1000 | 200/400 | INVALID_EMAIL_FORMAT | Invalid email format. |
| 1060 | 2xx | VALUE_DOES_NOT_EXIST | Object identifier not found in the system. |
| n/a | 5xx | DUPLICATE_RESOURCE | Resource already exists based on unique identifiers. |
| n/a | 5xx | GENERAL_UNEXPECTED_ERROR | Catch-all for unexpected system errors. |
Retry Behavior
This feature must be explicitly requested and configured per partner.
When enabled, failed webhook deliveries are automatically retried on a scheduled basis (initially hourly, for up to 24 hours) until they succeed or all attempts are exhausted.
What triggers a retry:
- HTTP
5xxresponse - Request timeout
- HTTP
401or403(retried once the underlying auth issue is resolved) - HTTP
0/ hard failures: DNS resolution failure, connection failure, SSL errors
Configuration note: Retry behavior is tied to release boundaries — it cannot be toggled on/off outside of a release cycle. Async retry is available for all webhook types.
Webhook Reconciliation Files
Contact your Green Dot Representative to request this feature.
Partners configured for reconciliation receive a daily file via SFTP each morning containing all transaction webhooks sent the previous day. This enables you to verify delivery completeness and catch any gaps.
File format: CSV, PGP-encrypted before drop. You'll need the appropriate decryption keys configured in advance.
SFTP access: Green Dot provisions a partner-specific SFTP account on its server. Coordinate with your Green Dot Representative to get credentials.
Reconciliation File Fields
The file has a human-readable header row (ignorable) followed by fixed-width records.
| Field | Description | Example |
|---|---|---|
accountIdentifier | Account identifier | e1b7c5b4-14ab-4f64-bf89-9403a4ba8c4f |
eventIdentifier | Event identifier | a0c7680f-8e0e-44ad-a7c3-f73cb95c8a08 |
eventType | Type of event | transaction |
eventDateTime | Timestamp of the event | 2025-03-11 06:46:17.1010000 |
transactionIdentifier | Transaction identifier | cf27e0e7-eaf3-4421-93b3-012fc9ab46aa |
parentTransactionIdentifier | Parent transaction identifier | 23aeb5fe-102a-47b5-bd95-856be896cc0e |
transactionType | Transaction type | purchase, adjustment, partnerTransferIn, atmWithdrawal, cashReload |
transactionStatus | Transaction status | completed, declined |
bin | BIN of the payment instrument | 346596 |
last4Pan | Last 4 digits of the PAN | 8978 |
transactionAmount | Transaction amount | 15.81 |
currency | Transaction currency | USD |
isCredit | true if credit, false if debit | true |
retrievalReferenceNumber | Network RRN | 459272062104469 |
purseIdentifier | Purse identifier | 0e8574a0-12ef-4506-918c-c1d7fc93693a |
purseType | Purse type | primary, savings |
availableBalance | Available balance | 50.20 |
availableBalanceAsOfDateTime | Balance timestamp | 2025-03-11 06:46:17.1010000 |
ledgerBalance | Ledger balance | 50.20 |
ledgerBalanceAsOfDateTime | Ledger balance timestamp | 2025-03-11 06:46:17.1010000 |
postedDateTime | Network posting timestamp | 2025-03-11 06:46:17.1010000 |
feeAmount | Fee amount | 1.00 |
feeCurrency | Fee currency | USD |
feeType | Fee type | bankOTCFee |
feeDescription | Fee description | Bank OTC Fee |
authorizationDateTime | AUTH transaction timestamp | 2025-03-10 06:46:17.1010000 |
cashBackAmount | Cashback amount, if any | 2.50 |
localTransactionAmount | Amount in local currency | 25.12 |
localTransactionCurrency | Local currency code | CDN |
merchantId | Merchant identifier | MC12412 |
addressLine1 | Merchant street address | 1 Blueberry Street |
postalCode | Merchant postal code | 91001 |
merchantName | Merchant name | Starbucks Inc |
merchantCity | Merchant city | Pasadena |
merchantStateProv | Merchant state/province | CA |
merchantIndustryCode | MCC code | 5999, 6011 |
merchantIndustryCategory | MCC category | Miscellaneous Stores |
merchantIndustryDescription | MCC description | Miscellaneous and speciality retail outlets |
authorizationStatusIndicator | Authorization status indicator | — |
holdExpirationDate | Auth hold expiration date | — |
declineReason | Decline reason, if applicable | Other |
eci | E-commerce indicator | — |
isPartialAuth | true if partial auth | true |
approvalCode | Approval code | — |
transferIdentifier | Transfer identifier | — |
adjustmentType | Adjustment type | provisionalDispute |
description | Free-text description | — |
transferType | Transfer type | achPull, swipeReload, adjustment |
dpanIdentifier | Device PAN (network token) identifier — represents a card provisioned to a digital wallet (Apple Pay, Google Pay, Samsung Wallet, etc.) | 08d9e746-6cda-40b6-84ce-d3be86a48797 |
fpanIdentifier | Funding PAN identifier — the physical card's account number | b337df5f-e056-4ca2-868f-3055b93333a8 |
par | Payment Account Reference — a persistent identifier linking all tokens (dPANs) back to the same underlying fPAN | V0010013818032485958373336929 |
last4Dpan | Last 4 digits of the dPAN | 2040 |
wallet | Wallet provider | Google, Apple, Samsung |
tokenStatus | Token status | Active |
achCategoryCode | ACH category code | pr |
bankName | Bank name | GDot Bank |
accountNumber | ACH account number | 115608195748333 |
routingNumber | Routing number | 123456789 |
firstName | Account holder first name | — |
lastName | Account holder last name | — |
accountType | Account type | Checking |
transactionTypeDescription | Transaction type label | ATM Withdrawal, Cash Deposit |
authType | Authorization type | — |
requestAuthorizationAmount | Requested authorization amount | — |
localDateTime | Local date/time | — |
postingDateTime | Posting date/time | — |
retailMerchantName | Retail merchant name | Walmart Supercenter |
retailStoreNumber | Retail store number | 2252 |
retailCity | Retail city | Centreville |
retailState | Retail state | MD |
adjustmentIdentifier | Adjustment identifier | e1b7c5b4-14ab-4f64-bf89-9403a4ba8c4f |
isMultiClearing | true if this auth has multiple clearings | — |
Updated 9 days ago
