Push to Card

With Finix Push to Card, users can debit and credit any Payment Instrument in real-time.

Instead of using the ACH, which can take 2-3 days to settle funds, Finix Push to Card disburses funds in real-time by using APIs provided directly by the card networks. With Finix Push to Card, users can immediately push (credit) or pull (debit) funds from any Payment Instrument, including bank accounts, debit cards, credit cards, or prepaid cards.

You can use Finix's Push to Card APIs to:

warning

This API is available for Disbursement use cases only. If you have additional questions, contact Support.

Step 1: Create a Recipient Identity

The first step to push (or disburse) funds is creating an Identity resource. Each Identity represents either a person or a business. We use this resource to associate cards and payouts. This structure makes it simple to manage and reconcile payment instruments and payout history. Accounting of funds is done using the Identity so it's recommended to have an Identity per recipient of funds. Additionally, the Identity resource is optionally used to collect KYC information.

You can also use Finix Push to Card APIs to debit (pull) the funds you want to disburse. Once you've pulled the funds, you can then use the same Finix Push to Card APIs to credit (push) the funds you pulled to a different payment instrument.

Copy
Copied
curl https://finix.sandbox-payments-api.com/identities \
    -H "Content-Type: application/vnd.json+api" \
    -u USte61SqeNkAZnpfavK3fQNG:bd98703c-d72c-458e-8873-4295f5bac713 \
    -d '
	{
	    "tags": {
	        "key": "value"
	    },
	    "entity": {
	        "phone": "7145677612",
	        "first_name": "Ricardo",
	        "last_name": "Kline",
	        "email": "Ricardo@gmail.com",
	        "personal_address": {
	            "city": "San Mateo",
	            "country": "USA",
	            "region": "CA",
	            "line2": "Apartment 7",
	            "line1": "741 Douglass St",
	            "postal_code": "94114"
	        }
	    }
	}'

Example Response:

Copy
Copied
{
  "id" : "IDqeE5eaMBksiphXMfv3gJZw",
  "application" : "APpJbVTLdEuwGfcxBJvb1qNH",
  "entity" : {
    "title" : null,
    "first_name" : "Ricardo",
    "last_name" : "Kline",
    "email" : "Ricardo@gmail.com",
    "business_name" : null,
    "business_type" : null,
    "doing_business_as" : null,
    "phone" : "7145677612",
    "business_phone" : null,
    "personal_address" : {
      "line1" : "741 Douglass St",
      "line2" : "Apartment 7",
      "city" : "San Mateo",
      "region" : "CA",
      "postal_code" : "94114",
      "country" : "USA"
    },
    "business_address" : null,
    "mcc" : null,
    "dob" : null,
    "max_transaction_amount" : 0,
    "amex_mid" : null,
    "discover_mid" : null,
    "url" : null,
    "annual_card_volume" : 0,
    "has_accepted_credit_cards_previously" : false,
    "incorporation_date" : null,
    "principal_percentage_ownership" : null,
    "short_business_name" : null,
    "ownership_type" : null,
    "tax_authority" : null,
    "tax_id_provided" : false,
    "business_tax_id_provided" : false,
    "default_statement_descriptor" : null
  },
  "tags" : {
    "key" : "value"
  },
  "created_at" : "2022-01-27T07:36:41.28Z",
  "updated_at" : "2022-01-27T07:36:41.28Z",
  "_links" : {
    "self" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw"
    },
    "verifications" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/verifications"
    },
    "merchants" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/merchants"
    },
    "settlements" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/settlements"
    },
    "authorizations" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/authorizations"
    },
    "transfers" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/transfers"
    },
    "payment_instruments" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/payment_instruments"
    },
    "associated_identities" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/associated_identities"
    },
    "disputes" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/disputes"
    },
    "application" : {
      "href" : "https://finix.sandbox-payments-api.com/applications/APpJbVTLdEuwGfcxBJvb1qNH"
    }
  }
}

