Integration GuideGuideSlate Partner API

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

  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/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, or null

  • 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": "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