Manage your own pre approvals
Financing Integration Guide — Minimal Data Sharing
Display pre-qualified financing offers without sharing customer data upfront.
This integration type is not configured by default, please contact to learn more about it at contact@tryslatehq.com
Overview
This integration approach allows you to offer financing to your customers while minimizing upfront data sharing. With this flow, you create pre-approvals, and Slate only receives customer details when they actively apply for financing.
How it works
-
Create pre-approval — Generate a financing offer using your
externalIdand underwriting data -
Display offers — Create a session token and embed Slate's banner to show the offer
-
Customer application — Users apply through Slate's hosted application flow
-
Receive webhook — Slate notifies you when an application is submitted
-
Share revenue data — Send customer revenue information to support Slate's underwriting
-
Financing agreement — Approved applications result in financing agreements
When to use this approach
Choose this integration method if you:
-
Want to control what customer data is shared and when
-
Perform your own pre-qualification or underwriting
-
Only share data for customers who actively express interest in financing
-
Need to comply with specific data privacy requirements
Integration steps
Step 1: Configure pre-approval settings
Before creating pre-approvals, contact the Slate team at integrations@tryslatehq.com to configure your pre-approval parameters, including:
-
Default repayment terms
-
Supported loan amounts
-
Eligibility criteria
-
Approval logic
Step 2: Create a pre-approval
Generate a pre-approval offer based on your own underwriting criteria. You only need to provide minimal business information at this stage:
POST https://api.tryslatehq.com/v1/pre-approvals
Request:
{
"business": {
"externalId": "biz_123456"
},
"averageMonthlyRevenue": 125000,
"requestedAmount": 50000,
"requestedAmountCurrency": "CAD"
}
Response:
{
"id": "pre_x1y2z3",
"status": "ACTIVE",
"amount": 50000,
"currency": "CAD",
"repaymentFrequency": "weekly",
"repaymentTerm": 12,
"origin": "self"
}
Parameters:
-
externalId— Your stable identifier for this business -
legalName— Business legal name -
type— Incorporation type:CORPORATION,SOLE_PROPRIETORSHIP,PARTNERSHIP, ornull -
averageMonthlyRevenue— Average monthly revenue in cents (e.g., 125000 = $1,250.00) -
requestedAmount— Loan amount in cents -
requestedAmountCurrency— Currently onlyCADis supported
Alternative format:
If you've already created the business in Slate's system, you can reference it by ID:
{
"business": "bus_a1b2c3d4e5",
"averageMonthlyRevenue": 125000,
"requestedAmount": 50000,
"requestedAmountCurrency": "CAD"
}
Step 3: Create a user session token
Generate a secure session token for the business. This token will authenticate the embedded banner.
POST https://api.tryslatehq.com/v1/user-sessions
Request:
{
"externalId": "biz_123456"
}
Response:
{
"token": "ust_a1b2c3d4e5f6g7h8i9j0"
}
Important: Generate this token server-side to protect your API key. Never expose your API key in frontend code.
Note: At this stage, if no business exists with this externalId, one will be created automatically when the customer submits their application.
Step 4: Embed the financing banner
Add Slate's script to your frontend and pass the session token. The banner will display the pre-approval offer you created.
<!DOCTYPE html>
<html>
<head>
<title>Your Application</title>
</head>
<body>
<!-- Your application content -->
<!-- Slate financing banner -->
<div id="slate-financing-banner"></div>
<script src="https://cdn.tryslatehq.com/banner.js"></script>
<script>
Slate.init({
token: 'ust_a1b2c3d4e5f6g7h8i9j0', // Session token from Step 3
containerId: 'slate-financing-banner'
});
</script>
</body>
</html>
Behavior:
-
The banner displays your pre-approval offer
-
Clicking the banner opens Slate's application flow
-
The customer completes their application on Slate's hosted page
Step 5: Set up webhook listener
Configure your webhook endpoint to receive application events from Slate. Contact integrations@tryslatehq.com to register your webhook URL.
Example webhook payload:
{
"event": "application.submitted",
"data": {
"id": "app_m1n2o3p4",
"businessId": "bus_a1b2c3d4e5",
"externalId": "biz_123456",
"status": "PROCESSING",
"timestamp": "2025-11-06T14:30:00Z"
}
}
Application events:
-
application.submitted— Customer submitted an application -
application.requires_action— Additional information needed -
application.approved— Application approved -
application.rejected— Application declined
Step 6: Share revenue data after application
When you receive the application.submitted webhook, send the customer's revenue data to Slate. This information supports Slate's underwriting and compliance processes.
PUT https://api.tryslatehq.com/v1/businesses/{externalId}/attach-revenue-data
Option 1: Summarized revenue
{
"type": "SUMMARY",
"data": [
{
"month": 10,
"year": 2025,
"revenue": 125000,
"currency": "CAD"
},
{
"month": 9,
"year": 2025,
"revenue": 118000,
"currency": "CAD"
},
{
"month": 8,
"year": 2025,
"revenue": 132000,
"currency": "CAD"
}
]
}
Option 2: Itemized revenue
{
"type": "ITEMIZED",
"data": [
{
"id": "txn_001",
"date": "2025-10-15",
"amount": 5000,
"currency": "CAD",
"sourceAccount": "customer_abc",
"destinationAccount": "merchant_xyz"
},
{
"id": "txn_002",
"date": "2025-10-16",
"amount": 7500,
"currency": "CAD",
"sourceAccount": "customer_def",
"destinationAccount": "merchant_xyz"
}
]
}
Step 7: Access financing agreements
Once approved, retrieve the financing agreement:
GET https://api.tryslatehq.com/v1/financing-agreements?businessExternalId=biz_123456
Response:
{
"data": [
{
"id": "fa_q1r2s3t4",
"businessId": "bus_a1b2c3d4e5",
"type": "fixed_mca",
"fixed_mca": {
"paybackAmount": 60000,
"factorRate": 1.2
},
"fundedAmount": 50000,
"fundedDate": "2025-11-10",
"currency": "CAD",
"firstPaymentDate": "2025-11-17",
"estimatedLastPaymentDate": "2026-02-07",
"status": "in_progress",
"nextPaymentDate": "2025-11-17",
"nextPaymentAmount": 5000,
"term": 12,
"termUnit": "week",
"repaymentFrequency": 1,
"repaymentFrequencyUnit": "week",
"remainingBalance": 60000,
"totalPaid": 0,
"payments": []
}
]
}
Complete integration example
Here's a server-side implementation showing the complete flow:
// Step 1: Create pre-approval
async function createPreApproval(externalId, legalName, monthlyRevenue, amount) {
const response = await fetch('https://api.tryslatehq.com/v1/pre-approvals', {
method: 'POST',
headers: {
'x-api-key': process.env.SLATE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
business: {
externalId: externalId,
legalName: legalName,
type: 'CORPORATION'
},
averageMonthlyRevenue: monthlyRevenue,
requestedAmount: amount,
requestedAmountCurrency: 'CAD'
})
});
return await response.json();
}
// Step 2: Create session token
async function createSessionToken(externalId) {
const response = await fetch('https://api.tryslatehq.com/v1/user-sessions', {
method: 'POST',
headers: {
'x-api-key': process.env.SLATE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
externalId: externalId
})
});
const data = await response.json();
return data.token;
}
// Step 3: Webhook handler
async function handleWebhook(req, res) {
const { event, data } = req.body;
if (event === 'application.submitted') {
// Share revenue data after application submission
await attachRevenueData(data.externalId);
}
res.status(200).send('OK');
}
// Step 4: Attach revenue data
async function attachRevenueData(externalId) {
const revenueData = await getRevenueFromYourSystem(externalId);
await fetch(`https://api.tryslatehq.com/v1/businesses/${externalId}/attach-revenue-data`, {
method: 'PUT',
headers: {
'x-api-key': process.env.SLATE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
type: 'SUMMARY',
data: revenueData
})
});
}
Authentication
All API requests require authentication using your private API key in the x-api-key header:
curl https://api.tryslatehq.com/v1/pre-approvals \
-H "x-api-key: your_private_api_key" \
-H "Content-Type: application/json" \
-d '{"business": {...}, "averageMonthlyRevenue": 125000, ...}'
Security: Never expose your private API key in client-side code. Always make API calls from your backend.
Best practices
Validate data before creating pre-approvals — Ensure you have accurate underwriting data before generating offers.
Respond to webhooks quickly — Process webhook events and send revenue data promptly to avoid delays in underwriting.
Cache session tokens — Session tokens can be reused within a session. Generate new tokens periodically for security.
Monitor pre-approval status — Pre-approvals can expire or be consumed. Check their status regularly.
Handle webhook retries — Implement idempotent webhook handlers to safely process duplicate events.
Store external IDs consistently — Use the same externalId across pre-approvals, sessions, and revenue data.
Comparison with full data sharing
|
Feature |
Minimal Data Sharing |
Full Data Sharing |
|---|---|---|
|
Initial data required |
Minimal (name, type, revenue estimate) |
Complete (business details, revenue history) |
|
Pre-approval creation |
Manual via API |
Automatic by Slate |
|
Approval rate |
Unknown |
90% |
|
Data sharing timing |
After application submission |
Upfront |
|
Control over offers |
Partner controls |
Slate controls |
|
Setup complexity |
Moderate |
Simple |