HTTP Request

POST https://finix.sandbox-payments-api.com/identities

Request Arguments

Field Type Description
first_name string, optional First name
last_name string, optional Last name
email string, optional Email
phone string, optional Phone number
tags object, optional Key value pair for annotating custom metadata (e.g. order numbers)
personal_address object, optional Customers shipping address or billing address (Full description of child attributes below)

Address-object Request Arguments

Field Type Description
line1 string, optional First line of the address (max 35 characters)
line2 string, optional Second line of the address (max 35 characters)
city string, optional City (max 20 characters)
region string, optional 2-letter State code
postal_code string, optional Zip or Postal code (max 7 characters)
country string, optional 3-Letter Country code

Step 2: Add a Payment Instrument for the Recipient

warning

Please note that creating cards directly via the API should only be done for testing purposes. You must use the Tokenization iframe or javascript client to remain out of PCI scope.

Now that we've created an Identity for our recipient, we'll need to tokenize a payment card where funds will be disbursed.

In the API, payment cards are represented by the Payment Instrument resource.

To classify the Payment Instrument as a payment card you'll need to pass PAYMENT_CARD in the type field of your request, and you'll also want to pass the ID of the Identity that you created in the last step via the identity field to properly associate it with your recipient.

attention

Including an address when tokenizing a card can lower interchange on credit card transactions.

Copy
Copied
curl https://finix.sandbox-payments-api.com/payment_instruments \
    -H "Content-Type: application/vnd.json+api" \
    -u USte61SqeNkAZnpfavK3fQNG:bd98703c-d72c-458e-8873-4295f5bac713 \
    -d '
	{
	    "name": "Alex Lopez",
	    "expiration_year": 2029,
	    "tags": {
	        "card_name": "Business Card"
	    },
	    "number": "4895142232120006",
	    "expiration_month": 12,
	    "address": {
	        "city": "San Francisco",
	        "region": "CA",
	        "postal_code": "94404",
	        "line1": "900 Metro Center Blv",
	        "country": "USA"
	    },
	    "security_code": "022",
	    "type": "PAYMENT_CARD",
	    "identity": "IDqeE5eaMBksiphXMfv3gJZw"
	}'

Example Response:

Copy
Copied
{
  "id" : "PIRp4Cu3fG7DFQPdzhGcePL",
  "application" : "APpJbVTLdEuwGfcxBJvb1qNH",
  "fingerprint" : "FPRogKWsRQks2HGaau5eGR9AF",
  "tags" : {
    "card_name" : "Business Card"
  },
  "expiration_month" : 12,
  "expiration_year" : 2029,
  "bin" : "489514",
  "last_four" : "0006",
  "brand" : "VISA",
  "card_type" : "UNKNOWN",
  "name" : "Alex Lopez",
  "address" : {
    "line1" : "900 Metro Center Blv",
    "line2" : null,
    "city" : "San Francisco",
    "region" : "CA",
    "postal_code" : "94404",
    "country" : "USA"
  },
  "address_verification" : "UNKNOWN",
  "security_code_verification" : "UNKNOWN",
  "created_at" : "2022-01-27T07:36:44.00Z",
  "updated_at" : "2022-01-27T07:36:44.00Z",
  "instrument_type" : "PAYMENT_CARD",
  "type" : "PAYMENT_CARD",
  "currency" : "USD",
  "identity" : "IDqeE5eaMBksiphXMfv3gJZw",
  "_links" : {
    "self" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PIRp4Cu3fG7DFQPdzhGcePL"
    },
    "authorizations" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PIRp4Cu3fG7DFQPdzhGcePL/authorizations"
    },
    "transfers" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PIRp4Cu3fG7DFQPdzhGcePL/transfers"
    },
    "verifications" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PIRp4Cu3fG7DFQPdzhGcePL/verifications"
    },
    "application" : {
      "href" : "https://finix.sandbox-payments-api.com/applications/APpJbVTLdEuwGfcxBJvb1qNH"
    },
    "identity" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw"
    },
    "updates" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PIRp4Cu3fG7DFQPdzhGcePL/updates"
    }
  }
}

