Skip to main content

Embedded Components Implementation

This section helps you launch a merchant cash advance program by adding prebuilt components into your platform's UI.

Configuring Payment Processor Settings

Configure your payment processor settings through the Unit Dashboard to provide anonymized data for prequalification and underwriting of merchant cash advance offers. You can add multiple processors if you would like Unit to evaluate income data from multiple sources when generating offers.

To configure your payment processor settings:

  1. Navigate to Settings from the top menu under the Developer section.
  2. Select the Payment Processing tab.
  3. Select your Vendor from the dropdown.
  4. Enter your API key (your payment processor secret key).
  5. Enter your Webhook secret (your payment processor webhook signing secret).
  6. Click Save to apply your settings.

Required Settings

SettingRequiredDescription
VendorYesSelect your payment processor.
API keyYesYour payment processor API key (secret key). This is required for Unit to pull anonymized processing data to prequalify and generate merchant cash advance offers for your customers.
Webhook secretYesYour payment processor webhook signing secret. This is required to verify incoming webhook events, understand when your customer receives a sales payout, and calculate/collect payments on active merchant cash advances.

Creating Prequalified Offers

Create prospects to identify the population of businesses that you would like Unit to prequalify for a merchant cash advance offer.

To create a prospect, you must provide a JWT subject and payment processor account details (e.g., the customer's connected account ID on Stripe). You have the option to provide additional anonymized data that helps Unit more accurately assess eligibility and size offers.

Create Prospect

VerbPOST
URLhttps://api.s.unit.sh/capital/prospects
Data Typeprospect
Timeout (Seconds)5

Attributes

NameTypeDescription
prospectType RequiredstringType of prospect. Currently only Business is supported.
idempotencyKey RequiredstringUnique key to ensure idempotent requests.
jwtSubject RequiredstringUnique identifier for the end customer on your side.
paymentProcessorAccounts RequiredarrayA list of payment processor accounts associated with this prospect. See Payment Processor Accounts.
establishmentDate OptionalRFC3339 Date stringDate the business was established (e.g. 2014-01-28).
naicsCode Optionalstring6-digit business NAICS code.
businessStructure OptionalstringLegal entity type of the business. One of LLC, Sole Proprietor, S Corporation, C Corporation. Helps Unit assess eligibility and suppress offers for ineligible entity types.
businessState OptionalstringTwo-letter US state code where the business is located (e.g. CA). Helps Unit assess eligibility and suppress offers for businesses in ineligible states.
tags RequiredobjectSee Tags.

Payment Processor Accounts

An array of payment processor account objects. Each object identifies a single account on a specific processor.

NameTypeDescription
type RequiredstringThe payment processor. Currently only Stripe is supported.
accountId RequiredstringThe account ID associated with the prospect on this processor (e.g. their Stripe connected account ID).
Example Request:
curl -X POST 'https://api.s.unit.sh/capital/prospects'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "prospect",
"attributes": {
"prospectType": "Business",
"idempotencyKey": "3a1a33be-4e12-4603-9ed0-820922389fb8",
"jwtSubject": "2ab1f266-04b9-41fb-b728-cd1962bca52c",
"paymentProcessorAccounts": [
{
"type": "Stripe",
"accountId": "acct_1aBcDeFgHiJkLmN"
}
],
"establishmentDate": "2001-08-10",
"naicsCode": "541511",
"businessStructure": "LLC",
"businessState": "CA"
}
}
}'

Response

Response is a JSON:API document.

201 Created

Prospect is a JSON:API resource, top-level fields:

NameTypeDescription
id RequiredstringIdentifier of the prospect resource.
type RequiredstringType of the prospect resource.
attributes RequiredJSON ObjectJSON object representing the prospect data.

Attributes

NameTypeDescription
createdAt RequiredRFC3339 Date stringThe date the resource was created (e.g. 2022-02-23T12:15:47.386Z).
prospectType RequiredstringType of prospect. Currently only Business is supported.
paymentProcessorAccounts RequiredarrayA list of payment processor accounts associated with this prospect.
establishmentDate OptionalRFC3339 Date stringDate the business was established (e.g. 2014-01-28).
naicsCode Optionalstring6-digit business NAICS code.
businessStructure OptionalstringLegal entity type of the business.
businessState OptionalstringTwo-letter US state code where the business is located.
tags RequiredobjectSee Tags.
Example response:
{
"data": {
"type": "prospect",
"id": "7345432",
"attributes": {
"createdAt": "2022-02-23T12:15:47.386Z",
"prospectType": "Business",
"paymentProcessorAccounts": [
{
"type": "Stripe",
"accountId": "acct_1aBcDeFgHiJkLmN"
}
],
"establishmentDate": "2001-08-10",
"naicsCode": "541511",
"businessStructure": "LLC",
"businessState": "CA"
}
}
}

