- Send
multipart/form-datawith two parts:imageandpayload. image: a JPEG, PNG or WebP, up to 6 MB.payload: JSON.categoryis required.- The response has two lists:
strong_matches, thenother_similar_options. - Keep
search_session_uuid. Quotes, saves and deep links for these products need it. - For the next page, send the same photo and payload with
page: 2. Each call counts as a new search and returns a newsearch_session_uuid. - Send
spec_unit_priceto getsaving_vs_specon each result. - Daily limit: 1,000 searches per partner.
- Docs
- API reference
- Search
- Search by photo
Search by photo
Code samples show live values. Live is in early access and not yet open to new partners: see Environments.
https://sandbox-api.tryflume.ai/partner/v1/searchReturns products that look like a photo and match the filters you send.
Guide: Find products by photo
Request
Headers
| Header | Required | Description |
|---|---|---|
X-Flume-Partner-Key | Yes | Your partner key. See Authentication and keys. |
X-Flume-User-Token | Yes | The access token of the user you call for. See Users and verification. |
Body
Send multipart/form-data.
The
payloadpart of a search, sent beside the photo.ShowHide the 8 fields of
payloadThe project to file the search under.
ShowHide the 9 fields of
projectYour id for the project.
- Max 128 characters
The project's name.
- Max 255 characters
The kind of project.
One ofRESIDENTIALMULTIFAMILYCOMMERCIALHOSPITALITYHEALTHCAREEDUCATIONRETAILOTHER
The project's city.
- Max 128 characters
The US state, as 2 capital letters.
- 2 capital letters
The ZIP code the material is delivered to.
- 5 digits
The project's total area, in square feet.
- 1 to 10,000,000
The number of homes, units or rooms.
- 1 to 1,000,000
When installation is planned.
What to search for:
TILEorFLOORING(vinyl flooring). Send the filters for that category only.Filters for a
TILEsearch.ShowHide the 8 fields of
tile_filtersMatch any of these materials.
Any ofPORCELAINCERAMIC
Match any of these finishes. Similar finishes are included:
MATTEalso findsNATURAL,HONEDandANTI_SLIP.GET /filterslists what each finish also finds.Any ofMATTEGLOSSY_POLISHEDSATINHONEDLAPPATO_SEMI_POLISHEDTEXTUREDNATURALBUSH_HAMMEREDANTI_SLIPCRACKLE
Leave these finishes out.
Any ofMATTEGLOSSY_POLISHEDSATINHONEDLAPPATO_SEMI_POLISHEDTEXTUREDNATURALBUSH_HAMMEREDANTI_SLIPCRACKLE
Where the tile is used. A product must suit every area listed.
Any ofINTERIOR_WALL_BACKSPLASHSHOWER_WALLSTEAM_SHOWER_WET_ROOM_WALLEXTERIOR_WALL_FACADEINTERIOR_DRY_FLOORINTERIOR_WET_FLOORSHOWER_FLOOREXTERIOR_FLOOR_PATIORAMP_STAIRPOOL_DECK_WET_SURROUNDPOOL_SUBMERGEDCOUNTERTOP
The tile size to match.
The minimum thickness, in millimetres. Products up to 2 mm thinner still match.
- More than 0
- Max 500
true: glazed only.false: unglazed only.falseleaves mosaics out.truereturns mosaics only.- Default
false
- Default
Filters for a
FLOORINGsearch.ShowHide the 9 fields of
flooring_filtersThe plank size to match.
The minimum thickness, in millimetres. Products up to 20% thinner still match.
- More than 0
- Max 50
The maximum thickness, in millimetres.
- More than 0
- Max 50
Match any of these wear layers, in mil.
28means 28 mil and thicker.Any of812202228
Match any of these installation methods.
Any ofCLICK_LOCKGLUE_DOWNLOOSE_LAY
Match any of these finishes.
Any ofMATTELOW_GLOSS
true: embossed in register (EIR) only.false: not EIR.Match any of these core types.
Any ofSPCWPC
true: with an attached pad.false: without one.
The page to return. A search finds at most 50 products.
- 1 to 50
- Default
1
Products per page. Use the same value for every page of one search.
- 1 to 24
- Default
24
The part of the photo to search on.
The unit price of the product the user has now. When sent, each result carries
saving_vs_spec. Only USD perSFgives a saving.
Returns
200 with these fields. Every field is always present. A field with no value is null.
search_session_uuidstring (UUID)The search's id. Send it when you request a quote, save an item or create a deep link for a product on this page. Every call returns a new one, page 2 included.
totalintegerProducts across all pages, at most 50.
strong_match_countintegerHow many of
totalare strong matches.other_similar_countintegerHow many of
totalare other similar options.pageintegerThe page returned.
page_sizeintegerProducts per page.
has_morebooleantruewhen a later page has more products.strong_matchesarray of objectsProducts on this page that meet every filter and look closest to the photo, best first.
ShowHide the 12 fields of
strong_matchessku_uuidstring (UUID)The product's id.
namestringThe product's name, written by Flume from its specification.
image_urlstring or nullThe main product photo.
more_image_urlsarray of stringsOther product photos.
sizestring or nullThe size, as text. Tile only.
thicknessstring or nullThe thickness, as text. Tile only.
materialstring or nullThe material. Tile only.
as_low_as_per_sqftstring or nullThe lowest delivered price per square foot, before tax. An instant quote for a real quantity and ZIP code can be higher.
nullwhenprice_on_requestistrue.price_on_requestbooleantrue: Flume's sales team prices this product, and there is no instant quote.lead_timesarray of objectsThe ways the product ships, with delivery times.
ShowHide the 3 fields of
lead_timessourceenumUS_WAREHOUSEorOVERSEAS_DIRECT.lead_time_min_daysintegerThe shortest delivery time, in days.
lead_time_max_daysintegerThe longest delivery time, in days.
suitable_application_areasarray of objectsEvery area where the product can be used: floors first, then walls, then the rest. Empty for vinyl flooring, or when Flume knows none.
saving_vs_specobject or nullThe saving against
spec_unit_price, when you sent one.nullwhen the saving is under 5%, or when the product costs the same or more.
other_similar_optionsarray of objectsProducts on this page that look close to the photo, with some filters relaxed. They come after every strong match.
ShowHide the 12 fields of
other_similar_optionssku_uuidstring (UUID)The product's id.
namestringThe product's name, written by Flume from its specification.
image_urlstring or nullThe main product photo.
more_image_urlsarray of stringsOther product photos.
sizestring or nullThe size, as text. Tile only.
thicknessstring or nullThe thickness, as text. Tile only.
materialstring or nullThe material. Tile only.
as_low_as_per_sqftstring or nullThe lowest delivered price per square foot, before tax. An instant quote for a real quantity and ZIP code can be higher.
nullwhenprice_on_requestistrue.price_on_requestbooleantrue: Flume's sales team prices this product, and there is no instant quote.lead_timesarray of objectsThe ways the product ships, with delivery times.
ShowHide the 3 fields of
lead_timessourceenumUS_WAREHOUSEorOVERSEAS_DIRECT.lead_time_min_daysintegerThe shortest delivery time, in days.
lead_time_max_daysintegerThe longest delivery time, in days.
suitable_application_areasarray of objectsEvery area where the product can be used: floors first, then walls, then the rest. Empty for vinyl flooring, or when Flume knows none.
saving_vs_specobject or nullThe saving against
spec_unit_price, when you sent one.nullwhen the saving is under 5%, or when the product costs the same or more.
projectobject or nullWhat happened to the
projectyou sent.nullwhen you sent none.ShowHide the 5 fields of
projectexternal_refstring or nullYour id for the project.
statusenumFILED: this search saved the project in Flume.EXISTING: an earlier search saved it.NOT_FILED: not saved, andreasonsays why.reasonenum or nullWith
NOT_FILED:MISSING_FIELDS(seemissing) orPROJECT_LIMIT_REACHED. Otherwisenull.missingarray of stringsWith
MISSING_FIELDS: the fields to send next time.messagestring or nullA sentence you can show the user.
Errors
Every error uses one envelope. Branch on error.code.
| Status | Code | Meaning |
|---|---|---|
| 400 | IMAGE_REQUIRED | The request has no image part, or the part is empty. |
| 401 | EMBED_TOKEN_INVALID | You sent an Authorization header and no X-Flume-Partner-Key. Flume read the call as one from its own iframe. |
| 401 | PARTNER_KEY_INVALID | The partner key is missing, unknown, revoked, expired, or from the other environment. On live, also a platform Flume has not enabled yet. |
| 401 | USER_TOKEN_INVALID | The user access token is unknown, revoked, another partner's, or replaced by a later verification. A verification in the iframe replaces it too. |
| 403 | USER_ACCOUNT_CLOSED | The user's email belongs to a Flume account that Flume has closed. |
| 403 | USER_NOT_CONNECTED | No X-Flume-User-Token header was sent. |
| 413 | IMAGE_TOO_LARGE | The photo is over 6,000,000 bytes. |
| 422 | IMAGE_UNSUPPORTED | The file is not a JPEG, PNG or WebP, or it is over 50 megapixels. Flume reads the bytes, not the file name. |
| 422 | VALIDATION_FAILED | A field is missing, unknown or has an unusable value. field names it as a dotted path. Some refusals carry the detail in details and leave field empty. |
| 429 | DAILY_LIMIT_REACHED | This user's own daily limit of searches or instant quotes is used up. Flume sets this limit per partner account, and it is off by default. details holds kind, limit, reset_at and retry_after_s. |
| 429 | RATE_LIMITED | Today's limit for this call is used up. Retry-After is the number of seconds until 00:00 UTC. |
| 500 | INTERNAL | Something failed on Flume's side. |
| 503 | SEARCH_UNAVAILABLE | Search is briefly unavailable. The call is not counted against your limit. |