curl --request GET \
--url https://app.flashquotes.com/api/quotes \
--header 'x-api-key: <api-key>'const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.flashquotes.com/api/quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.flashquotes.com/api/quotes"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)require 'uri'
require 'net/http'
url = URI("https://app.flashquotes.com/api/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_bodypackage main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.flashquotes.com/api/quotes"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.flashquotes.com/api/quotes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"object": "list",
"url": "/api/quotes",
"hasMore": false,
"data": [
{
"object": "quote",
"id": "cmf2q8n4x0000kz01a1b2c3d4",
"createdAt": "2026-09-01T14:23:11.000Z",
"updatedAt": "2026-09-08T09:12:44.000Z",
"sentAt": "2026-09-02T10:00:00.000Z",
"expiresAt": "2026-09-30T23:59:59.000Z",
"bookedAt": null,
"lostAt": null,
"lostReason": null,
"leadId": "cmf2l8n4x0001kz01a1b2c3d4",
"locationId": "cmf2p8n4x0002kz01a1b2c3d4",
"eventTypeId": null,
"bookingId": null,
"discountId": null,
"taxRateId": null,
"paymentTermsId": null,
"contractId": null,
"numberOfStaff": 4,
"numberOfResources": 2,
"guestCount": 120,
"eventAddress": "123 Market Street, Denver, CO 80202",
"eventDescription": "Acme launch party",
"siteContactName": "Jane Doe",
"siteContactPhone": "+15555550123",
"entityToInvoice": "Acme",
"currency": {
"isoCode": "USD"
},
"totalPriceCents": 250000
}
]
}List Quotes
List quote summaries with live totals, date filters, cursor pagination, and optional expansions
curl --request GET \
--url https://app.flashquotes.com/api/quotes \
--header 'x-api-key: <api-key>'const options = {method: 'GET', headers: {'x-api-key': '<api-key>'}};
fetch('https://app.flashquotes.com/api/quotes', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://app.flashquotes.com/api/quotes"
headers = {"x-api-key": "<api-key>"}
response = requests.get(url, headers=headers)
print(response.text)require 'uri'
require 'net/http'
url = URI("https://app.flashquotes.com/api/quotes")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["x-api-key"] = '<api-key>'
response = http.request(request)
puts response.read_bodypackage main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://app.flashquotes.com/api/quotes"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("x-api-key", "<api-key>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://app.flashquotes.com/api/quotes",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"x-api-key: <api-key>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}{
"object": "list",
"url": "/api/quotes",
"hasMore": false,
"data": [
{
"object": "quote",
"id": "cmf2q8n4x0000kz01a1b2c3d4",
"createdAt": "2026-09-01T14:23:11.000Z",
"updatedAt": "2026-09-08T09:12:44.000Z",
"sentAt": "2026-09-02T10:00:00.000Z",
"expiresAt": "2026-09-30T23:59:59.000Z",
"bookedAt": null,
"lostAt": null,
"lostReason": null,
"leadId": "cmf2l8n4x0001kz01a1b2c3d4",
"locationId": "cmf2p8n4x0002kz01a1b2c3d4",
"eventTypeId": null,
"bookingId": null,
"discountId": null,
"taxRateId": null,
"paymentTermsId": null,
"contractId": null,
"numberOfStaff": 4,
"numberOfResources": 2,
"guestCount": 120,
"eventAddress": "123 Market Street, Denver, CO 80202",
"eventDescription": "Acme launch party",
"siteContactName": "Jane Doe",
"siteContactPhone": "+15555550123",
"entityToInvoice": "Acme",
"currency": {
"isoCode": "USD"
},
"totalPriceCents": 250000
}
]
}totalPriceCents as Get Quote.
Use your x-api-key with public API access. These endpoints require Scale or an eligible Grandfathered Pro plan.
curl --get 'https://app.flashquotes.com/api/quotes' \
--header "x-api-key: $FLASHQUOTES_API_KEY" \
--data-urlencode 'limit=25' \
--data-urlencode 'service_start_time[gte]=2026-10-01T00:00:00Z' \
--data-urlencode 'service_start_time[lt]=2026-11-01T00:00:00Z' \
--data-urlencode 'expand[]=data.lead' \
--data-urlencode 'expand[]=data.serviceDays'
FLASHQUOTES_API_KEY to your API key. This request finds quotes with at least one service day starting in October 2026 and includes contact and service-day details.
Pagination
| Parameter | Description |
|---|---|
limit | Page size. Integer from 1 to 100; default 10 |
starting_after | ID of the last quote from the previous page |
createdAt descending, then id descending. Sort order is fixed.
The response contains object: "list", url: "/api/quotes", hasMore, and a data array of quote objects. When hasMore is true, pass the ID of the last quote in data as starting_after. Keep the filters unchanged between pages.
curl --get 'https://app.flashquotes.com/api/quotes' \
--header "x-api-key: $FLASHQUOTES_API_KEY" \
--data-urlencode 'limit=25' \
--data-urlencode 'starting_after=cmf2q8n4x0000kz01a1b2c3d4' \
--data-urlencode 'service_start_time[gte]=2026-10-01T00:00:00Z' \
--data-urlencode 'service_start_time[lt]=2026-11-01T00:00:00Z' \
--data-urlencode 'expand[]=data.lead' \
--data-urlencode 'expand[]=data.serviceDays'
{
"object": "list",
"url": "/api/quotes",
"hasMore": false,
"data": []
}
Equality filters
| Parameter | Matches |
|---|---|
lead_id | Exact contact ID (leadId in the response) |
location_id | Exact location ID |
booking_id | Exact booking ID |
event_type_id | Exact event type ID |
lead_id and location_id to find a contact’s quotes at one location.
Date-range filters
| Field | Matches |
|---|---|
created_at | Quote creation time |
updated_at | Quote row update time |
service_start_time | At least one service day whose start time satisfies all supplied bounds |
[gt] (after), [gte] (at or after), [lt] (before), and [lte] (at or before). Values must be full ISO 8601 datetimes with a timezone: for example, 2026-10-01T00:00:00Z or 2026-10-01T00:00:00-06:00. Bare dates such as 2026-10-01 return 400.
Use --data-urlencode as shown above to encode brackets and timezone offsets correctly, including the + in positive offsets.
For a multi-day quote, one service day must satisfy the entire range. A start time before the lower bound on one day and after the upper bound on another does not match. Expanding serviceDays returns all of the matching quote’s service days, including days outside the filter range.
updated_at filters the quote row’s timestamp. Child pricing edits can change totalPriceCents without updating that timestamp, so this filter is not a complete financial change feed.Expanding related objects
Use the Get Quote expansion paths, prefixed withdata. on every path:
curl --get 'https://app.flashquotes.com/api/quotes' \
--header "x-api-key: $FLASHQUOTES_API_KEY" \
--data-urlencode 'expand[]=data.booking.invoices' \
--data-urlencode 'expand[]=data.booking.events.resources'
null; empty collections return []. Expansions do not change quote totals and do not expose line items or unit prices.
The limit is 20 distinct paths and four segments per path, excluding the data. prefix. Missing prefixes and unsupported paths return 400. Request only what you need: expanded collections are not independently paginated, and these routes do not currently enforce per-key rate or concurrency limits.
Errors
| Status | Meaning |
|---|---|
400 | Invalid page size, date-range value, expansion path, or expansion limit |
401 | Authentication denied: check the API key, allowed IPs, and plan access |
500 | Internal server error |
503 | Authentication service temporarily unavailable |
limit=101 returns:
{
"error": {
"type": "invalid_request_error",
"code": "invalid_parameter",
"message": "limit must be an integer between 1 and 100",
"param": "limit"
}
}
Authorizations
API key for authentication
Query Parameters
Page size, from 1 to 100. Defaults to 10.
1 <= x <= 100ID of the last quote in the previous page. The cursor must be accessible and match all supplied filters; otherwise the response is an empty page with hasMore false. Keep filters unchanged between pages.
Filter by exact contact ID.
Filter by exact location ID.
Filter by exact booking ID.
Filter by exact event type ID.
Filter quote creation time: strictly after this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote creation time: at or after this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote creation time: strictly before this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote creation time: at or before this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote row update time (not a complete financial change feed): strictly after this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote row update time (not a complete financial change feed): at or after this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote row update time (not a complete financial change feed): strictly before this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter quote row update time (not a complete financial change feed): at or before this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter service-day start time; at least one day must satisfy all supplied bounds: strictly after this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter service-day start time; at least one day must satisfy all supplied bounds: at or after this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter service-day start time; at least one day must satisfy all supplied bounds: strictly before this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Filter service-day start time; at least one day must satisfy all supplied bounds: at or before this ISO 8601 datetime. Include a timezone (Z or ±HH:MM); bare dates are rejected.
Every path must start with data. Repeat expand[] or use comma-separated paths. A nested path includes its parents; unrequested siblings stay absent. Maximum 20 distinct paths per request and four segments, excluding data. Unknown or malformed paths return 400. Allowed paths: data.lead, data.location, data.eventType, data.services, data.addons, data.discounts, data.taxRate, data.paymentTerms, data.serviceCharges, data.serviceDays, data.contract, data.booking, data.booking.lead, data.booking.eventType, data.booking.invoices, data.booking.events, data.booking.events.location, data.booking.events.services, data.booking.events.staff, data.booking.events.addons, data.booking.events.resources, data.booking.events.booking, data.booking.events.booking.lead, data.booking.events.booking.eventType, data.booking.events.booking.invoices, data.booking.events.booking.events.
Response
Paginated quotes. No matches or an unusable cursor returns data: [] and hasMore: false.
Was this page helpful?