When a prospect is created, Unit will immediately evaluate the last six months of processing data for the business, as well as any additional data provided on the business, and determine if prequalified offers can be generated.

Create Bulk Prospects

To create multiple prospects in a single request, use the bulk endpoint. Processing is asynchronous — the batch is created immediately with a Pending status and transitions to Completed once all prospects have been ingested.

The endpoint accepts two formats, selected by the Content-Type header.

JSON
VerbPOST
URLhttps://api.s.unit.sh/capital/prospects/bulk
Data TypebulkProspects
Timeout (Seconds)5

Attributes

NameTypeDescription
idempotencyKey Requiredstring Unique key (1–255 chars) to ensure idempotent requests.
prospects Requiredarray Array of prospect objects. At least 1 item required.
tags OptionalobjectSee Tags. Applied to the bulk batch.

Each prospect object in the prospects array:

NameTypeDescription
prospectType Requiredstring Type of prospect. Currently only Business is supported.
jwtSubject Requiredstring Unique identifier for the end customer on your side (1–255 chars). Must be unique within the batch.
paymentProcessorAccounts Requiredarray Non-empty array of {type, accountId} objects. Currently only Stripe is supported as type.
businessName Optionalstring
businessContact OptionalobjectfullName (first/last), email, and phone (countryCode/number).
establishmentDate OptionalRFC3339 Date stringDate the business was established (e.g. 2014-01-28).
businessStructure OptionalstringOne of: Corporation, LLC, Partnership, PubliclyTradedCorporation, PrivatelyHeldCorporation, NotForProfitOrganization, SoleProprietor.
businessState OptionalstringTwo-letter US state code.
Example Request:
curl -X POST 'https://api.s.unit.sh/capital/prospects/bulk'
-H 'Content-Type: application/vnd.api+json'
-H 'Authorization: Bearer ${TOKEN}'
--data-raw '{
"data": {
"type": "bulkProspects",
"attributes": {
"idempotencyKey": "bulk-2026-06-23-001",
"prospects": [
{
"prospectType": "Business",
"jwtSubject": "partner-user-abc123",
"paymentProcessorAccounts": [
{
"type": "Stripe",
"accountId": "acct_1234567890"
}
],
"businessName": "Acme LLC",
"establishmentDate": "2014-01-01",
"businessStructure": "LLC",
"businessState": "CA",
"businessContact": {
"fullName": {
"first": "Jane",
"last": "Doe"
},
"email": "jane@acme.com",
"phone": {
"countryCode": "1",
"number": "5551234567"
}
}
},
{
"prospectType": "Business",
"jwtSubject": "partner-user-def456",
"paymentProcessorAccounts": [
{
"type": "Stripe",
"accountId": "acct_sample_002"
}
],
"businessName": "Riverside Catering Co.",
"establishmentDate": "2018-03-15",
"businessStructure": "SoleProprietor",
"businessState": "CA",
"businessContact": {
"fullName": {
"first": "Marcus",
"last": "Rivera"
},
"email": "marcus@riversidecatering.com",
"phone": {
"countryCode": "1",
"number": "4155550192"
}
}
}
]
}
}
}'

201 Created

bulkProspects is a JSON:API resource, top-level fields:

NameTypeDescription
id RequiredstringIdentifier of the bulk prospects batch.
type RequiredstringbulkProspects
attributes RequiredobjectSee below.
relationships Requiredobjectorg relationship.

Attributes

NameTypeDescription
createdAt RequiredRFC3339 Date stringThe date the batch was created.
status RequiredstringPending while prospects are being processed; Completed once all prospects have been ingested.
tags RequiredobjectSee Tags.
Example response:
{
"data": {
"type": "bulkProspects",
"id": "1",
"attributes": {
"createdAt": "2024-06-01T12:00:00Z",
"status": "Pending",
"tags": {}
},
"relationships": {
"org": {
"data": {
"type": "org",
"id": "1"
}
}
}
}
}
CSV

