Skip to main content

Quote Generator Widget

Quote Generator Widget

Embed Funnel's Quote Generator in your own app or website, giving your leasing professionals a way to price a unit, select lease terms and add-ons, and generate a quote for a prospect without leaving your product

How the Integration Works

Your backend is only involved once, to mint a session. Everything a leasing professional does afterward happens directly between the widget and Funnel.

Your backendUser's deviceFunnel API1 · POST /partner-quoting/sessions/ with the API key2 · session token (expires in 75 min)3 · open the widget with ?token=…4 · search units, price, preview, create quoterepeats directly with Funnel for as long as the session is validquote created · PDF · emailSession setupYour appWidget ↔ Funnel

Only step 1 requires the API key. Once the widget has loaded, your backend is no longer in the loop.

  • 1. Mint a session - Your backend calls POST /api/v2/partner-quoting/sessions/ with your API key, the community_id, the client_id and the capabilities the session needs
  • 2. Receive a token - Funnel returns a signed session token that expires after 75 minutes
  • 3. Open the widget - Your app loads the widget URL with ?token=… in an iframe or in-app WebView
  • 4. Quote - The widget searches units, prices them and creates the quote by talking to Funnel directly, for as long as the session is valid. Your backend is not in the loop
📝

Only Step 1 needs the API key

Once the widget has loaded, it communicates with Funnel directly. The API key is used exclusively for the mint call and must never be shipped to a browser, iframe, or mobile app.

Before You Start

The following must already be in place before implementation begins. If any of these are missing, contact your Funnel representative.

RequirementDetails
An API keyProvided by Funnel for your company. One key is reused for every session you mint. Keep it on your backend only. Its role must include the Quotes route permission, or the mint call in Step 1 returns 403 — see route permissions and tell your Funnel representative to enable it if it's missing.
A community IDThe Funnel ID of the property whose units should be available for quoting. Each session corresponds to exactly one community.
A client recordThe Funnel Guest Card ID of the prospect requesting the quote. The prospect must already exist as a client record under your company — create one via the Prospect API if needed.
💡
See the Prospect API to create guest cards programmatically, and the Authentication guide for how API keys are used.

Step 1: Mint a Session

Before opening the widget, call this endpoint from your backend. This request must never be made from the browser or mobile app itself, since it requires the API key. Each session is scoped to a single client and community, and expires automatically after 75 minutes.

POST
/api/v2/partner-quoting/sessions/

Authentication

HTTP Basic Auth with your API key as the username and an empty password (-u "YOUR_API_KEY:" in cURL).

Request body

FieldTypeRequiredDescription
community_idintegerYesThe community whose units the session may quote.
client_idintegerYesThe guest card the quotes will be attached to.
capabilitiesobjectNoMap of capability → boolean (see Step 2). Anything omitted is false.
RequestcURL
# The API key goes in the Basic Auth username with no password -- never in the
# URL itself, where it could end up in access logs or a proxy's request history.
curl -X POST \
  "https://api.funnelleasing.com/api/v2/partner-quoting/sessions/" \
  -u "YOUR_API_KEY:" \
  -H "Content-Type: application/json" \
  -d '{
    "community_id": 1657,
    "client_id": 30613984,
    "capabilities": {
      "can_view_pricing": true,
      "can_preview_quote": true,
      "can_create_quote": true,
      "can_download_pdf": true,
      "can_send_email": true
    }
  }'
ResponseJSON200 · application/json
{
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJ0eXAiOiJwYXJ0bmVyX3F1b3Rpbmdfc2Vzc2lvbiIsImNvbXBhbnlfaWQiOjQyfQ.k3F9dQw4w9WgXcQz7pM2vL8sT1yR6oN0...",
  "expires_at": "2026-08-10T16:45:00.123456+00:00",
  "capabilities": {
    "can_view_pricing": true,
    "can_preview_quote": true,
    "can_create_quote": true,
    "can_cancel_quote": false,
    "can_retry_sync": false,
    "can_download_pdf": true,
    "can_send_email": true,
    "can_override_blackout_dates": false,
    "can_override_rent": false
  }
}

Both IDs must belong to the same company as the API key; otherwise the endpoint returns 400. A missing or inactive API key returns 401. A valid key whose role lacks the Quotes route permission returns 403.

⚠️

Security

Mint a new session for each visit, from the server. A token is a bearer credential for that specific client and community — handle it like a password reset link, not a reusable API key. Do not log it, cache it, or share it between users. If the API key that minted a session is later disabled or deleted, every session it minted is invalidated immediately.

