Propel EBT & SNAP Benefits Data API
Propel EBT & SNAP Benefits is the Android client from Propel, Inc. (the company behind Fresh EBT) for people who spend USDA SNAP food benefits and cash assistance on a state-issued Electronic Benefits Transfer card. After an email magic-link or Google/Apple sign-in, the wallet home shows SNAP and cash balances, grocery and ATM activity, predicted deposits, and card-lock controls that can freeze the plastic everywhere, block out-of-state swipes, or block high-risk and online charges. A case-info lane signs into the state's eligibility portal for notices and recertification, a cash-back rewards layer sits on linked grocery spend, and a store map helps find SNAP-accepting retailers. It is published for the United States — SNAP is a federal program run by each state's human-services agency — and it sits beside official ConnectEBT / ebtEDGE cardholder portals and the older Easy Food Stamps brand the same product still ships under.
SNAP and cash land on the linked EBT account as snap_cents and cash_cents, with portal_retailer / amount_cents / transaction_hash rows for each grocery swipe and pending_deposits / predicted_deposits for the next issuance. Card-lock writes carry lock_type (out_of_state, online, all, high_risk_transactions) and lock_status against SNAP or Summer EBT. Case notices arrive with case_number, id_hash and download_request_params.
Benefits-admin dashboards, grocery-budgeting tools and SNAP-issuance research stacks subscribe to that ledger — remaining SNAP versus the next deposit, out-of-state lock state, recertification letters. openData Studio turns it into callable open data.
Screenshots
API surface
The endpoints and request/response examples below are reconstructed from the app's interface — illustrative, not a live capture.
Refresh identity tokens
POST
/v1/sessions/renewosintRotates the signed-in session: posts the refresh JWT plus device_uuid and returns a new access_token/refresh_token pair plus the user record (uuid, email, ZIP/state, eligibleBenefits).
Auth: Authorization: Bearer <refresh_token>; client-name, client-version and device-id headers. Body carries device_uuid.
- access_token
- refresh_token
- user.uuid
- user.name
- user.email
- user.source
- user.zipcode
- user.state
- user.segment
- user.created_at
- user.settings.eligibleBenefits
- user.rewards_user.is_registered
- device_uuid
POST /v1/sessions/renew HTTP/1.1 Authorization: Bearer <refresh_token> X-Client-Platform: Android X-Client-Version: <app-version> X-Device-Id: <device-uuid> Content-Type: application/json { "device_uuid": "<device-uuid>" }{ "access_token": "<jwt>", "refresh_token": "<jwt>", "user": { "uuid": "usr_8f2a91c4", "name": "Maria Lopez", "email": "[email protected]", "source": "google", "internal": false, "zipcode": "93706", "state": "CA", "segment": 14, "created_at": 1714522800, "settings": { "eligibleBenefits": ["EBT", "WIC"] }, "rewards_user": { "is_registered": true }, "tos": { "accepted": true } } }Read signed-in user
GET
/v1/cardholder/profileosintLoads the signed-in account identity used to hydrate the profile store: uuid, name, email, identity source, ZIP/state, experiment segment and eligibleBenefits (EBT, WIC, CTC, SSI_SSDI).
Auth: Authorization: Bearer <access_token> issued by the session-renew call or social/magic-link login.
- user.uuid
- user.name
- user.email
- user.source
- user.internal
- user.zipcode
- user.state
- user.segment
- user.created_at
- user.settings.eligibleBenefits
- user.rewards_user
GET /v1/cardholder/profile HTTP/1.1 Authorization: Bearer <access_token> X-Client-Platform: Android X-Device-Id: <device-uuid>{ "user": { "uuid": "usr_8f2a91c4", "name": "Maria Lopez", "email": "[email protected]", "source": "google", "internal": false, "zipcode": "93706", "state": "CA", "segment": 14, "created_at": 1714522800, "settings": { "eligibleBenefits": ["EBT", "WIC", "CTC"] }, "rewards_user": { "is_registered": true } } }Update eligible-benefits settings
POST
/v1/accounts/{accountId}/preferencesopendataWrites the profile settings document, including eligibleBenefits flags that gate EBT, WIC, CTC and SSI/SSDI surfaces after the Edit Eligible Benefits screen.
Auth: Authorization: Bearer <access_token>; path accountId is the user uuid returned by the profile call.
- uuid
- eligibleBenefits
- eligibleBenefitsExperimental
- user.settings
POST /v1/accounts/usr_8f2a91c4/preferences HTTP/1.1 Authorization: Bearer <access_token> Content-Type: application/json { "eligibleBenefits": ["EBT", "WIC"] }{ "user": { "uuid": "usr_8f2a91c4", "settings": { "eligibleBenefits": ["EBT", "WIC"], "eligibleBenefitsExperimental": null } } }Sync EBT SNAP and cash balances
POST
/v1/wallet/refreshopenbankingPulls the state EBT portal into the wallet: SNAP amount and cash on cards[], posted statements with portal_retailer/amount_cents, pending_deposits and predicted_deposits, plus has_case_info for the case-info lane.
Auth: Body access_token (Bearer-equivalent) plus login/state/password for the state EBT portal; optional captcha token header.
- uid
- state
- timestamp
- cards.amount
- cards.cash
- cards.card
- cards.status
- cards.farmers_market
- statements.amount_cents
- statements.portal_retailer
- statements.transaction_hash
- pending_deposits
- predicted_deposits.amount_cents
- predicted_deposits.benefit_type
- has_case_info
- sync_count
- cached
POST /v1/wallet/refresh HTTP/1.1 Content-Type: application/json X-Captcha-Token: <token> { "access_token": "<jwt>", "device_uuid": "<device-uuid>", "uid": "ebt_ca_4419", "login": "****4419", "password": "<portal-pin>", "state": "CA", "os": "Android", "lang": "en", "ebtzipcode": "93706", "gpszipcode": "93701", "sync_type": "refresh", "source": "home", "oldest_transaction_time": 1711900800, "newest_transaction_time": 1714522800 }{ "uid": "ebt_ca_4419", "state": "CA", "timestamp": 1714522800, "cached": false, "sync_count": 12, "has_case_info": true, "cards": [ { "amount": 187.43, "cash": 20.00, "card": "4419", "name": "SNAP", "status": "ACTIVE", "farmers_market": 12.50 } ], "statements": [ { "settlement_date": "2026-04-12", "transaction_date": "2026-04-12T18:14:00Z", "amount_cents": -2456, "portal_retailer": "FOODMAXX 462", "portal_location": "FRESNO, CA", "transaction_category": "grocery", "transaction_type": "POS", "transaction_hash": "txn_9c21", "is_suspicious": false, "status": "posted" } ], "pending_deposits": [], "predicted_deposits": [ { "settlement_date": "2026-05-08", "amount_cents": 29100, "benefit_type": "SNAP" } ] }Latest successful EBT sync
GET
/v1/cards/{cardId}/snapshots/latestopenbankingReads the last successful server-side sync for a linked card without re-scraping the portal: snap_cents/cash_cents plus mapped transactions and predicted_deposits for resume/home refresh.
Auth: Authorization: Bearer <access_token>; query sync_status=success. Client OS, request-source, app-version and language headers.
- timestamp
- snap_cents
- cash_cents
- transactions.settlement_date
- transactions.transaction_date
- transactions.amount_cents
- transactions.portal_retailer
- transactions.portal_location
- transactions.transaction_hash
- transactions.transaction_category
- transactions.is_summer_ebt_deposit
- transactions.suspicious_reasons
- pending_deposits
- predicted_deposits.amount_cents
- predicted_deposits.benefit_type
GET /v1/cards/ebt_ca_4419/snapshots/latest?sync_status=success HTTP/1.1 Authorization: Bearer <access_token> X-Client-Platform: Android X-Request-Source: app.resume X-Client-Version: <app-version> X-Client-Language: en-US{ "timestamp": "2026-04-30T16:02:11Z", "snap_cents": 18743, "cash_cents": 2000, "transactions": [ { "settlement_date": "2026-04-12", "transaction_date": "2026-04-12T18:14:00Z", "amount_cents": -2456, "portal_retailer": "FOODMAXX 462", "portal_location": "FRESNO, CA", "transaction_category": "grocery", "transaction_type": "POS", "transaction_hash": "txn_9c21", "is_summer_ebt_deposit": false, "suspicious_reasons": [], "status": "posted", "status_reason": null, "transaction_processing_version": 3 } ], "pending_deposits": [], "predicted_deposits": [ { "settlement_date": "2026-05-08", "amount_cents": 29100, "benefit_type": "SNAP" } ] }EBT transaction by hash
GET
/v1/cards/{cardId}/transactions/{transactionHash}openbankingHydrates the transaction-details screen for one swipe keyed by card and transactionHash: retailer, debit/credit, settlement date, suspicious flags and Summer EBT deposit marks.
Auth: Authorization: Bearer <access_token>.
- transactionHash
- retailer
- location
- debit
- credit
- settlement
- transaction
- type
- trans_type
- isSuspicious
- suspiciousReasons
- isSummerEbtDeposit
- status
- statusReason
GET /v1/cards/ebt_ca_4419/transactions/txn_9c21 HTTP/1.1 Authorization: Bearer <access_token>{ "transactionHash": "txn_9c21", "retailer": "FOODMAXX 462", "location": "FRESNO, CA", "debit": "$24.56", "credit": "", "settlement": "2026-04-12", "transaction": "2026-04-12T18:14:00Z", "type": "grocery", "trans_type": "POS", "isSuspicious": false, "suspiciousReasons": [], "isSummerEbtDeposit": false, "status": "posted", "statusReason": null }Lock or unlock EBT card
POST
/v1/cards/restrictionsopenfinanceApplies the wallet card-lock switches: freeze everywhere, block out-of-state, block online, or block high-risk transactions for SNAP or Summer EBT, then merges card_props_to_update.status onto the local card.
Auth: Body access_token plus portal login/state; lock_type is out_of_state | online | all | high_risk_transactions; lock_status boolean; benefit_type SNAP | SEBT.
- lock_type
- lock_status
- benefit_type
- success
- error
- card_props_to_update.status
- login
- state
- uid
POST /v1/cards/restrictions HTTP/1.1 Content-Type: application/json { "access_token": "<jwt>", "login": "****4419", "state": "CA", "uid": "ebt_ca_4419", "lock_type": "out_of_state", "lock_status": true, "benefit_type": "SNAP", "source": "card settings", "device_uuid": "<device-uuid>" }{ "success": true, "error": null, "card_props_to_update": { "status": "LOCKED OUTSIDE OF STATE" }, "event_props": { "Lock type": "out_of_state", "Lock status": true }, "track": {} }Restore vaulted EBT accounts
POST
/v1/linked-cards/restoreopenfinanceRehydrates linked EBT cards from the credential vault after reinstall or new device: uid, state, last-four card_number, card_name and last_sync_success_scraper.
Auth: Body access_token, device_uuid and a device key; restores portal credentials previously stored for this identity.
- accounts_to_add.uid
- accounts_to_add.state
- accounts_to_add.login
- accounts_to_add.card_number
- accounts_to_add.card_name
- accounts_to_add.last_sync_success_scraper
- accounts_to_add.params
- lastRefreshed
- uidsPendingConfirmation
POST /v1/linked-cards/restore HTTP/1.1 Content-Type: application/json { "access_token": "<jwt>", "device_uuid": "<device-uuid>", "device_key": "<device-key>", "lastRefreshed": 1714436400, "uidsPendingConfirmation": [] }{ "accounts_to_add": [ { "uid": "ebt_ca_4419", "state": "CA", "login": "****4419", "password": "<encrypted>", "params": {}, "card_number": "4419", "card_name": "SNAP", "last_sync_success_scraper": "ca_ebt" } ] }Unlink vaulted EBT account
POST
/v1/linked-cards/unlinkopenfinanceDeletes a previously vaulted EBT card from the credential store when the user unlinks it, the uid rotates after a portal reset, or another card replaces it.
Auth: Body access_token and device_uuid; account_uid identifies the vault row; reason is an app enum (uid change, user remove, replace).
- account_uid
- reason
- device_uuid
- access_token
POST /v1/linked-cards/unlink HTTP/1.1 Content-Type: application/json { "access_token": "<jwt>", "device_uuid": "<device-uuid>", "account_uid": "ebt_ca_4419", "reason": "user_removed" }{ "ok": true }Sync eligibility-portal case info
POST
/v1/cases/refreshopendataPulls the state's benefits case into the Case Info screen: case_number, notice list (id, title, date, download_request_params) and account_uid linking back to the EBT card. MFA and expired-password errors arrive as track Error reason.
Auth: Body access_token plus either portal login/email+password or firstname/lastname/case_number/last4ssn (+ dob/ssn) for the state case portal.
- case_info.state
- case_info.case_number
- case_info.notices.id
- case_info.notices.id_hash
- case_info.notices.title
- case_info.notices.date
- case_info.notices.is_viewed
- case_info.notices.download_request_params
- account_uid
- encrypted.eligibility_params
- firstname
- lastname
- last4ssn
POST /v1/cases/refresh HTTP/1.1 Content-Type: application/json { "access_token": "<jwt>", "state": "CA", "source": "case_info_screen_background", "login": "maria.lopez", "password": "<portal-password>", "firstname": "Maria", "lastname": "Lopez", "case_number": "12-345-678", "last4ssn": "4419", "dob": "1988-03-14", "existing_notice_extractions": {} }{ "case_info": { "state": "CA", "case_number": "12-345-678", "notices": [ { "id": "ntc_8821", "id_hash": "h_9aa", "title": "CalFresh recertification due", "date": "2026-05-01", "is_viewed": false, "download_request_params": { "doc_id": "8821" } } ] }, "account_uid": "ebt_ca_4419", "encrypted": { "eligibility_params": {} }, "track": {} }Download case-notice PDF
POST
/v1/cases/notices/exportopendataFetches the raw PDF payload (content) for a case notice so the in-app Notice Viewer can render CalFresh/SNAP letters without leaving the app.
Auth: Body access_token plus download_request_params copied from the notice; portal cookies/params when the case is tied to an EBT uid.
- content
- download_request_params
- state
- source
POST /v1/cases/notices/export HTTP/1.1 Content-Type: application/json { "access_token": "<jwt>", "state": "CA", "source": "notice_viewer_render", "download_request_params": { "doc_id": "8821" }, "login": "maria.lopez", "device_uuid": "<device-uuid>" }{ "content": "JVBERi0xLjcKJeLjz9MKMSAwIG9iago8PC9UeXBlL0NhdGFsb2c+PgplbmRvYmoK" }Rewards cash-back balance
GET
/v1/cashback/walletopenfinanceReads the cash-back wallet in cents (balance) after grocery earn events; the client stores it as balanceCents on the rewards module.
Auth: Authorization: Bearer <access_token>. Requires a rewards user created against a linked EBT card.
- balance
GET /v1/cashback/wallet HTTP/1.1 Authorization: Bearer <access_token>{ "balance": 1250 }Redeem rewards cash-back
POST
/v1/cashback/payoutsopenfinanceCashes the rewards balance out to a gift card: posts amount cents and brand_code, then the client reloads balance and cashouts using the returned id.
Auth: Authorization: Bearer <access_token>; body amount (cents) and brand_code of the gift-card retailer.
- amount
- brand_code
- id
POST /v1/cashback/payouts HTTP/1.1 Authorization: Bearer <access_token> Content-Type: application/json { "amount": 1000, "brand_code": "walmart" }{ "id": "cashout_7712" }Geocode ZIP to SNAP state
GET
/v1/regions/lookupopendataResolves a US ZIP to the SNAP-administering state so the link-EBT flow can pick the right state portal (CA CalFresh, NY OTDA, ...) before the first balance sync.
Auth: Unauthenticated ZIP lookup used during onboarding when GPS is off; a companion reverse-lookup call requires Bearer and returns zipcode and city.
- state
- zipcode
GET /v1/regions/lookup?zipcode=93706 HTTP/1.1{ "state": "CA", "zipcode": "93706" }
Data categories
- balances
- transactions
- card-locks
- case-notices
- rewards
- identity
Where teams use this data
SNAP issuance and spend reconciliation
A benefits-admin or budgeting bot pulls snap_cents, cash_cents and predicted_deposits.amount_cents after each wallet refresh, then matches portal_retailer / amount_cents rows to grocery receipts so caseworkers see remaining SNAP versus the next issuance date.
EBT theft and out-of-state lock automation
A fraud desk watches is_suspicious / suspicious_reasons on transaction hashes, then posts lock_type=out_of_state or high_risk_transactions with lock_status=true so the plastic stops out-of-state and online drains without waiting for the state hotline.
Recertification notice inbox
A case-management integration syncs the eligibility portal, lists notices by case_number / id_hash / title / date, and downloads content PDFs so households get CalFresh recertification letters inside the same wallet that already holds the card.
Grocery cash-back ledger
A rewards partner reads the cash-back wallet balance (cents) and posts a payout with amount plus brand_code to turn SNAP-linked grocery earn into a Walmart or similar gift card, then stores the cashout id.
Frequently asked questions
What balances does the Propel EBT API return?
A successful wallet refresh returns SNAP on cards[].amount (and snap_cents on the latest-snapshot resource) plus cash assistance on cards[].cash / cash_cents, optional farmers_market cents, pending_deposits and predicted_deposits with benefit_type SNAP. Amounts on the latest-snapshot path are integer cents.
How do card locks work?
The card-restriction call takes lock_type out_of_state, online, all or high_risk_transactions, a boolean lock_status, and benefit_type SNAP or SEBT. A success payload merges card_props_to_update.status (ACTIVE, LOCKED EVERYWHERE, LOCKED OUTSIDE OF STATE, LOCKED FOR HIGHRISKTRANSACTION) onto the local card.
How does the app authenticate?
Identity is handled by a separate sign-in service: magic-link / Google / Apple sign-in mints access_token and refresh_token JWTs. Later benefits and rewards calls send Authorization: Bearer plus, for state-portal syncs, the EBT login and PIN in the JSON body.
Is this a public SNAP developer API?
No. These are the first-party calls the Propel Android client makes after sign-in to its identity service and benefits backend, shown here as an illustrative path-only surface. They are not USDA or state open-data feeds.
Apps similar to Propel EBT & SNAP Benefits
- ConnectEBT — ConnectEBT is Conduent's cardholder app for SNAP and Cash EBT balances, deposits, transaction history, and PIN changes in states including Alabama, Arkansas, Delaware, Georgia, Illinois, Iowa, Maine, Montana, New Jersey, Ohio, Oklahoma, Pennsylvania, South Carolina, Utah, and Virginia.
- ebtEDGE — ebtEDGE is Fidelity Information Services' official processor app for SNAP (and, in listed states, WIC) cardholders to check balances, see reload and expiry timing, lock or unlock cards, and report a lost or stolen card.
- Forage EBT Balance & Rewards — Forage is a third-party app from Forage Technology Corp. that shows SNAP and EBT Cash balances in one place and lets shoppers earn rewards on grocery receipts or at selected partners.
- DTA Connect — DTA Connect is the Massachusetts Department of Transitional Assistance app for SNAP and cash cases, covering EBT card balance, next issuance date, document upload, appointment alerts, and notices.
- Your Texas Benefits — Your Texas Benefits is the official Texas Health and Human Services Commission app for SNAP, TANF, and health-care cases, including benefit amounts, renewal alerts, document upload, and Lone Star Card management.
- LifeInCheck EBT — LifeInCheck EBT, from Morse Data Enterprises, connects to a state's SNAP provider so cardholders can check a real-time benefit balance, deposit schedule, and transaction history, and locate SNAP-approved retailers by ZIP code.
- NYC ACCESS HRA — NYC ACCESS HRA is the New York City Human Resources Administration app for viewing SNAP and Cash Assistance case status, EBT balances, recertification dates, appointments, and required documents.
- MyCOBenefits — MyCOBenefits is Colorado's official app for applying for and managing SNAP food and cash assistance with PEAK sign-in, including recertification and current EBT card balance and transactions.
Topics
- Propel EBT API
- SNAP balance API
- EBT card lock
- snap_cents
- Fresh EBT
- CalFresh transactions
- EBT case notices
- openbanking SNAP
Need this app's data API integrated?
We deliver scoped integrations for any named app — from USD 500 with source-code handoff, or hosted access billed per call. Tell us the data you need.
- NDA + SOW on every engagement
- Delivery in 3–7 days
- Payment only after acceptance
- Work scoped to authorized use