Send the raw CSV file bytes (not base64, not multipart) with the following headers:

HeaderValue
Content-Typetext/csv
file-nameFilename of the CSV (e.g. prospects.csv)

The response is the same 201 Created bulkProspects resource described above.

Format

The first row must be a header row. Columns must appear in the following order:

jwtSubject,prospectType,businessName,establishmentDate,businessStructure,businessState,contactFirstName,contactLastName,contactEmail,contactPhoneCountryCode,contactPhoneNumber,paymentProcessorAccounts
Note

Column order is required. Additional columns are ignored; missing required columns return a 400.

Column reference:

ColumnIndexTypeRequiredNotes
jwtSubject0stringYes1–255 chars. Unique identifier for the end customer on your side. Must be unique within the file.
prospectType1stringYesMust be Business.
businessName2stringNo
establishmentDate3dateNoRFC 3339 full-date, e.g. 2020-06-01.
businessStructure4stringNoOne of: Corporation, LLC, Partnership, PubliclyTradedCorporation, PrivatelyHeldCorporation, NotForProfitOrganization, SoleProprietor.
businessState5stringNoTwo-letter US state code.
contactFirstName6stringNo
contactLastName7stringNo
contactEmail8stringNo
contactPhoneCountryCode9stringNoMust be provided together with contactPhoneNumber, or both empty.
contactPhoneNumber10stringNoMust be provided together with contactPhoneCountryCode, or both empty.
paymentProcessorAccounts11JSONYesNon-empty JSON-encoded array of {type, accountId}. Currently only Stripe is supported as type.

The paymentProcessorAccounts column contains a JSON array encoded inside a quoted CSV cell. Inner double-quotes are doubled per the CSV spec:

"[{""type"":""Stripe"",""accountId"":""acct_1234567890""}]"
Sample
jwtSubject,prospectType,businessName,establishmentDate,businessStructure,businessState,contactFirstName,contactLastName,contactEmail,contactPhoneCountryCode,contactPhoneNumber,paymentProcessorAccounts
partner-user-abc123,Business,Acme LLC,2014-01-01,LLC,CA,Jane,Doe,jane@acme.com,1,5551234567,"[{""type"":""Stripe"",""accountId"":""acct_1234567890""}]"
Validation errors

If any rows fail parsing, the API returns 400 with a message listing up to 20 per-line errors:

Failed to parse bulk prospects file [prospects.csv]
line 2: jwtSubject must not be empty
line 3: paymentProcessorAccounts must not be empty
line 4: contactPhoneCountryCode and contactPhoneNumber must both be provided or both be empty

If the file has fewer than 12 columns:

Expected at least 12 columns, but got N

If every row in the file is invalid:

All of file [prospects.csv] rows are invalid, please check you have the right columns in the right order

Retrieve Bulk Prospects Batch

VerbGET
URLhttps://api.s.unit.sh/capital/prospects/bulk/{id}
Data TypebulkProspects
Timeout (Seconds)5

Returns the bulkProspects resource by ID. Poll until status is Completed to confirm all prospects in the batch have been ingested.

NameTypeDescription
id RequiredpathID of the bulk prospects batch returned when the batch was created.

Surfacing Prequalified Offers to Businesses

Embed unit-elements-capital-prequalification to surface merchant cash advance offers at high-intent moments across your platform — in dashboards, sidebars, home screens, or dedicated financing tabs. The component renders only when a customer has an active Prequalified offer; for Rejected and Expired statuses it renders nothing and takes up no space.

Set product-type="MerchantCashAdvance" and choose a display mode via mca-display-type:

  • Slider — an interactive amount selector with a live quote and an Apply Now CTA.
  • Banner — 10 layout options × 2 content variants for promotional placements across your platform.

Embedding the component in multiple locations — dashboards, payment pages, revenue views — increases visibility and drives adoption.

Note

A prospect must exist for the customer before the component will render.

Slider

Image preview
🔍Click to view

Click to view full preview

The slider lets the customer select a desired advance amount within their prequalified range. As the amount changes, a live quote updates with the repayment rate, fixed fee, and total payment. Clicking Apply Now fires unitCapitalPrequalifiedSliderApplyNowClicked — listen for this event to navigate the customer to the full application.