HTTP Request

POST https://finix.sandbox-payments-api.com/payment_instruments

Request Arguments

Field Type Description
identity string, required ID of the Identity that the card should be associated
type string, required Type of Payment Instrument (for cards input PAYMENT_CARD)
number string, required Primary card account number
security_code string, required The 3-4 digit security code for the card (i.e. CVV code)
expiration_month integer, required Expiration month (e.g. 12 for December)
expiration_year integer, required 4-digit expiration year
currency string, required Currency that should be associated with card
name string, optional Full name of the registered card holder
address object, required Billing address (Full description of child attributes below)
Note: Including a postal or zip code when tokenizing a card can lower the interchange on credit card transactions

Address-object Request Arguments

Field Type Description
line1 string, optional First line of the address (max 20 characters)
line2 string, optional Second line of the address (max 35 characters)
city string, optional City (max 20 characters)
region string, optional 2-letter State code
postal_code string, required Zip or Postal code (max 7 characters)
country string, optional 3-Letter Country code

Step 3: Verify card is eligible to receive push-to-card disbursements

Now that we've associated a payment instrument to a recipient, we'll need to verify whether or not the card is eligible to receive push-to-card disbursements. How? By making a request to the Verifications endpoint. The returned Verification resource returns a set of general attributes and details about the card in question (e.g. card type, issuer information). For example, the inquiry_details object will contain a push_funds_block_indicator attribute that indicates if it is eligible for push-to-card disbursements. Below you'll see a number of fields and the potential responses.

Copy
Copied
curl https://finix.sandbox-payments-api.com/payment_instruments/PI77BEnaiYZDya1U6T38n72F/verifications \
    -H "Content-Type: application/vnd.json+api" \
    -u USte61SqeNkAZnpfavK3fQNG:bd98703c-d72c-458e-8873-4295f5bac713 \
    -d '
	{
	    "processor": "VISA_V1"
	}'

Example Response:

Copy
Copied
{
  "id" : "VI8KFmppVwQMgCHMJ5pqrECT",
  "application" : "APpJbVTLdEuwGfcxBJvb1qNH",
  "tags" : { },
  "messages" : [ ],
  "raw" : {
    "validation_details" : {
      "systems_trace_audit_number" : "202707000063",
      "error_result" : null,
      "transaction_identifier" : "133121226160779",
      "approval_code" : null,
      "action_code" : "25",
      "response_code" : "5",
      "address_verification_results" : "I",
      "cvv2_result_code" : "P"
    },
    "inquiry_details" : {
      "systems_trace_audit_number" : "202707000063",
      "error_result" : null,
      "visa_network_info" : [ {
        "card_type_code" : "D",
        "billing_currency_code" : 840,
        "billing_currency_minor_digits" : 2,
        "issuer_name" : "Visa Test Bank",
        "card_issuer_country_code" : 840,
        "fast_funds_indicator" : "D",
        "push_funds_block_indicator" : "C",
        "online_gambing_block_indicator" : "N"
      } ],
      "ppgs_network_info" : [ ]
    },
    "general_inquiry_details" : {
      "systems_trace_audit_number" : "202707000063",
      "error_result" : null,
      "card_product_id" : "B",
      "card_product_name" : "Visa Traditional Rewards",
      "card_product_subtype_code" : "",
      "card_product_subtype_description" : "",
      "card_type_code" : "C",
      "card_subtype_code" : "",
      "card_platform_code" : "CN",
      "issuer_name" : "BANCO AGROMERCANTIL DE GUATEMALA S.A.",
      "bin" : "481507",
      "country_code" : "320",
      "status" : {
        "status_code" : "CDI000",
        "status_description" : "Success"
      }
    }
  },
  "processor" : "VISA_V1",
  "state" : "SUCCEEDED",
  "created_at" : "2022-01-27T07:37:33.39Z",
  "updated_at" : "2022-01-27T07:37:35.26Z",
  "trace_id" : "202707000063",
  "payment_instrument" : "PI77BEnaiYZDya1U6T38n72F",
  "merchant" : null,
  "identity" : null,
  "_links" : {
    "self" : {
      "href" : "https://finix.sandbox-payments-api.com/verifications/VI8KFmppVwQMgCHMJ5pqrECT"
    },
    "application" : {
      "href" : "https://finix.sandbox-payments-api.com/applications/APpJbVTLdEuwGfcxBJvb1qNH"
    },
    "payment_instrument" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PI77BEnaiYZDya1U6T38n72F"
    }
  }
}

