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

  1. Create pre-approval — Generate a financing offer using your externalId and underwriting data
  2. Display offers — Create a session token and embed Slate's banner to show the offer
  3. Customer application — Users apply through Slate's hosted application flow
  4. Receive webhook — Slate notifies you when an application is submitted
  5. Share revenue data — Send customer revenue information to support Slate's underwriting
  6. 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