Skip to content

API overview

The Flume Partner API is a JSON API over HTTPS. Your backend calls it with a partner key. This page covers what every endpoint shares.

An API integration makes these calls, in this order. The API quickstart runs each one.

  1. Verify a user: send the code. POST /users/trigger-verification. Your first call for a new user. Flume emails them a 6-digit code, and you show a code box.
  2. Verify a user: confirm the code. POST /users/confirm-verification. The right code opens the user's Flume account and returns their access token. Keep it against the user. It does not expire.
  3. Search by photo. POST /search. A photo and the user's filters give two lists, strong matches and other similar options, plus a search_session_uuid.
  4. Product detail. GET /products/{sku_uuid}. Photos, price, specification and shipping.
  5. Instant quote. POST /request-instant-quote. The delivered price for a quantity and a ZIP code. A quote that is still pricing is read with GET /quotes/{quote_uuid}.
  6. Open Flume, signed in. POST /deep-links. A one-time link into the user's Flume account, where every search and quote you made for them is waiting.

Supporting calls: GET /filters, DELETE /users/{external_ref}/token, GET /keys, POST /keys, DELETE /keys/{key_id}.

Two headers. Every call carries your partner key as X-Flume-Partner-Key. Steps 3 to 6 also carry the user access token as X-Flume-User-Token. Neither works alone. Start with a sandbox key, then a user access token once you have one. Prices are US dollars, sent as text with 2 decimals, for example "6.40".

https://sandbox-api.tryflume.ai/partner/v1
EnvironmentBase URL
Sandboxhttps://sandbox-api.tryflume.ai/partner/v1
Livehttps://ssapi.tryflume.ai/partner/v1

Live is in early access and not yet open to new partners. See Environments.

AreaEndpoints
UsersPOST /users/trigger-verification, POST /users/confirm-verification, DELETE /users/{external_ref}/token
SearchGET /filters, POST /search
ProductsGET /products/{sku_uuid}
QuotesPOST /request-instant-quote, GET /quotes/{quote_uuid}
Deep linksPOST /deep-links
KeysGET /keys, POST /keys, DELETE /keys/{key_id}
HeaderWhenNotes
X-Flume-Partner-KeyEvery callYour partner key
X-Flume-User-TokenCalls made for a userThe user's access token
Idempotency-KeySome POST calls1 to 255 characters. See Idempotency
X-Flume-Client-IPPOST /users/trigger-verification, optionalThe user's own IPv4 or IPv6 address. Adds a limit per IP address
Content-TypeCalls with a bodyapplication/json, or multipart/form-data for POST /search

See Authentication and keys.

HeaderWhenNotes
X-Request-IdEvery responseQuote it to Flume support
Retry-AfterMost 409 IDEMPOTENCY_IN_PROGRESS and 429 responsesSeconds to wait
Idempotent-ReplayA replayed answertrue
ThingFormatExample
BodiesJSON, UTF-8
IdsUUID strings7f3c2a91-4b0e-4c8d-9a21-1f6b2d5e7c30
MoneyDecimal string, 2 places, USD"6.40"
TimestampsUTC, ISO 8601, with Z2026-10-16T09:14:22Z
DatesISO 86012027-03-01
QuantitiesSquare feet6000
CountriesTwo lettersES
ZIP codes5 digits22102

Every reference page shows the call in curl, Python and Node.js.

  • Samples read FLUME_PARTNER_KEY and, for calls made for a user, FLUME_USER_TOKEN from the environment.
  • Ids in a sample are examples. Use ids from your own responses.
  • The Python samples need requests.
  • The Node.js samples use top-level await. Save them as .mjs, with Node.js 20 or later.

Request bodies are strict. A field the API does not know is a 422 VALIDATION_FAILED that names it.

One exception: item, and its labels and rooms, accept any extra fields. Flume stores them as sent.

Every error is JSON in one envelope. Branch on error.code.

{
"error": {
"code": "VALIDATION_FAILED",
"message": "destination_zip: String should match pattern '^\\d{5}$'",
"field": "destination_zip",
"request_id": "e19b8889-a63b-4000-9dbe-ffd5b9157bd5"
}
}

Every code, with its status and fix: API error codes.

Only POST /search pages.

  • Send page and page_size in the payload.
  • Read has_more and total in the response.
  • At most 50 results per search and 24 per page.
  • There are no cursors.
  • Each page is a new search. See Idempotency.

GET /keys returns every key, unpaged.

  • The version is in the path: /partner/v1.
  • The OpenAPI document's info.version is 2.0.0. It counts revisions of the v1 contract.
  • Flume has no published deprecation policy yet. Changes are listed in the changelog.
  • Write your client to ignore response fields it does not know.
  • /openapi.json is the OpenAPI 3.1 document this reference is generated from.
  • It lists the server-to-server calls. Calls only the Flume iframe makes are left out.
  • In a request, a field marked Optional can be left out.
  • In a response, every field is always present. A field with no value is null. The reference shows this as "or null" after the type.

Webhooks, SDKs, rate limit headers and list endpoints do not exist today. The full list is on the overview.

  • Or import /openapi.json into an HTTP client such as Postman or Bruno. There is no ready-made collection.