HTTP Request

POST https://finix.sandbox-payments-api.com/payment_instruments/:PAYMENT_INSTRUMENT_ID/verifications

URL Parameters

Parameter Description
:PAYMENT_INSTRUMENT_ID ID of the Payment Instrument

Request Arguments

Field Type Description
processor string, required The name of the processor, which needs to be: VISA_V1
country string, optional 3-Letter Country code. This attribute is currently only applicable for our Latin America partners.

Address Verification Results (address_verification_results)

Letter Description
D, F, M, Y Address verified
A, B, C, G, I, N, P, R, S, U, W Address not verified
Z Postal/ZIP match, street addresses do not match or street address not included in request

Card Verification 2 Results (cvv2_result_code)

Letter Description
M CVV and expiration verified
N, P, S Either CVV or expiration date is incorrect
U Issuer does not participate in CVV2 service

Card Type (card_type_code)

This one-character code indicates whether the account is credit, debit, prepaid, deferred debit, or charge.

Letter Description
C Credit
D Debit
H Charge Card
P Prepaid
R Deferred Debit

Fasts Funds Indicator (fast_funds_indicator)

Indicates whether or not the card is Fast Funds eligible (i.e. if the funds will settle in 30 mins or less). If not eligible, typically funds will settle within 2 business days.

Letter Description
B Fast Funds eligible for all transactions
D Fast Funds eligible for only domestic transactions
N Not eligible for Fast Funds

Push Funds Indicator (push_funds_block_indicator)

This code indicates if the associated card can receive push-to-card disbursements.

Letter Description
A, B, C Accepts push-to-card payments
N Does not accept push-to-card payments

Online Gambling Block Indicator (online_gambing_block_indicator)

Indicates if the card can receive push-payments for online gambling payouts.

Letter Description
Y Blocked for online gambling payouts
N Not blocked for online gambling payouts

Card Product ID (card_product_id)

A combination of card brand, platform, class and scheme.

Letter Description
A Visa Traditional
AX American Express
B Visa Traditional Rewards
C Visa Signature
D Visa Signature Preferred
DI Discover
DN Diners
E Proprietary ATM
F Visa Classic
G Visa Business
G1 Visa Signature Business
G2 Visa Business Check Card
G3 Visa Business Enhanced
G4 Visa Infinite Business
G5 Visa Business Rewards
I Visa Infinite
I1 Visa Infinite Privilege
I2 Visa UHNW
J3 Visa Healthcare
JC JCB
K Visa Corporate T&E
K1 Visa Government Corporate T&E
L Visa Electron
M MasterCard
N Visa Platinum
N1 Visa Rewards
N2 Visa Select
P Visa Gold
Q Private Label
Q1 Private Label Prepaid
Q2 Private Label Basic
Q3 Private Label Standard
Q4 Private Label Enhanced
Q5 Private Label Specialized
Q6 Private Label Premium
R Proprietary
S Visa Purchasing
S1 Visa Purchasing with Fleet
S2 Visa Government Purchasing
S3 Visa Government Purchasing with Fleet
S4 Visa Commercial Agriculture
S5 Visa Commercial Transport
S6 Visa Commercial Marketplace
U Visa Travel Money
V Visa V PAY

