Private preview
Integrate Consumer Credit Issuing Private preview
Use Consumer Credit Issuing to launch a credit program for your customers.
Create a bank-sponsored credit program that lets you onboard consumers, issue cards, manage repayments, and handle disputes.
Set up a sandbox
Before using Consumer Credit Issuing in production, test it in a sandbox:
- When you create a Stripe account, click Go to sandbox .
- Go to the Connect page in the Stripe Dashboard.
- Click Get started , then click Continue setup .
- Select Platform as your business model, then click Use the Accounts v1 API instead .
- Click Start testing , then click Create test account and create your test account.
- In the top left corner, click your platform’s name, then click Exit sandbox .
- Email your Stripe representative the account ID of your sandbox account and live account. To find the account IDs:
- Sandbox account ID: Go to Settings > Business . Copy the account ID.
- Live account ID: Go to Settings > Personal Details , and in the Accounts section, copy the account ID.
Set up your platform
To set up your platform with Stripe:
- Retrieve your issuing program ID.
- Upload the terms of service (TOS) for your issuing program.
- Using your issuing program ID, set the TOS for your issuing program.
Retrieve your issuing program ID
Command Line
cURL
Use the id value from the response as the the related setting in later steps.
Example response:
Upload TOS
Command Line
Use the id value from the response as the the related setting when setting TOS for your issuing program.
Example response:
{
"id": "file_1SPXMDHc09eLP8enFkiWcPNS",
"object": "file",
"created": 1762213217,
"expires_at": null,
"filename": "tos.pdf",
...
"purpose": "platform_terms_of_service",
...
}
Set the TOS for your issuing program
Command Line
cURL
Onboard consumers
To onboard a consumer to your credit program, create a connected account for them, collect their KYC information, run underwriting, and activate their credit policy.
Create a connected account
Create a Custom connected account for the consumer:
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
For business_profile, replace https://www.example.com with your platform’s URL. The MCC 5999 is the standard default for general-purpose consumer credit cards. You can use a more specific code for your platform’s vertical. See Merchant categories for the full list.
Next, create an issuing program on the connected account using the platform issuing program ID you retrieved in the previous section:
Command Line
cURL
Collect KYC information
Collect the consumer’s personal information and submit it to the account.
Stripe attempts to verify the consumer’s identity using their name, date of birth, and SSN. See Handle identity verification for instructions about implementing this flow. Use the below endpoint to submit the required information. If programmatic verification isn’t possible, Stripe returns a requirement to upload a government ID.
Command Line
cURL
Note
individual[self_reported_monthly_housing_payment] is only required if the consumer rents their home.
The connected account now has the KYC requirements for Consumer Credit Issuing. You can view them by retrieving the account.
Report the credit decision
Note
This step applies to BYO underwriting integrations only. For hosted underwriting, go to Initiate underwriting.
Create a credit underwriting record for the consumer’s application:
Command Line
cURL
Then report the decision using the credit underwriting record ID from the response:
Command Line
cURL
Negative decisions require Adverse Action Notices. Use the no-code solution to send them automatically.
Initiate underwriting
Note
This step applies to Hosted Underwriting integrations only. For BYO Underwriting, go to Collect terms of service acceptance.
Submit the consumer’s application to Stripe for underwriting:
Command Line
cURL
Stripe sends an issuing.credit_underwriting_record.updated webhook with the result. Check for application.state: pre_approval and a non-null decision.credit_limit_approved to confirm the consumer is pre-approved before proceeding to collect Terms of Service acceptance.
Collect Terms of Service acceptance
Present the consumer with the approved credit limit, APR, and final terms of service. After they accept, record it on the account.
For hosted underwriting integrations, Stripe performs the hard credit pull after TOS acceptance and sends an issuing.credit_underwriting_record.updated webhook confirming the result.
Command Line
cURL
Activate the credit policy
Retrieve the consumer’s credit policy ID:
Command Line
cURL
Then activate it with the approved credit limit and billing cycle:
Command Line
cURL
Test hosted underwriting
You can test different scenarios in your hosted underwriting flow by using a special first name for the consumer. Replace individual[first_name] with one of the magic strings listed below.
| Magic string | Scenario |
|---|---|
frozen_file_at_credit_bureau | Credit report returns a frozen file. |
final_approval_frozen_file_at_credit_bureau | The consumer is initially pre-approved and accepts the Terms of Service, but is rejected when the hard credit pull reveals a credit freeze. |
alert_final_approval_initial_fraud_phone | A hard pull detects a fraud alert and Stripe has the consumer’s phone number on record. |
alert_final_approval_initial_fraud_no_phone | A hard pull detects a fraud alert and Stripe doesn’t have the consumer’s phone number on record. |
alert_final_approval_extended_fraud_phone | An extended fraud alert during final approval. Stripe contacts the consumer by phone. |
alert_final_approval_extended_fraud_no_phone | An extended fraud alert during final approval. Stripe contacts the consumer by email. |
alert_pre_approval_initial_fraud_phone | A soft pull finds a fraud alert and Stripe has the consumer’s phone number. |
alert_pre_approval_initial_fraud_no_phone | A soft pull finds a fraud alert and Stripe doesn’t have the consumer’s phone number. |
alert_pre_approval_extended_fraud_phone | An extended fraud alert during pre-approval. Stripe contacts the consumer by phone. |
alert_pre_approval_extended_fraud_no_phone | An extended fraud alert during pre-approval. Stripe contacts the consumer by email. |
Command Line
When you initiate consumer underwriting in the next step, set underwriting_policy to any value.
Command Line
Suspend a credit policy
Platforms can suspend a cardholder’s credit policy for suspected fraud pending investigation. All changes to credit policy status require a supporting credit underwriting record.
First, create a credit underwriting record for suspension:
Command Line
Select a language
cURL
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Next, change the credit policy’s status to suspended with a supporting status reason of suspected fraud pending investigation.
Use the cardholder’s credit policy ID, and the credit underwriting record ID obtained in the previous step.
Command Line
Lift suspension on a credit policy
Platforms might lift suspension on a cardholder’s credit policy if they’re removing the last platform_controlled suspension status_reason, and no other status reasons, whether platform-controlled or stripe-controlled, are present.
For example, platforms can suspend a credit policy for suspected fraud and later lift that suspension. However, if the account also goes delinquent while suspended, the platform can remove their fraud-related suspension status reason, but can’t transition the credit policy back to active.
First, create a credit underwriting record to lift the platform-controlled suspension:
Command Line
Select a language
cURL
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Next, transition the credit policy back to active.
In this case, the credit underwriting record ID isn’t needed. The call works if the credit underwriting record was created first. Additionally, you don’t have to indicate removal of the status reason through API parameters.
Use the cardholder’s credit policy ID.
Command Line
Close a credit policy
Platforms can permanently close a cardholder’s credit policy for suspected fraud or terms of service violations.
All changes to credit policy status require a supporting credit underwriting record.
First, create a credit underwriting record for closure. Valid credit_line_closed reasons include suspected_fraud or terms_of_use_violation.
Command Line
Select a language
cURL
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Next, change the credit policy’s status to permanently_closed with the proper supporting status reason.
Valid status reason type enums include suspected_fraud and tos_violation.
Use the cardholder’s credit policy ID, and the credit underwriting record ID obtained in the previous step.
Command Line
Set up payment method for accepting repayments
If you use Stripe to collect repayments, collect bank account details and configure a Customer and Payment Method.
First, create a Stripe bank account token from the cardholder’s bank account. Collect the consumer’s authorization to perform an ACH direct debit. Alternatively, use Stripe Financial Connections where Stripe requests authorization.
Next, create a Customer object on your platform account to save the payment method for reuse. Store the connected account ID in the customer’s metadata to link the customer back to the consumer.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Next, update the metadata on the connected account to point to the Customer object.
Command Line
Select a language
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
Then create a SetupIntent to prepare for later payments.
Command Line
Save the PaymentMethod from the response. You’ll use it to create repayments.
Finally, confirm the SetupIntent.
Command Line
Issue a card
To issue a card, follow these guides. You can also add cards to digital wallets.
- Design a card
- Choose a design bundle
- Go through design review
- Issue a physical card
- Create a cardholder
- Create a card
- Activate a card
You can also enable spend controls. Spend controls let you configure spend limits on cards and cardholders, such as the max amount for specific types of businesses per day. If no spend limits are configured when creating a card, Stripe implements a 500 USD daily spend limit by default as a layer of protection.
If a physical card is lost or expires, you can replace it.
Fund the cards
The funds flow uses three balances:
- Consumer (CA) Issuing Balance/Credit Ledger : The Credit Ledger tracks a consumer’s obligations to the platform. The related Issuing Balance ensures compliant funds flows between platforms and consumers, and is 0 USD in steady state.
- Platform Issuing Balance/Funding Obligation : The Platform Funding Obligation tracks the platform’s obligations to Stripe (to be post-funded). The related Issuing Balance receives post-funding funds from the platform.
- Platform Issuing Reserve : This is a special balance that Stripe draws from only if repayment for platform obligations is overdue. Drawing from the reserve affects credit limits and might affect authorizations.
Learn how to manage your Platform Issuing Reserve.
Authorization
Approve or decline the authorization, then process the issuing authorization notification. When Stripe processes an Issuing authorization, it sends an issuing_authorization.created webhook. The authorization is available in the Issuing Authorization API. Stripe sends an issuing_transaction.created webhook when it processes a capture, which includes the final amount actually captured for an authorization.
Manage post-funding
The diagram below shows the main integration points to post-fund consumer card spend.
Settlement
Stripe sends an issuing_funding_obligation.updated webhook for each FundingObligation update (a record of the platform’s obligation to Stripe) each day. When a funding obligation’s status transitions to unpaid, the amount is final and ready for repayment.
To confirm the platform obligation amount, call the FundingObligations API to list obligations. Obligations that are in states of unpaid and past_due need to be paid.
Command Line
cURL
Example response:
To retrieve bank account details for wiring funds to Stripe, call the Funding Instructions API:
Command Line
cURL
Issue rewards
To record a reward on a consumer’s credit ledger, first retrieve the consumer’s current pending funding obligation, then create a credit ledger adjustment:
Command Line
cURL
Command Line
cURL
You can also use credit ledger adjustments to make other corrections to a consumer’s credit ledger. For debits, use reason=platform_issued_debit_memo and set amount_type to "debit".
Display account information
Show available balance
Retrieve the consumer’s credit ledger to show their current available credit, statement balance, and payment status:
Command Line
cURL
Example response:
{
"credit_limit": 100000,
"amount_pending": 10000,
"obligations": {
"accruing": 5000,
"unpaid": 15000
},
"credit_available": 70000,
"currency": "usd",
"statement_balance": 15150,
"minimum_payment_amount": 5000,
"due_at": 12345678,
"remaining_minimum_payment": 100,
"remaining_statement_balance": 10250,
"payment_status": "good_standing"
}
List transactions
List credit ledger entries to show a consumer’s transaction history. Optionally filter by a specific credit statement:
Command Line
cURL
To retrieve additional detail about each entry, call the API corresponding to its source.type:
- For issuing _ transaction , call the Issuing Transaction API . If the transaction has an associated authorization, retrieve the authorization for enriched merchant data.
- For issuing _ credit _ ledger _ adjustment , call the /the relevant part of the product _ ledger _ adjustments API.
View statements
Stripe sends an issuing_credit_statement.finalized webhook when a billing statement is generated. The webhook includes a statement_pdf URL for the statement PDF.
To list all finalized statements for a consumer:
Command Line
cURL
To retrieve the current (not yet finalized) statement:
Command Line
cURL
To generate an unauthenticated download link for a statement PDF, create a file link using the file ID from the statement object.
Test statements
To test statements in test mode, create backdated transactions using the test helper APIs. Create a new connected account for each scenario you want to test, because backdated transactions can only be created before any statements are finalized for a line of credit.
Command Line
After creating backdated transactions, re-enable statement generation for the credit policy:
Command Line
Stripe sends issuing_credit_statement.created and issuing_credit_statement.finalized webhooks for each backdated statement period.
View finance charges
List finance charges (interest and fees) applied to a consumer’s credit account:
Command Line
cURL
Example response:
{
"object": "list",
"data": [
{
"id": "iflfc_123",
"object": "issuing.credit_ledger_finance_charge",
"amount": 100,
"applied_to_ledger_at": 1773532800,
"currency": "usd",
"description": "Interest charge",
"type": "interest"
}
]
}
Finance charge types include interest, interest_adjustment, late_fee, platform_initiated_fee, and returned_payment_fee. Negative amount values represent credits or adjustments.
Collect repayments
Create a one-off repayment
Create a repayment using the payment method and customer set up during consumer onboarding:
Command Line
Stripe sends webhooks as the repayment progresses: issuing.credit_repayment.processing when the ACH debit is initiated, issuing.credit_repayment.succeeded when it settles, and issuing.credit_repayment.failed if it fails (for example, insufficient funds or a bank return).
If a repayment fails, retrieve failure details from the Payment Records API using the payment_record ID from the repayment object:
Command Line
cURL
Schedule recurring repayments
Create a repayment schedule to automatically initiate recurring ACH repayments. This example configures a fixed amount repayment on the 15th of each month:
Command Line
Supported amount_details types include fixed_amount, current_balance, remaining_minimum_balance, and remaining_statement_balance. The next_repayment.scheduled_on field on the schedule shows when the next repayment will be initiated.
Scheduled repayments send the same webhooks as one-off repayments. The Credit Repayment object includes a credit_repayment_schedule field linking back to the schedule.
Handle disputes
Use the Create Dispute API to submit a dispute raised by a cardholder to the card network. See Issuing disputes for the full dispute lifecycle and webhook events.