<unit-elements-capital-prequalification
jwt-token="demo.jwt.token"
product-type="MerchantCashAdvance"
mca-display-type="slider"
></unit-elements-capital-prequalification>

Note demo.jwt.token is a real value you can use to preview the component without any setup.

Banners

Banners are promotional placements you embed outside the main capital flow — in dashboards, sidebars, or home screens. For outreach emails, use a static image that links to a page where the component is embedded. Each banner shows a View Offer CTA. When clicked:

  • If redirect-url is set, the customer is taken to that URL.
  • Otherwise, the component switches internally to the slider.

Two content variants apply to all banner types via banner-variant:

  • funding — promotes the product to a customer who hasn't yet engaged.
  • prequalified — celebrates the prequalification and shows the customer's personalized offer amount.

The show-close-icon attribute renders a dismiss button. The dismiss click is not handled internally — add a listener on the host element if you need close behavior.

Slim

A compact horizontal strip for tight placements such as notification bars or page headers.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Promo

A standard promotional card suited for dashboards and home screens.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Promo Compact

A condensed mobile-native version of the promo layout.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Inline

A full-width placement that spans the container edge-to-edge.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Inline Compact

A condensed version of the inline layout. inline switches to inline-compact automatically at container widths ≤ 767 px — no attribute change needed.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Sidebar Illustrated

A sidebar placement with an illustration alongside the copy.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Sidebar Plain

A sidebar placement with copy only, no illustration.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Sidebar Compact

A condensed mobile-native sidebar layout.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Hero

A large full-width placement for prominent areas such as landing pages or top-of-page sections.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Hero Compact

A condensed version of the hero layout. hero switches to hero-compact automatically at container widths ≤ 767 px — no attribute change needed.

Funding
Image preview
🔍Click to view

Click to view full preview

Prequalified
Image preview
🔍Click to view

Click to view full preview

Attributes

<unit-elements-capital-prequalification
jwt-token="demo.jwt.token"
product-type="MerchantCashAdvance"
mca-display-type="banner"
banner-type="promo"
banner-variant="prequalified"
show-close-icon="true"
redirect-url="https://your-app.example.com/capital"
></unit-elements-capital-prequalification>
AttributeTypeDescription
jwt-tokenstringJWT for authenticating API calls. Required.
product-typestringMust be MerchantCashAdvance for the MCA path.
mca-display-typestringslider (default) or banner.
banner-typestringBanner layout when mca-display-type="banner". One of slim, promo, promo-compact, inline, inline-compact, sidebar-illustrated, sidebar-plain, sidebar-compact, hero, hero-compact. Defaults to promo.
banner-variantstringContent variant. funding (default) or prequalified.
show-close-iconbooleanShow a dismiss button on the banner. Optional, defaults to false. The dismiss click is not handled internally — add a listener on the host element if you need close behavior.
redirect-urlstringIf set, clicking View Offer navigates to this URL instead of switching to the slider. Optional.
customer-tokenstringOptional. When provided, the slider uses it to fetch quote data instead of the JWT. Does not affect prequalification status or rendering.

Click events

Events are dispatched on the host element. Listen to respond to user interactions.

EventFired whenDetail
unitCapitalPrequalifiedOfferViewedSlider mounts / prequalification data loads{ productType, minimumAdvanceAmount, maximumAdvanceAmount, status, customerId }
unitCapitalPrequalifiedOfferSliderMovedUser moves the slider{ amount, customerId }
unitCapitalPrequalifiedSliderApplyNowClickedUser clicks Apply Now on the slidernull
unitCapitalPrequalifiedBannerViewOfferClickedUser clicks View Offer on a banner{ route: string }

Example — navigating to the application when a customer clicks Apply Now:

<unit-elements-capital-prequalification
jwt-token="demo.jwt.token"
product-type="MerchantCashAdvance"
mca-display-type="slider"
></unit-elements-capital-prequalification>
<script>
document
.querySelector('unit-elements-capital-prequalification')
.addEventListener('unitCapitalPrequalifiedSliderApplyNowClicked', function () {
window.location.href = 'https://your-app.example.com/capital/apply';
});
</script>

To customize the appearance of the component, see Theming options.

