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
Your backend is only involved once, to mint a session. Everything a leasing professional does afterward happens directly between the widget and 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, thecommunity_id, theclient_idand 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
The following must already be in place before implementation begins. If any of these are missing, contact your Funnel representative.
| Requirement | Details |
|---|---|
| An API key | Provided 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 ID | The Funnel ID of the property whose units should be available for quoting. Each session corresponds to exactly one community. |
| A client record | The 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. |
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.
/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
| Field | Type | Required | Description |
|---|---|---|---|
community_id | integer | Yes | The community whose units the session may quote. |
client_id | integer | Yes | The guest card the quotes will be attached to. |
capabilities | object | No | Map of capability → boolean (see Step 2). Anything omitted is false. |
# 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
}
}'{
"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
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.
| Capability | Unlocks |
|---|---|
can_view_pricing | Searching units and seeing prices at all. Almost always required. |
can_preview_quote | The fee & deposit breakdown, shown before anything is created. |
can_create_quote | Actually creating a quote. Required for the widget to do anything beyond browsing. |
can_download_pdf | Downloading a PDF of a created quote. |
can_send_email | Emailing a created quote to the prospect. |
can_cancel_quote | Cancelling a quote belonging to the session's client. |
can_retry_sync | Retrying a quote whose sync to the property management system failed. |
can_override_blackout_dates | Letting a lease end on a date the community has blacked out. |
can_override_rent | Entering rent manually when revenue management pricing is not available for the unit. |
Recommended baseline
can_view_pricing, can_preview_quote, can_create_quote, can_download_pdf and can_send_email.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.
https://api.funnelleasing.com/widgets/quote-generator/?token=SESSION_TOKEN
URL parameters
| Param | Required | What it does |
|---|---|---|
token | Required | The 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_id | Optional | A Funnel Unit ID. Skips the search step and opens straight to pricing for one specific unit. |
accent_color | Optional | Recolor buttons and highlights to match your brand: a 3- or 6-digit hex code, URL-encoded (#0CB0FE becomes %230CB0FE). |
Web (iframe)
<!-- 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
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)
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)
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)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
https://api.funnelleasing.com/widgets/quote-generator/?token=SESSION_TOKEN&unit_id=482213&accent_color=%230CB0FE
Responsive by default
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
For help with the Quote Generator widget, contact support@funnelleasing.com or your Funnel Leasing account representative.