Product Sub-Type (card_product_subtype)

Description of product subtype.

Letter Description
AC Agriculture Maintenance Account
AE Agriculture Debit Account/Electron
AG Agriculture
AI Agriculture Investment Loan
CG Brazil Cargo
CS Construction
DS Distribution
HC Healthcare
LP Visa Large Purchase Advantage
MA Visa Mobile Agent
MB Interoperable Mobile Branchless Banking
MG Visa Mobile General
VA Visa Vale - Supermarket
VF Visa Vale - Fuel
VR Visa Vale - Restaurant

Card Sub-Type (card_subtype_code)

The code for account funding source subtype, such as reloadable and non-reloadable.

Letter Description
N Non-Reloadable
R Reloadable

Step 4: Provision Recipient Account

Now that we've associated a Payment Instrument with our recipient's Identity we're ready to provision a Recipient account. This is the last step before you can begin paying out an Identity. Luckily you've already done most of the heavy lifting. Just make one final POST request, and you'll be returned a Merchant resource.

Copy
Copied
curl https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw/merchants \
    -H "Content-Type: application/vnd.json+api" \
    -u USte61SqeNkAZnpfavK3fQNG:bd98703c-d72c-458e-8873-4295f5bac713 \
    -d '
	{
	    "processor": "VISA_V1"
	}'

Example Response:

Copy
Copied
{
  "id" : "MU5zYchdMxxv5QCRS6bVuF8h",
  "application" : "APpJbVTLdEuwGfcxBJvb1qNH",
  "identity" : "IDqeE5eaMBksiphXMfv3gJZw",
  "verification" : "VIhozunYhMu5nPFfwp9VrEts",
  "merchant_profile" : "MPk8QzrrAjGBAm5QD6TrvA2g",
  "processor" : "VISA_V1",
  "processing_enabled" : true,
  "settlement_enabled" : true,
  "gross_settlement_enabled" : false,
  "creating_transfer_from_report_enabled" : true,
  "card_expiration_date_required" : true,
  "card_cvv_required" : false,
  "tags" : { },
  "mcc" : null,
  "mid" : null,
  "merchant_name" : "Ricardo Kline",
  "settlement_funding_identifier" : "UNSET",
  "ready_to_settle_upon" : "RECONCILIATION",
  "fee_ready_to_settle_upon" : "RECONCILIATION",
  "level_two_level_three_data_enabled" : false,
  "created_at" : "2022-01-27T07:36:45.95Z",
  "updated_at" : "2022-01-27T07:36:46.17Z",
  "onboarding_state" : "APPROVED",
  "processor_details" : { },
  "_links" : {
    "self" : {
      "href" : "https://finix.sandbox-payments-api.com/merchants/MU5zYchdMxxv5QCRS6bVuF8h"
    },
    "identity" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw"
    },
    "verifications" : {
      "href" : "https://finix.sandbox-payments-api.com/merchants/MU5zYchdMxxv5QCRS6bVuF8h/verifications"
    },
    "merchant_profile" : {
      "href" : "https://finix.sandbox-payments-api.com/merchant_profiles/MPk8QzrrAjGBAm5QD6TrvA2g"
    },
    "application" : {
      "href" : "https://finix.sandbox-payments-api.com/applications/APpJbVTLdEuwGfcxBJvb1qNH"
    },
    "verification" : {
      "href" : "https://finix.sandbox-payments-api.com/verifications/VIhozunYhMu5nPFfwp9VrEts"
    }
  }
}

HTTP Request

POST https://finix.sandbox-payments-api.com/identities/identityID/merchants

Request Arguments

Field Type Description
processor string, optional Name of Processor

Step 5: Send Payout

Now the final step - time to payout the recipient!

Next you'll need to create a Transfer. What's a Transfer? Glad you asked! A Transfer represents any flow of funds either to or from a Payment Instrument. In this case a Payout to a card.

