Manage your own Pre-Approvals
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 us to learn more 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 externalId and 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/pre-approvals
Request:
{
"business": {
"externalId": "biz_123"
},
"averageMonthlyRevenue": 10000,
"requestedAmount": 10000,
"requestedAmountCurrency": "CAD"
}
Response:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"businessId": "123e4567-e89b-12d3-a456-426614174000",
"externalId": "biz_123",
"status": "ACTIVE",
"amount": 10000,
"currency": "CAD",
"repaymentFrequency": 1,
"repaymentFrequencyUnit": "month",
"origin": "slate",
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-01T00:00:00Z"
}
Parameters:
- externalId — Your stable identifier for this business
- averageMonthlyRevenue — Average monthly revenue in cents (e.g., 125000 = $1,250.00)
- requestedAmount — Loan amount in cents
- requestedAmountCurrency — Currently only CAD is supported
Alternative format:
If you've already created the business in Slate's system, you can reference it by ID:
{
"business": "123e4567-e89b-12d3-a456-426614174000",
"averageMonthlyRevenue": 10000,
"requestedAmount": 10000,
"requestedAmountCurrency": "CAD"
}
Step 3 — Create a User Session Token
Generate a secure session token on your backend for each business that will view financing offers. This token authenticates the embedded banner.
POST https://api.tryslatehq.com/user-sessions
Request:
{
"externalId": "biz_123"
}
Response:
{
"token": "ust_a1b2c3d4e5f6g7h8i9j0"
}
⚠️ Important
Generate this token server-side to protect your API key. Never expose your API key in frontend code.
Note: If the externalId doesn't match an existing business, a new business record will be created automatically when the customer submits an application.
Step 4 — Embed the Financing Banner
Add Slate's script to your frontend and pass the session token. The banner will automatically appear if the business has an active pre-approval.
<!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 4
containerId: 'slate-financing-banner'
});
</script>
</body>
</html>
Behavior:
- If the business has an ACTIVE pre-approval, the banner displays the offer details
- If no pre-approval exists, nothing is rendered
- Clicking the banner opens Slate's application flow in a new window or modal
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_type": "application.created",
"data": {
"id": "123e4567-e89b-12d3-a456-426614174000"
},
"timestamp": "2025-01-01T00:00: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 financial data after application
When you receive the application.submitted webhook, send the customer's financial data to Slate. This information supports Slate's underwriting and compliance processes.
POST https://api.tryslatehq.com/businesses/{id}/attach-financial-data
Request:
{
"externalId": "biz_123",
"timeseries": [
{
"date": "2025-01-01",
"propertyName*": "anything"
}
]
}
Response:
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"businessId": "123e4567-e89b-12d3-a456-426614174000",
"timeseries": [
{
"date": "2025-01-01",
"propertyName*": "anything"
}
]
}
Step 7 — Access Financing Agreements
Once an application is approved, retrieve the financing agreement details:
GET https://api.tryslatehq.com/financing-agreements?externalId=biz_123
Response:
{
"data": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"businessId": "123e4567-e89b-12d3-a456-426614174000",
"type": "fixed_mca",
"fixedMCA": {
"paybackAmount": 10000,
"factorRate": 1.2
},
"fundedAmount": 10000,
"fundedDate": "2025-01-01T00:00:00Z",
"currency": "CAD",
"firstPaymentDate": "2025-01-01T00:00:00Z",
"estimatedLastPaymentDate": "2025-01-01T00:00:00Z",
"status": "IN_PROGRESS",
"term": 12,
"termUnit": "month",
"repaymentFrequency": 1,
"repaymentFrequencyUnit": "month",
"remainingBalance": 10000,
"totalPaid": 10000,
"createdAt": "2025-01-01T00:00:00Z",
"updatedAt": "2025-01-01T00:00:00Z"
}
],
"page": 1,
"limit": 1,
"total": 1,
"totalPages": 1
}
Complete integration example
Here's a server-side implementation showing the complete flow:
// Step 1: Create pre-approval
async function createPreApproval(externalId, 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
},
averageMonthlyRevenue: monthlyRevenue,
requestedAmount: amount,
requestedAmountCurrency: 'CAD'
})
});
response_json = await response.json();
const slateBusinessId = response_json.businessId
return 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, slateBusinessId) {
const { event, data } = req.body;
if (event === 'application.submitted') {
// Share revenue data after application submission
await attachRevenueData(data.externalId, slateBusinessId);
}
res.status(200).send('OK');
}
// Step 4: Attach revenue data
async function attachRevenueData(externalId, slateBusinessId) {
const revenueData = await getRevenueFromYourSystem(externalId);
await fetch(`https://api.tryslatehq.com/v1/businesses/${slateBusinessId}/attach-revenue-data`, {
method: 'PUT',
headers: {
'x-api-key': process.env.SLATE_API_KEY,
'Content-Type': 'application/json'
},
body: JSON.stringify({
"externalId": "biz_123",
"timeseries": [{
"date": "2025-01-01",
...revenueData
}]
})
});
}
Authentication
All API requests require authentication using your private API key in the x-api-key header:
Note: You can create multiple api keys in the developer section of the dasbhoard
curl https://api.tryslatehq.com/businesses \
-H "x-api-key: your_private_api_key" \
-H "Content-Type: application/json"
⚠️ Important
Never expose your private API key in client-side code. Always generate session tokens on your backend.
Pagination
List endpoints support pagination using page and limit parameters:
GET https://api.tryslatehq.com/businesses?page=2&limit=10
Best practices
Keep business data current — Update business information and revenue data regularly to ensure accurate pre-approvals.
Cache session tokens — Session tokens can be reused for the same business within a session. Generate new tokens periodically for security.
Handle missing offers gracefully — The banner won't render if there's no active pre-approval. Design your UI to work with or without the financing offer.
Monitor application status — Poll the applications endpoint or use webhooks to stay informed about application progress.
Test thoroughly — Verify the integration in your staging environment before going live.
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 |