Skip to content

Find products by photo

Send a photo and a category to POST /search. Flume returns products that look like the photo, in two lists: strong matches, then other similar options.

  • A partner key and a user access token.
  • A photo: JPEG, PNG or WebP, up to 6,000,000 bytes.

Build your filter menus from this call, not from a hardcoded list. New values then appear without a release.

curl -X GET "https://sandbox-api.tryflume.ai/partner/v1/filters" \
-H "X-Flume-Partner-Key: $FLUME_PARTNER_KEY"
Response: 200
{
"tile": {
"material": [
{
"value": "PORCELAIN",
"label": "Porcelain"
},
{
"value": "CERAMIC",
"label": "Ceramic"
}
],
"finish": [
{
"value": "MATTE",
"label": "Matte",
"also_matches": [
"NATURAL",
"HONED",
"ANTI_SLIP"
]
},
{
"value": "GLOSSY_POLISHED",
"label": "Glossy / Polished",
"also_matches": [
"LAPPATO_SEMI_POLISHED"
]
}
],
"application_area": [
{
"value": "INTERIOR_DRY_FLOOR",
"label": "Interior Dry Floor",
"group": "FLOORS"
},
{
"value": "SHOWER_WALL",
"label": "Shower Wall",
"group": "WALLS"
}
]
},
"flooring": {
"wear_layer_mil": [
{
"value": 20,
"label": "20 mil"
},
{
"value": 28,
"label": "28 mil and up"
}
],
"installation_method": [
{
"value": "CLICK_LOCK",
"label": "Click Lock"
}
],
"finish": [
{
"value": "MATTE",
"label": "Matte"
}
],
"rigid_core": [
{
"value": "SPC",
"label": "SPC"
}
]
}
}
  • value is what you send. label is what you show.
  • also_matches lists the similar tile finishes a finish also finds.

Send multipart/form-data with two parts: image and payload.

curl -X POST "https://sandbox-api.tryflume.ai/partner/v1/search" \
-H "X-Flume-Partner-Key: $FLUME_PARTNER_KEY" \
-H "X-Flume-User-Token: $FLUME_USER_TOKEN" \
-F "image=@photo.jpg" \
-F 'payload={"category":"TILE","tile_filters":{"material":["PORCELAIN"],"finish":["MATTE"],"size":{"width":24,"length":48,"unit":"in"}},"project":{"external_ref":"proj_7781","name":"Harbor Lofts - L2","destination_zip":"22102"}}'
Response: 200
{
"search_session_uuid": "5f0c1d2e-8a7b-4c3d-9e1f-2a3b4c5d6e7f",
"total": 31,
"strong_match_count": 9,
"other_similar_count": 22,
"page": 1,
"page_size": 24,
"has_more": true,
"strong_matches": [
{
"sku_uuid": "7f3c2a91-4b0e-4c8d-9a21-1f6b2d5e7c30",
"name": "Porcelain 24×48″ Matte",
"image_url": "https://sandbox-api.tryflume.ai/partner/v1/images/example-image-main",
"more_image_urls": [
"https://sandbox-api.tryflume.ai/partner/v1/images/example-image-2",
"https://sandbox-api.tryflume.ai/partner/v1/images/example-image-3"
],
"size": "24×48 in",
"thickness": "9 mm",
"material": "Porcelain",
"as_low_as_per_sqft": "6.40",
"price_on_request": false,
"lead_times": [
{
"source": "US_WAREHOUSE",
"lead_time_min_days": 14,
"lead_time_max_days": 30
},
{
"source": "OVERSEAS_DIRECT",
"lead_time_min_days": 90,
"lead_time_max_days": 120
}
],
"suitable_application_areas": [
{
"code": "INTERIOR_DRY_FLOOR",
"label": "Interior Dry Floor"
},
{
"code": "INTERIOR_WALL_BACKSPLASH",
"label": "Interior Wall / Backsplash"
}
],
"saving_vs_spec": null
}
],
"other_similar_options": [
{
"sku_uuid": "0b6f9d34-2e71-4c5a-8f10-3d9a7e2b6c41",
"name": "Porcelain 24×48″ Natural",
"image_url": "https://sandbox-api.tryflume.ai/partner/v1/images/example-image-main",
"more_image_urls": [
"https://sandbox-api.tryflume.ai/partner/v1/images/example-image-2",
"https://sandbox-api.tryflume.ai/partner/v1/images/example-image-3"
],
"size": "24×48 in",
"thickness": "9 mm",
"material": "Porcelain",
"as_low_as_per_sqft": "5.90",
"price_on_request": false,
"lead_times": [
{
"source": "US_WAREHOUSE",
"lead_time_min_days": 14,
"lead_time_max_days": 30
},
{
"source": "OVERSEAS_DIRECT",
"lead_time_min_days": 90,
"lead_time_max_days": 120
}
],
"suitable_application_areas": [
{
"code": "INTERIOR_DRY_FLOOR",
"label": "Interior Dry Floor"
},
{
"code": "INTERIOR_WALL_BACKSPLASH",
"label": "Interior Wall / Backsplash"
}
],
"saving_vs_spec": null
}
],
"project": {
"external_ref": "proj_7781",
"status": "FILED",
"reason": null,
"missing": [],
"message": null
}
}
payload fieldRequiredNotes
categoryYesTILE or FLOORING
tile_filtersNoOnly with TILE
flooring_filtersNoOnly with FLOORING
projectNoFiles the search under a project in the user's Flume account
page, page_sizeNoDefaults 1 and 24
crop_boxNoSearch on part of the photo: x, y, w, h as fractions from 0 to 1
spec_unit_priceNoAdds saving_vs_spec to each result. USD per SF only