To create a Transfer we'll simply supply the Payment Instrument ID of the previously tokenized card as the destination field. Also, be sure to note that the amount field is in cents.

Simple enough, right? You'll also want to store the ID from that Transfer for your records. Transfers can have two possible states SUCCEEDED and FAILED.

Copy
Copied
curl https://finix.sandbox-payments-api.com/transfers \
    -H "Content-Type: application/vnd.json+api" \
    -u USte61SqeNkAZnpfavK3fQNG:bd98703c-d72c-458e-8873-4295f5bac713 \
    -d '
	{
	    "currency": "USD",
	    "amount": 1510,
	    "destination": "PIRp4Cu3fG7DFQPdzhGcePL",
	    "tags": {
	        "order_number": "21DFASJSAKAS"
	    }
	}'

Example Response:

Copy
Copied
{
  "id" : "TRtVMWmn23kyNUk6KxukJNKq",
  "amount" : 1510,
  "tags" : {
    "order_number" : "21DFASJSAKAS"
  },
  "state" : "SUCCEEDED",
  "trace_id" : "202707000060",
  "currency" : "USD",
  "application" : "APpJbVTLdEuwGfcxBJvb1qNH",
  "source" : null,
  "destination" : "PIRp4Cu3fG7DFQPdzhGcePL",
  "ready_to_settle_at" : null,
  "externally_funded" : "UNKNOWN",
  "fee" : 0,
  "statement_descriptor" : null,
  "type" : "CREDIT",
  "messages" : [ ],
  "raw" : null,
  "created_at" : "2022-01-27T07:36:47.55Z",
  "updated_at" : "2022-01-27T07:36:48.67Z",
  "idempotency_id" : null,
  "merchant_identity" : "IDqeE5eaMBksiphXMfv3gJZw",
  "subtype" : "API",
  "_links" : {
    "application" : {
      "href" : "https://finix.sandbox-payments-api.com/applications/APpJbVTLdEuwGfcxBJvb1qNH"
    },
    "self" : {
      "href" : "https://finix.sandbox-payments-api.com/transfers/TRtVMWmn23kyNUk6KxukJNKq"
    },
    "merchant_identity" : {
      "href" : "https://finix.sandbox-payments-api.com/identities/IDqeE5eaMBksiphXMfv3gJZw"
    },
    "payment_instruments" : {
      "href" : "https://finix.sandbox-payments-api.com/transfers/TRtVMWmn23kyNUk6KxukJNKq/payment_instruments"
    },
    "reversals" : {
      "href" : "https://finix.sandbox-payments-api.com/transfers/TRtVMWmn23kyNUk6KxukJNKq/reversals"
    },
    "fees" : {
      "href" : "https://finix.sandbox-payments-api.com/transfers/TRtVMWmn23kyNUk6KxukJNKq/fees"
    },
    "disputes" : {
      "href" : "https://finix.sandbox-payments-api.com/transfers/TRtVMWmn23kyNUk6KxukJNKq/disputes"
    },
    "destination" : {
      "href" : "https://finix.sandbox-payments-api.com/payment_instruments/PIRp4Cu3fG7DFQPdzhGcePL"
    },
    "fee_profile" : {
      "href" : "https://finix.sandbox-payments-api.com/fee_profiles/FPbDSnEPtaT8Nttxj9NJk7eC"
    }
  }
}

HTTP Request

POST https://finix.sandbox-payments-api.com/transfers

Request Arguments

Field Type Description
destination string, required ID of the Payment Instrument where funds will be sent
amount integer, required The total amount that will be charged in cents (e.g. 100 cents to charge $1.00)
currency string, required 3-letter ISO code designating the currency of the Transfers (e.g. USD)
tags object, optional Key value pair for annotating custom metadata (e.g. order numbers)
country string, optional 3-Letter Country code. This attribute is currently only applicable for our Latin America partners.