Step 2: Define Session Capabilities

The capabilities object in the mint request determines what the widget is permitted to do during that session. Every requested capability is currently granted automatically, so request only the capabilities your integration requires. Values must be JSON booleans — a string like "false" is rejected with a 400, not silently treated as a grant. Funnel enforces every capability server-side.

CapabilityUnlocks
can_view_pricingSearching units and seeing prices at all. Almost always required.
can_preview_quoteThe fee & deposit breakdown, shown before anything is created.
can_create_quoteActually creating a quote. Required for the widget to do anything beyond browsing.
can_download_pdfDownloading a PDF of a created quote.
can_send_emailEmailing a created quote to the prospect.
can_cancel_quoteCancelling a quote belonging to the session's client.
can_retry_syncRetrying a quote whose sync to the property management system failed.
can_override_blackout_datesLetting a lease end on a date the community has blacked out.
can_override_rentEntering rent manually when revenue management pricing is not available for the unit.
📝

Recommended baseline

For a typical "generate and send a quote" integration, request can_view_pricing, can_preview_quote, can_create_quote, can_download_pdf and can_send_email.

Step 3: Load the Widget

Load the widget URL with the session token attached as a query parameter — in an <iframe> on the web, or a standard in-app WebView (WKWebView on iOS, WebView on Android). No further initialization is required once it loads. The pattern is the same regardless of platform.

Widget URLURL
https://api.funnelleasing.com/widgets/quote-generator/?token=SESSION_TOKEN

URL parameters

ParamRequiredWhat it does
tokenRequiredThe session token from Step 1, appended as-is (it is already URL-safe). The community and client it was minted for travel with it; no other identifiers need to be passed.
unit_idOptionalA Funnel Unit ID. Skips the search step and opens straight to pricing for one specific unit.
accent_colorOptionalRecolor buttons and highlights to match your brand: a 3- or 6-digit hex code, URL-encoded (#0CB0FE becomes %230CB0FE).

Web (iframe)

Embed in a web pageHTML
<!-- sessionToken comes from your backend's mint-session response -->
<iframe
  src="https://api.funnelleasing.com/widgets/quote-generator/?token=SESSION_TOKEN"
  title="Quote Generator"
  style="width: 100%; min-height: 720px; border: 0;"
></iframe>

React Native

react-native-webviewJSX
import { WebView } from 'react-native-webview';

// build the URL from your backend's mint-session response
const url =
  'https://api.funnelleasing.com/widgets/quote-generator/' +
  '?token=' + sessionToken;

<WebView source={{ uri: url }} style={{ flex: 1 }} />

iOS (Swift)

WKWebViewSwift
import WebKit

let webView = WKWebView(frame: view.bounds)
view.addSubview(webView)

let urlString =
    "https://api.funnelleasing.com/widgets/quote-generator/" +
    "?token=\(sessionToken)"
if let url = URL(string: urlString) {
    webView.load(URLRequest(url: url))
}

Android (Kotlin)

WebViewKotlin
val webView = findViewById<WebView>(R.id.quoteGeneratorView)
webView.settings.javaScriptEnabled = true

val url =
    "https://api.funnelleasing.com/widgets/quote-generator/" +
    "?token=$sessionToken"
webView.loadUrl(url)
‹Generate QuoteQuote Generator widgetrendered by FunnelYour app'snative headerFunnel widgetin the WebView

The header and back button are your own native UI. Everything inside the dashed outline is rendered by Funnel inside the WebView.

Deep-linking and branding

Open a specific unit with a custom accent colorURL
https://api.funnelleasing.com/widgets/quote-generator/?token=SESSION_TOKEN&unit_id=482213&accent_color=%230CB0FE
💡

Responsive by default

The widget is designed mobile-first and adapts to whatever space the iframe or WebView gives it, so no fixed dimensions need to be configured. If the session expires while the widget is open, it shows an expired message — mint a new session and reload it.

Before You Go Live

A brief checklist to confirm before the integration is made available to your leasing teams.

  • The API key never reaches the device. The mint call in Step 1 happens on your backend; the browser or WebView only ever receives the resulting session token
  • Each visit uses a newly minted session, not a cached one. Tokens expire after 75 minutes and should not be reused across visits or across different leasing professionals
  • Only the required capabilities are requested. Limiting the capabilities granted reduces exposure in the event a token is ever compromised
  • The community and client IDs belong to your company. The mint endpoint rejects any request that does not, so confirm production IDs before the first live test

Support

For help with the Quote Generator widget, contact support@funnelleasing.com or your Funnel Leasing account representative.