API reference
GETList published quotes
GET /v1/quotes: Drafts are never exposed.
GET
https://api.light-ai.app/v1/quotesDrafts are never exposed. With status or is_current a page may be short (or empty) while has_more is true: keep following next_cursor. With quotes:asset_links, assets.*.url are durable image links (as on GET /v1/quotes/{id}).
| Scope | quotes:read |
|---|---|
| Credential | API key: Authorization: Bearer lai_live_… (or lai_test_…). Partner keys add Light-AI-Organization. |
| Test mode | Works with test keys against simulated test objects. |
Query parameters#
Page size, 1–100 (default 25). 1–100.
next_cursor from the previous page. At most 400 characters.
updated_asc pages objects in last-change order (for an initial or incremental sync with updated_since). A write that commits late can carry an earlier updated_at, so re-poll from your high-water mark minus 5 minutes and de-duplicate by id + updated_at; GET /v1/events?sort=sync_asc is the gapless change feed. One of: created_desc, updated_asc.Id prefix
prj_.One of:
sent, approved, declined, expired, superseded, disabled.One of:
true, false.Only quotes created after this time.
Only quotes created before this time.
Only objects updated after this time (alias: updated_after). Overlap polls by a few minutes: see sort.
Alias of updated_since.
<system>:<id> in your own namespace, e.g. jobber:Z2lk123. At most 400 characters.At most 120 characters.
Headers#
Partner keys: the connected organization to act for (
org_…). Organization keys may omit it. Id prefix org_.Pin a dated API version (defaults to the key's version). One of:
2026-11-01.Response 200#
A page of quotes.
Always
list.Id prefix
qt_.Always
quote.false for objects created with a test key.
One of:
sent, approved, declined, expired, superseded, disabled.Id prefix
qt_.Id prefix
qt_.The ids integrations wrote back on this quote (PUT /v1/quotes/{id}/external_refs/{system}).
self: written by your integration (editable); others are read-only. One of: self, organization, partner.Webhook payloads only: present (true) when the quote was too large for one delivery (256 KB). line_items is then empty; read the full quote with GET /v1/quotes/{id}. Never present on API responses. Always
true.Id prefix
prj_.One of:
request, quote_drafted, quote_sent, approved, completed, closed_lost.Id prefix
lead_.One of:
website_widget, api, google_ads_lead_form, google_lsa, meta_lead_ad, highlevel, hubspot, jobber, service_autopilot, realgreen, sweepandgo, deeplawn, zapier, n8n, make, crm_import, other, manual.Contact details need clients:read; otherwise only the id.
Id prefix
cli_.E.164, or null when the stored number could not be normalized (see phone_raw).
The number as stored in Light AI.
Id prefix
prop_.Id prefix
rev_.RFC 3339 timestamp (UTC, milliseconds).
One of:
light-ai, external, view-only.Always
USD.The line item id in the published document.
Stable catalog code (template line item); null for custom lines.
The measured quantity (decimal for feet and square feet, whole for counted items); null for an unmeasured line.
One of:
ft, sqft, each, set.Set when quantity × unit_price equals amount to the cent; otherwise null (e.g. mini lights priced by the set) and amount is the line total.
One of:
c9, mini.One of:
percentage, fixed.The discount line's name on the customer quote, e.g. "Black Friday offer" (a website request's offer); absent for a plain discount.
The homeowner's quote link. Only with the opt-in quotes:share_link scope; every read is audited.
Present only when a PDF is bound to this exact revision.
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
One of:
light_ai, legacy_portal, external.RFC 3339 timestamp (UTC, milliseconds).
Always
external.RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
RFC 3339 timestamp (UTC, milliseconds).
Always
true.Pass as
cursor to fetch the next page.Errors#
| Status | Meaning |
|---|---|
400 | Bad request. bad_request, test_mode_mismatch, test_mode_unsupported, unsupported_api_version |
401 | Missing or invalid credential. authentication_required, invalid_api_key, api_key_revoked, api_key_expired, api_key_suspended |
403 | Not allowed. insufficient_scope, plan_upgrade_required, organization_paused, organization_off_season, api_disabled, api_access_not_enabled, ip_not_allowed, forbidden |
404 | Not found (also for objects of other organizations and for organizations without an active grant). |
422 | Validation failed. idempotency_key_reused |
429 | Rate limited or daily cap reached. See Retry-After and the RateLimit headers. rate_limited, daily_cap_reached |
500 | Unexpected server error. Safe to retry with exponential backoff; quote the Request-Id to support. internal_error |
503 | Temporarily unavailable. Retry with exponential backoff. service_unavailable |