EBT Transfer Getting Started

Getting started guide for EBT transfers.

Overview

๐Ÿ“˜

API Secret and Webhook ID

You'll need an API secret and the webhook ID assigned to your organization to complete this integration.

The EBT Transfer API enables the transfers of EBT cash funds from a customer's EBT card to a consumer fintech platform. As an overview:

An overview of the Benny EBT cash transfers flow.

An overview of the Benny EBT cash transfers flow.

Linking a User

Consumer fintechs must first link a customer's EBT card to Benny. Benny requires all customers who wish to transfer EBT cash funds to complete your product's identity verification flow. There's no need to repeat this requirement if identity verification is part of your onboarding flow.

To link an account:

  1. Provider customer information with the Link User endpoint. Benny will run fraud checks specific to EBT usage against the information provided.
  2. Pass the temporary link token returned from 1. to your mobile client for use in the Benny mobile SDK. See SDK documentation for:
    1. Android SDK
    2. iOS SDK.
    3. React Native SDK
  3. Benny's mobile SDK will require the customer to enter their card number and verify their PIN. Once the PIN is verified, a long-lived tokenized representation of the card number will be returned.
  4. Persist the long-lived transfer token on the backend, as it's required to initiate transfers moving forward.

๐Ÿ“˜

Linking User Policies

  • Single Card Association: Each user is permitted to link only one card to their account at any given time.
  • Unique Card Usage: A specific card can only be linked once to a consumer fintech account.
  • Limited Pin Entry Attempts: Users are given a maximum of five attempts to correctly enter their pin.

Balance Checks

A customer is free to check their balance via:

  1. Pass the transfer token obtained earlier down to the client.
  1. Via Benny's SDK, the customer enters their EBT card PIN. This is combined with the transfer token from 1. to conduct a balance check.
  2. The mobile SDK will return the EBT cash balance available in a callback.

๐Ÿ“˜

Balance Check Policies

Limited Pin Entry Attempts: Users are given a maximum of five attempts to correctly enter their pin.

Initiating Transfer

After a customer's EBT card is linked and their account is verified, they can initiate EBT cash transfers. This flow is as follows:

  1. Pass the transfer token obtained earlier down to the client.
  2. Via your product's native UI, collect the amount the customer wishes to transfer.
  3. Via Benny's SDK, the customer enters their EBT card PIN. This is combined with the transfer token from 1. and the amount from 2. to initiate a transfer.
  4. The mobile SDK will invoke a callback on the transfer's success or failure. Benny will also emit a webhook with the transfer result.
    1. If a failure occurs due to insufficient funds, the customer's current EBT cash balance will be returned in the callback response.

Settlement

Using a batch process, Benny settles all transferred funds with consumer fintechs via same-day ACH or RTP. We capture the transaction-level details of each settlement as a reconciliation report.

Settlements will not be available on Saturdays, Sundays, and federal holidays, and follow the Federal Reserve calendar for availability.

Settlements for transfers before 11:00 PM UTC will be initiated the same business day, subject to U.S. federal holidays.

Benny will issue a single ACH Transfer with the consumer fintechs configured bank account as the destination for each daily batch of transfers that must be settled. Each settlement includes an ACH payment and a reconciliation report.

Reconciliation Report File

  • When a reconciliation file is ready a webhook will be sent with the reconciliation file id. To obtain the reconciliation file a request will need to be made to the get the reconciliation file with the file id.
  • Each report will follow this convention:
    • settlement_report_organization.csv

Each file will contain a header in the top row with the following schema:

Column NameTypeDescription
countIntegerNumber of transactions processed.
gross_amountIntegerThe sum of gross amounts of all transactions in this transaction batch.
net_amountIntegerThe sum of net amounts of all transactions in this transaction batch.
fee_amountIntegerThe sum of fee amounts of all transactions in this transaction batch.

CSV Example

"count", "gross_amount", "net_amount", "fee_amount"
10, 100000, 90000, 10000

Each subsequent row will have the following schema:

Column NameTypeDescription
organization_idStringBennyโ€™s identifier for the associated organization.
external_idStringConsumer-fintech provided ID for the user, e.g., a UUID.
user_idStringBennyโ€™s unique identifier for the customer.
transaction_reference_idStringThe idempotency_key that is sent by the client to initiate the transaction
transaction_typeStringcash_withdrawal or refund
transaction_timeString (datetime)The time at which the transaction event occurred (when the user initiated the extraction/refund of funds)/
net_amountNumber (Integer)The net amount (after fees) being settled for this transaction event.
gross_amountNumber (Integer)The gross amount of the transaction event, i.e., the sum of the net amount and the fee amount.
fee_amountNumber (integer)The fee associated with this transaction event.
fee_variableNumber (Integer)The variable fee associated with this transaction event.
fee_fixedNumber (Integer)The fixed fee associated with this transaction event.
settled_atString (date)The date at which the ACH transfer that settled this transaction originated.

CSV Example

"organization_id", "external_id", "user_id", "transaction_reference_id", "transaction_type","transaction_time",  "net_amount", "gross_amount", "fee_amount", "fee_variable", "fee_fixed", "settled_at"
"org_x6vvstwe5zbbdbe4ztncywsq", "567772", "ebtuser_rxtjacziq000108lef729g53e", "cash_withdrawal", "2024-01-02T10:02:00Z", "14500", "15000", "500", "400", "100", "2024-01-02T23:02:00Z"
"org_x6vvstwe5zbbdbe4ztncywsq", "872634", "ebtuser_clsjadh9e000208le6otu989g", "cash_withdrawal", "2024-01-02T11:02:00Z", "14500", "15000", "500", "400", "100", "2024-01-02T23:02:00Z"
"org_x6vvstwe5zbbdbe4ztncywsq", "567863", "ebtuser_uvdjadruu000308le150z5mgg", "cash_withdrawal", "2024-01-02T08:13:00Z", "13100", "13000", "1000", "300", "100", "2024-01-02T23:02:00Z"
...

Rotating Transfer Token

Transfer tokens are only valid for 90 days. They will automatically be rotated, with a webhook event sent with the new transfer token before the previous one expires.

One can manually rotate a token via the Rotate Transfer Token endpoint.