--- title: "FSA/HSA healthcare payments" description: "Accept FSA/HSA healthcare card payments in your Checkout integration with IIAS auto-substantiation." url: "https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa" source_url: "https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa.md" canonical: "https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa" last_modified: "2026-09-23T16:30:22+02:00" language: "en" --- # FSA/HSA healthcare payments Accept FSA/HSA healthcare card payments in your Checkout integration with IIAS auto-substantiation. Flexible Spending Account (FSA) and Health Savings Account (HSA) cards let US shoppers pay for eligible healthcare purchases with tax-advantaged funds. This page shows how to accept FSA/HSA card payments in your online payments integration. FSA/HSA payments are supported for US-issued Visa and Mastercard cards. ## Requirements Before you begin, take into account the following requirements, limitations, and preparations. | Requirement | Description | | -------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **Integration type** | * An [online payments integration that uses the advanced flow](https://docs.adyen.com/online-payments/build-your-integration/advanced-flow), on Checkout API **v72** or later. * To detect card eligibility in the shopper's browser with Components or Drop-in, use adyen-web **6.41.0** or later. * Support for [partial authorizations](https://docs.adyen.com/online-payments/partial-authorizations). FSA/HSA payments require partial authorizations, because an FSA/HSA card might not cover the full payment amount. | | **Limitations** | - Supported only for US-issued Visa and Mastercard cards. - You determine the healthcare-eligible amounts from your inventory and the [SIG-IS Eligible Product List](https://sig-is.org/eligible-product-list/eligible-product-list-overview). Adyen does not compute eligibility or the amounts. - A healthcare-eligible card does not mean that your business is certified to accept FSA/HSA payments. | | **Setup steps** | Before you begin:- Contact your Adyen account team to enable FSA/HSA payments and partial authorizations. FSA/HSA payments are in limited release. - Register or certify your business with SIG-IS. The program that applies depends on your business type. See [SIG-IS registration and certification](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa/sig-is-setup). | ## About FSA/HSA payments FSA and HSA cards are US-only prepaid cards linked to tax-advantaged healthcare accounts. Shoppers can use them only for healthcare purchases that the US Internal Revenue Service (IRS) recognizes as eligible. To accept these cards for eligible everyday health products, you must prove that the purchase qualifies. **Auto-substantiation** is the process that proves product eligibility automatically, so the shopper does not need to submit paper receipts for most healthcare-eligible purchases. However, a shopper's benefit provider might still ask them for proof of the purchase later. It relies on the **Inventory Information Approval System (IIAS)**: you identify the healthcare-eligible items in the basket and send the eligible amount with the payment. The card issuer uses this data to approve the eligible amount. This page covers the **Everyday Health Products** category. You send the healthcare amount data through IIAS auto-substantiation. This maps to the SIG-IS **IIAS** program, which needs both SIG-IS certification and this integration. Not every business needs this integration. Adyen also supports two categories that do not send healthcare data: businesses on healthcare-only [merchant category codes](https://docs.adyen.com/get-started-with-adyen/adyen-glossary/#merchant-category-code) (**Direct Medical Services**), and pharmacies and drug stores that use the **90% Rule**. The program that applies to your business, and whether you register with SIG-IS, depends on your business type and MCC. See [SIG-IS registration and certification](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa/sig-is-setup). The following terms are used on this page: | Term | Description | | ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | **SIG-IS** | The Special Interest Group for IIAS Standards. The industry body that manages the standards for FSA and HSA card acceptance and maintains the Eligible Product List. | | **IIAS** | Inventory Information Approval System. You are responsible for implementing an IIAS that uses the SIG-IS Eligible Product List and meets the IIAS Merchant Certification requirements. Complete the applicable Merchant Self-Assessment/Checklist and certification with your acquirer. An IIAS combines inventory management and point-of-sale systems to confirm the eligibility of FSA/HRA purchases, generate transactions with the required IIAS information, and maintain an archive for IRS audits. See [SIG-IS registration and certification](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa/sig-is-setup). | | **Auto-substantiation** | Automatic proof that a purchase is FSA/HSA-eligible, based on the healthcare amount data you send. This can remove the need for paper receipts during checkout, but the shopper's benefit provider might still ask for proof of the purchase. | | **Eligible amount** | The part of the payment amount that is for eligible healthcare products, as you determine it from the SIG-IS Eligible Product List. | ## How it works To accept an FSA/HSA payment, you identify an eligible card, send the healthcare amount breakdown, and handle the result. ![Sequence diagram of an FSA/HSA payment: the shopper enters card details, you check eligibility with Adyen, derive the healthcare amounts, submit the payment with the healthcare data, and Adyen sends the IIAS data to the card scheme and issuer for auto-substantiation before returning the authorization result.](https://docs.adyen.com/media/41680b6c0614b13c00419a12079e6588e20f6e20cbbf510427b567c20f8b7b9d.svg?decoding=auto\&fetchpriority=auto) 1. The shopper enters their card details in your checkout. 2. You check whether the card is healthcare-eligible. See [Check card eligibility](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa#check-card-eligibility). 3. You derive the healthcare-eligible amount, and any sub-amounts, from your inventory and the [SIG-IS Eligible Product List](https://sig-is.org/eligible-product-list/eligible-product-list-overview). 4. You submit the payment with the healthcare amount breakdown, and allow partial authorizations. See [Send the healthcare amount data](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa#send-the-healthcare-amount-data). 5. Adyen sends the IIAS data to Visa or Mastercard in the authorization message. 6. The card issuer auto-substantiates the eligible amount. The issuer authorizes the full amount, or a partial amount if the available balance is lower, and returns the authorization result. 7. You handle the result, including partial authorizations, and complete the payment. See [Handle the authorization result](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa#handle-the-authorization-result). ## Check card eligibility Before you show FSA/HSA options to the shopper, check whether the entered card is healthcare-eligible. Adyen returns a `healthcare` boolean at the card brand level. For a co-branded card, each brand entry carries its own value. The `healthcare` field appears only when the card is healthcare-eligible. If the field is absent, treat the card as not eligible. ### Tab: API-only To check card eligibility with the API: 1. Call [/cardDetails](https://docs.adyen.com/api-explorer/Checkout/latest/post/cardDetails) with the first 8 digits of the card number. **Example /cardDetails request** ```json { "cardNumber": "42043021", "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "countryCode": "US" } ``` 2. Read the `healthcare` boolean inside each `brands` entry. For a healthcare-eligible card, the response includes `healthcare` set to **true**. **Example /cardDetails response for a healthcare-eligible card** ```json { "brands": [ { "supported": true, "type": "visa", "healthcare": true } ], "issuingCountryCode": "US" } ``` For a card that is not healthcare-eligible, the `healthcare` field is absent. **Example /cardDetails response for a standard card** ```json { "brands": [ { "supported": true, "type": "visa" } ], "issuingCountryCode": "US" } ``` ### Tab: Components and Drop-in When you use Adyen Web Components or Drop-in with the [advanced flow](https://docs.adyen.com/online-payments/build-your-integration/advanced-flow), the SDK looks up the card details as the shopper types the card number. It returns the result in the [`onBinLookup` ](https://docs.adyen.com/payment-methods/cards/web-drop-in#events)callback. To read the `healthcare` value in `onBinLookup`, use adyen-web **6.41.0** or later. In the callback data, the `healthcare` flag is on the per-brand entries in the `supportedBrandsRaw` array, not on the `brands` array. Each entry in `supportedBrandsRaw` has a `paymentMethodVariant`, and only the healthcare-eligible variant carries `healthcare` set to **true**. A single card can return more than one entry. For example, a Mastercard returns a credit entry (`mc`) without the flag and a debit entry (`mcstandarddebit`) with `healthcare` set to **true**. Check all entries rather than matching on the brand name. To check card eligibility with Components or Drop-in: 1. Check the `healthcare` flag across the `supportedBrandsRaw` entries in the `onBinLookup` callback. **Read the healthcare value in onBinLookup** ```javascript const checkout = await AdyenCheckout({ // ...your configuration onBinLookup(data) { const isHealthcareEligible = data.supportedBrandsRaw?.some( (brand) => brand.healthcare === true ); if (isHealthcareEligible) { // Show the FSA/HSA amount breakdown in your checkout, // and pass the eligibility signal to your server. } } }); ``` 2. Pass the eligibility signal to your server, which then sends the healthcare amount data on the payment request. ## Send the healthcare amount data When the card is healthcare-eligible, include the `enhancedSchemeData.healthcare` object in your [/payments](https://docs.adyen.com/api-explorer/Checkout/latest/post/payments) request. The presence of this object signals IIAS intent to Adyen, so you do not send a separate flag. You must also allow partial authorizations on every FSA/HSA payment. An FSA/HSA card holds only the eligible healthcare balance, so the card might not cover the full payment amount. For more information, see [Partial authorizations](https://docs.adyen.com/online-payments/partial-authorizations). All amount fields are in [minor units](https://docs.adyen.com/development-resources/currency-codes) and use the currency of the top-level `amount`. For more information about the fields and the validation rules, see [Healthcare fields reference](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa#healthcare-fields-reference). To send the healthcare amount data: 1. Add the following to your `/payments` request: * The `enhancedSchemeData.healthcare` object, with `totalHealthcareValue` and any sub-amounts that apply. * `additionalData.allowPartialAuth` set to **true**. This asks the issuer to authorize the available amount instead of declining the payment when the balance is lower than the payment amount. In a Components or Drop-in advanced flow, your server adds these fields when it makes the `/payments` call after the `onSubmit` event. **Example /payments request with healthcare data** ```json { "merchantAccount": "YOUR_MERCHANT_ACCOUNT", "reference": "YOUR_ORDER_REFERENCE", "amount": { "currency": "USD", "value": 6000 }, "paymentMethod": { "type": "scheme", "encryptedCardNumber": "...", "encryptedExpiryMonth": "...", "encryptedExpiryYear": "...", "encryptedSecurityCode": "..." }, "shopperInteraction": "Ecommerce", "enhancedSchemeData": { "healthcare": { "totalHealthcareValue": 4500, "prescriptionValue": 1500, "visionPrescriptionValue": 500, "dentalValue": 1000 } }, "additionalData": { "allowPartialAuth": "true" } } ``` In this example, the payment amount is USDĀ 60.00 and the healthcare-eligible amount is USDĀ 45.00. 2. Check the response to confirm the result of the payment. See [Handle the authorization result](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa#handle-the-authorization-result). ## Handle the authorization result Because you allow partial authorizations, an FSA/HSA payment can return one of two successful result codes. An FSA/HSA card holds only the eligible healthcare balance, so the issuer often authorizes only part of the payment amount. 1. Read the `resultCode` in the `/payments` response. * **Authorised**: the issuer authorized the full payment amount. * **PartiallyAuthorised**: the issuer authorized only the amount available on the card. The `additionalData.authorisedAmountValue` field holds the authorized amount, in minor units. Do not treat this result as a failure. **Example /payments response for a partial authorization** ```json { "pspReference": "NXNS5ZQKCLL4N222", "resultCode": "PartiallyAuthorised", "amount": { "currency": "USD", "value": 6000 }, "additionalData": { "authorisedAmountValue": "3500", "authorisedAmountCurrency": "USD" }, "merchantReference": "YOUR_ORDER_REFERENCE" } ``` 2. Complete the payment based on the result. * For **PartiallyAuthorised**, follow up to collect the remaining amount, for example by prompting the shopper for another payment method. For the follow-up options, see [Partial authorizations](https://docs.adyen.com/online-payments/partial-authorizations). * For all other result codes, take the matching action. See [Payment result codes](https://docs.adyen.com/online-payments/payment-result-codes). ## Confirm the card product To confirm after the payment that a shopper paid with an FSA/HSA card, check the card product identifier in the [AUTHORISATION webhook](https://docs.adyen.com/development-resources/webhooks). Adyen returns this identifier in `additionalData.cardProductId`. This is supported for Visa and Mastercard only. To receive `cardProductId` in your webhooks, you must enable it first. In your [Customer Area](https://ca-test.adyen.com/), go to **Developers** > **Additional data**, then enable the **card product ID** field. To confirm the card product: 1. In the AUTHORISATION webhook, read `additionalData.cardProductId`. **Example AUTHORISATION webhook additionalData** ```json { "additionalData": { "cardProductId": "J3" } } ``` 2. Compare the value against the following healthcare card products. | Scheme | `cardProductId` | Card product | | ---------- | --------------- | ------------------------------------ | | Visa | J3 | FSA / HSA Card | | Mastercard | MPX | Prepaid Mastercard Flex Benefit Card | | Mastercard | MHB | Mastercard HSA Substantiated | If `cardProductId` matches one of these values, the shopper paid with an FSA/HSA card. ## Healthcare fields reference The `enhancedSchemeData.healthcare` object contains the total healthcare-eligible amount and optional sub-amounts. All amounts are integers in minor units, and use the currency of the top-level `amount`. | Field | Required | Description | | --------------------------------- | ------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------- | | `totalHealthcareValue` Integer | ![Required](https://docs.adyen.com/media/732127089c689593ccb0331d565e5773bed94e60145cae96672212374facb8c6.svg?decoding=auto\&fetchpriority=auto) | The total healthcare-eligible amount, in minor units. Must be greater than 0 and must not exceed the payment amount (`amount.value`). | | `prescriptionValue` Integer | | The prescription (Rx) amount, in minor units. | | `visionPrescriptionValue` Integer | | The vision or optical prescription amount, in minor units. | | `dentalValue` Integer | | The dental amount, in minor units. | | `otherMedicalValue` Integer | | The eligible medical amount that the other sub-amounts do not cover, in minor units. | ![This is the required icon.](https://docs.adyen.com/media/732127089c689593ccb0331d565e5773bed94e60145cae96672212374facb8c6.svg?decoding=auto\&fetchpriority=auto) Required for all transactions.\ ![This is the conditionally required icon.](https://docs.adyen.com/media/e654d4104461d20836c817ee9d8f27faa0e45c1a8d08558f079561a50fc2797e.svg?decoding=auto\&fetchpriority=auto) Required for particular setups, or issuers and card schemes.\ ![This is the recommended icon.](https://docs.adyen.com/media/51cfe94e37a7426974002173390b3c7807ac234e65206fe14ed9fbdd45fb958e.svg?decoding=auto\&fetchpriority=auto) Recommended for all transactions, but not required. ### Validation rules Adyen validates the `enhancedSchemeData.healthcare` object before it processes the authorization. The amounts must meet the following rules: * `totalHealthcareValue` must be greater than 0. * `totalHealthcareValue` must not exceed the payment amount (`amount.value`). * The sum of the four sub-amounts (`prescriptionValue`, `visionPrescriptionValue`, `dentalValue`, and `otherMedicalValue`) must not exceed `totalHealthcareValue`. ### Errors If the amounts do not meet the validation rules, Adyen rejects the request with HTTP **422** and the error **InvalidFieldWithReason**. | Condition | Result | | --------------------------------------------------------------- | ----------------------------------------- | | `totalHealthcareValue` is 0 or a negative value. | HTTP **422**, **InvalidFieldWithReason**. | | `totalHealthcareValue` exceeds the payment amount. | HTTP **422**, **InvalidFieldWithReason**. | | The sum of the four sub-amounts exceeds `totalHealthcareValue`. | HTTP **422**, **InvalidFieldWithReason**. | To resolve an error, adjust the amounts so that they meet the validation rules, then send the request again. ## Test and go live Use the following test cards to make test FSA/HSA payments. Both cards are healthcare-eligible. | Card number | Card scheme | Issuing country/region | Expiry date | Card security code | | ------------------- | ----------- | ---------------------- | ----------- | ------------------ | | 4001 2300 0000 0004 | Visa | US | 03/2030 | 737 | | 2292 2400 0000 0005 | Mastercard | US | 03/2030 | 737 | Use the following scenarios to verify your integration before you go live. | Scenario | Expected result | | ------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------- | | Submit `enhancedSchemeData.healthcare` with sub-amounts (Visa, **v72**). | **Authorised**. | | Submit `enhancedSchemeData.healthcare` with sub-amounts (Mastercard, **v72**). | **Authorised**. | | Submit `enhancedSchemeData.healthcare` with `totalHealthcareValue` only (**v72**). | **Authorised**. | | Trigger a partial authorization on a healthcare payment. See [Partial authorizations](https://docs.adyen.com/online-payments/partial-authorizations#testing). | **PartiallyAuthorised**, with the authorized amount in `additionalData.authorisedAmountValue`. | | Submit a `totalHealthcareValue` of 0. | HTTP **422** validation error. | | Submit a `totalHealthcareValue` that exceeds `amount.value`. | HTTP **422** validation error. | | Submit sub-amounts that sum to more than `totalHealthcareValue`. | HTTP **422** validation error. | ## See also * [SIG-IS registration and certification](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/fsa-hsa/sig-is-setup) * [Enhanced scheme data](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data) * [Enhanced scheme data for American Express](https://docs.adyen.com/payment-methods/cards/enhanced-scheme-data/amex) * [Advanced flow](https://docs.adyen.com/online-payments/build-your-integration/advanced-flow) * [Partial authorizations](https://docs.adyen.com/online-payments/partial-authorizations) * [Payment result codes](https://docs.adyen.com/online-payments/payment-result-codes) * [Webhooks](https://docs.adyen.com/development-resources/webhooks) * [Test card numbers](https://docs.adyen.com/development-resources/test-cards-and-credentials/test-card-numbers)