Embedding Financing in Your Platform

Embed the Ready-to-Launch component to allow customers to apply for financing and manage their financing after they accept an offer, directly in your platform's UI.

Note

If you are currently using Unit's Ready-to-Launch Banking and/or Bill Pay product(s), you've already completed this step! The Ready-to-Launch capital experience will appear to your customers alongside their other products in an all-in-one experience.

Customers can:

  • Complete an application
  • Accept a final offer and sign terms
  • View their payment progress
  • Monitor transaction history
  • Make payments
  • View their signed agreement and disclosures

The Ready-to-Launch component displays content dynamically based on the customer's financing status:

  • Active prequalified offer: Displays offer details and a prompt for the customer to start an application.
  • Active application: Displays the in-progress application for the customer to complete and submit.
  • Active final offer: Displays the final offer terms for the customer to review, accept, and sign.
  • Active financing: Displays the customer's active financing, including payment progress, transaction history, and options to make payments or view their signed agreement.

Embedding

5 minutes

If you have not done so already, embed the Ready-to-Launch component into your app.

  1. Add the script tag below to your HTML header
<script async src="https://ui.s.unit.sh/release/latest/components-extended.js"></script>
Note

In the production environment, use https://ui.unit.co/release/latest/components-extended.js as the script source.

  1. Add a new page to your app that will host the Ready-to-Launch capital experience (for example, a dedicated Financing page). Paste the code below to the new page.
<unit-elements-white-label-app jwt-token="demo.jwt.token"></unit-elements-white-label-app>

You may choose to create unit-elements-white-label-app dynamically using JavaScript:

<html>
<head>
<script
async
src="https://ui.s.unit.sh/release/latest/components-extended.js"
></script>
</head>
<body>
<div id="unit-app-placeholder"></div>
<script>
const unit = document.createElement("unit-elements-white-label-app");
unit.setAttribute("jwt-token", "demo.jwt.token");
document.querySelector("#unit-app-placeholder").append(unit);
</script>
</body>
</html>

Authentication

Up to 2 hours

In order to seamlessly authenticate with Unit's Ready-to-Launch Capital app, you need to pass it a JWT, that allows us to identify your user and verify that they are logged in.

Unit will not ask the user to log in using a separate set of credentials. However, before performing any sensitive banking activities, we will OTP the user.

In sandbox, please use code 000001 to complete the OTP.

Configuring your identity provider

20 minutes

If your identity provider (or your own implementation) exposes a JWKS path (for example, Okta, Auth0, AWS Cognito, or Stytch), follow the steps below. If not, follow the steps in Unit's Custom JWT Authentication Guide.

Log into Unit's dashboard.

  • Under Developer, go to Settings.
  • In the Authentication tab, choose your identity provider from the Provider dropdown.
  • Paste the JWKS path into the JWKS field.

Passing The JWT

10 minutes

Pass your JWT to Unit's Ready-to-Launch component (see example below), replacing the static token that was previously there.

<unit-elements-white-label-app jwt-token="{{JwtToken}}"></unit-elements-white-label-app>

Cleanup

10 minutes

Ready-to-Launch Capital will use 2 keys in local storage: unitCustomerToken and unitVerifiedCustomerToken. It's important to clean them up when the user logs out from your app, or after 24 hours, whichever comes first.

localStorage.removeItem("unitCustomerToken");
localStorage.removeItem("unitVerifiedCustomerToken");
Suggestion

Starting from version 4.2.0, tokens are stored in memory rather than localStorage. If you are using version 4.2.0 or later, you no longer need to manually remove these keys on logout.

Content Security Policy

10 minutes

If you are using a Content-Security-Policy (CSP) header, you may need to extend it to allow the web components and third-party integrations (such as Zendesk and Plaid) to work correctly.

Add the following <meta> tag:

<meta
http-equiv="Content-Security-Policy"
content="
connect-src 'self'
https://*.s.unit.sh
https://*.unit.co
https://*.zdassets.com
https://*.zendesk.com
https://cdn.plaid.com
https://*.au10tixservices.com;
script-src 'self'
https://*.zdassets.com
https://*.zendesk.com
https://cdn.plaid.com
https://*.au10tixservices.com;
frame-src 'self'
https://*.zendesk.com
https://cdn.plaid.com
https://*.au10tixservices.com;
"
/>