Filter rules:

  • A list filter matches any of its values.
  • Different filters must all hold.
  • A filter you leave out is no constraint.
  • The photo ranks the products that pass the filters.
  • strong_matches: products that meet every filter and look closest to the photo. Best first.
  • other_similar_options: close to the photo, with some filters relaxed. They start on the page where the strong matches end.
  • total is at most 50.
  • as_low_as_per_sqft is the lowest delivered price per square foot, before tax. An instant quote can be higher.
  • price_on_request: true means there is no instant quote. Hand off to sales.
  • Image links expire after about 24 hours, and earlier in the sandbox. Do not store them.

Keep search_session_uuid. Quotes, saves and deep links for these products need it.

Send the same photo and payload with page: 2.

curl -X GET "https://sandbox-api.tryflume.ai/partner/v1/products/7f3c2a91-4b0e-4c8d-9a21-1f6b2d5e7c30" \
-H "X-Flume-Partner-Key: $FLUME_PARTNER_KEY" \
-H "X-Flume-User-Token: $FLUME_USER_TOKEN"
Response: 200
{
"sku_uuid": "7f3c2a91-4b0e-4c8d-9a21-1f6b2d5e7c30",
"category": "TILE",
"name": "Porcelain 24×48″ Matte",
"as_low_as_per_sqft": "6.40",
"price_on_request": false,
"image_urls": [
"https://sandbox-api.tryflume.ai/partner/v1/images/example-image-main",
"https://sandbox-api.tryflume.ai/partner/v1/images/example-image-2"
],
"at_a_glance": [
{
"label": "Size",
"value": "24×48″"
},
{
"label": "Thickness",
"value": "9 mm"
},
{
"label": "Finish",
"value": "Matte"
}
],
"specification": [
{
"group": "Slip resistance",
"rows": [
{
"label": "DCOF",
"value": "> 0.42",
"test_method": "ANSI A326.3"
}
]
}
],
"shipping_options": [
{
"source": "US_WAREHOUSE",
"lead_time_min_days": 14,
"lead_time_max_days": 30,
"ships_from_country": "US",
"minimum_order_sqft": 1000
},
{
"source": "OVERSEAS_DIRECT",
"lead_time_min_days": 90,
"lead_time_max_days": 120,
"ships_from_country": "ES",
"minimum_order_sqft": 5000
}
],
"suitable_application_areas": [
{
"code": "INTERIOR_DRY_FLOOR",
"label": "Interior Dry Floor"
}
]
}
  • specification leaves out any spec the product does not state.
  • shipping_options lists each way the product ships, its minimum order and its delivery window. The price comes from an instant quote.

Send project.external_ref and project.name. Flume saves the project in the user's Flume account. project.status in the response says what happened.

statusMeaning
FILEDThis search created the project
EXISTINGAn earlier search created it
NOT_FILEDNot saved. reason is MISSING_FIELDS or PROJECT_LIMIT_REACHED

The search runs either way.

You getDo this
400 IMAGE_REQUIREDAdd the image part
413 IMAGE_TOO_LARGESend a photo under 6,000,000 bytes
422 IMAGE_UNSUPPORTEDSend a JPEG, PNG or WebP of at most 50 megapixels
422 VALIDATION_FAILEDFix the field named in error.field
429 RATE_LIMITEDWait Retry-After seconds
429 DAILY_LIMIT_REACHEDThis user's own daily limit is used up (only when Flume set one). Tell the user when it resets: details.reset_at. Other users are not affected
503 SEARCH_UNAVAILABLERetry with backoff. The search is not counted