Search the catalog
- Production and sandbox. The token decides the environment.
https://api.beautyrouter.com/v1/catalog/search
using System.Net.Http.Headers;var client = new HttpClient();var request = new HttpRequestMessage{ Method = HttpMethod.Get, RequestUri = new Uri("https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50"), Headers = { { "Authorization", "Bearer <token>" }, },};using (var response = await client.SendAsync(request)){ response.EnsureSuccessStatusCode(); var body = await response.Content.ReadAsStringAsync(); Console.WriteLine(body);}package main
import ( "fmt" "net/http" "io")
func main() {
url := "https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close() body, _ := io.ReadAll(res.Body)
fmt.Println(res) fmt.Println(string(body))
}OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder() .url("https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50") .get() .addHeader("Authorization", "Bearer <token>") .build();
Response response = client.newCall(request).execute();import axios from 'axios';
const options = { method: 'GET', url: 'https://api.beautyrouter.com/v1/catalog/search', params: {q: 'bond repair shampoo', limit: '50'}, headers: {Authorization: 'Bearer <token>'}};
try { const { data } = await axios.request(options); console.log(data);} catch (error) { console.error(error);}const url = 'https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50';const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
try { const response = await fetch(url, options); const data = await response.json(); console.log(data);} catch (error) { console.error(error);}val client = OkHttpClient()
val request = Request.Builder() .url("https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50") .get() .addHeader("Authorization", "Bearer <token>") .build()
val response = client.newCall(request).execute()<?php
$client = new \GuzzleHttp\Client();
$response = $client->request('GET', 'https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50', [ 'headers' => [ 'Authorization' => 'Bearer <token>', ],]);
echo $response->getBody();import requests
url = "https://api.beautyrouter.com/v1/catalog/search"
querystring = {"q":"bond repair shampoo","limit":"50"}
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers, params=querystring)
print(response.json())require 'uri'require 'net/http'
url = URI("https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50")
http = Net::HTTP.new(url.host, url.port)http.use_ssl = true
request = Net::HTTP::Get.new(url)request["Authorization"] = 'Bearer <token>'
response = http.request(request)puts response.read_bodycurl --request GET \ --url 'https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50' \ --header 'Authorization: Bearer <token>'import Foundation
let headers = ["Authorization": "Bearer <token>"]
let request = NSMutableURLRequest(url: NSURL(string: "https://api.beautyrouter.com/v1/catalog/search?q=bond%20repair%20shampoo&limit=50")! as URL, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 10.0)request.httpMethod = "GET"request.allHTTPHeaderFields = headers
let session = URLSession.sharedlet dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in if (error != nil) { print(error as Any) } else { let httpResponse = response as? HTTPURLResponse print(httpResponse) }})
dataTask.resume()Returns the catalog products that match q. Use it to search the catalog in your own screens, with no index of
your own. Each item has the same fields as a line in the catalog files, so it has the MSRP and no wholesale
prices.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Query Parameters
Section titled “Query Parameters”The search text.
Example
bond repair shampooHow many items to return.
The ID of the last item on the previous page. Leave it out for the first page.
Responses
Section titled “Responses”A page of catalog products.
object
One line of a catalog file, or one search result. Products in different sizes are separate products that share
a groupId. A removed product in the delta file has removed: true.
object
The product group, or null. Sizes of the same product share it.
Brand, what the product is, and size.
The name that tells products in the same group apart, such as the size.
object
The category names from the top category down.
professional for use in the salon, retail for resale to clients.
The URL of the product image, or null.
The URL of a 48x48 thumbnail, or null.
The URL of a 64x64 thumbnail, or null.
The products in a set. It is empty for a product that is not a set.
object
How many of this product the set holds.
The position of the member in the set.
The member’s own brand.
The manufacturer’s suggested retail price in US dollars, or null.
Always usd.
Whether the marketplace sells the product, even if it is out of stock now. The catalog has more products than the marketplace sells.
Only in the delta file, on a removed product.
true when another page follows.
Examples
{ "data": [ { "id": "prod-4Fz9QbX2kL", "groupId": "group-6Tn1vBz8Mc", "brand": { "id": "brand-5Lm2xNc7Qp", "name": "Amberlin", "logo": "https://images.beautyrouter.com/brand-5Lm2xNc7Qp/logo.png" }, "name": "Amberlin Bond Repair Shampoo 33.8 fl oz", "nameInGroup": "33.8 fl oz", "category": { "id": "cat-0Kj5hGf4Ds", "path": [ "Hair care", "Shampoo" ] }, "type": "professional", "barcodes": [ "850012345678" ], "image": "https://images.beautyrouter.com/prod-4Fz9QbX2kL/1.jpg", "image48x48": "https://images.beautyrouter.com/prod-4Fz9QbX2kL/1-48x48.jpg", "image64x64": "https://images.beautyrouter.com/prod-4Fz9QbX2kL/1-64x64.jpg", "description": "A sulfate-free shampoo that cleanses gently and strengthens chemically treated hair.", "setMembers": [], "msrp": 48, "currency": "usd", "availableInMarketplace": true, "updatedAt": "2026-10-28T06:12:44Z" }, { "id": "prod-9Cv5bNm3Ws", "groupId": "group-6Tn1vBz8Mc", "brand": { "id": "brand-5Lm2xNc7Qp", "name": "Amberlin", "logo": "https://images.beautyrouter.com/brand-5Lm2xNc7Qp/logo.png" }, "name": "Amberlin Bond Repair Shampoo 10.1 fl oz", "nameInGroup": "10.1 fl oz", "category": { "id": "cat-0Kj5hGf4Ds", "path": [ "Hair care", "Shampoo" ] }, "type": "retail", "barcodes": [ "850012345685" ], "image": "https://images.beautyrouter.com/prod-9Cv5bNm3Ws/1.jpg", "image48x48": "https://images.beautyrouter.com/prod-9Cv5bNm3Ws/1-48x48.jpg", "image64x64": "https://images.beautyrouter.com/prod-9Cv5bNm3Ws/1-64x64.jpg", "description": "A sulfate-free shampoo that cleanses gently and strengthens chemically treated hair.", "setMembers": [], "msrp": 22, "currency": "usd", "availableInMarketplace": true, "updatedAt": "2026-10-28T06:12:44Z" } ], "hasMore": false}validation_failed: a field is missing or has a wrong value. field names it.
The body of every error response.
object
object
A stable error code.
A sentence for developers. It can change, so do not match on it.
The request field that caused the error. Only some errors have it.
Only on verification_data_missing and app_setup_incomplete. What still needs to be set.
Only on order_total_changed and order_has_problems. A fresh quote.
object
One group per supplier. Each group becomes one order.
object
object
An amount in dollars, with up to two decimal places.
The discount on the whole line, in US dollars.
An amount in dollars, with up to two decimal places.
The total of the lines, in US dollars.
The discount on the whole order, in US dollars.
object
The shipping charge in US dollars, or null when it cannot be worked out.
How much more to order for free shipping, or null when it does not apply.
The sales tax in US dollars, or null when it cannot be worked out.
object
The exemption certificate used, or null.
Why no certificate applies, or null when one does.
The amount the salon pays for this group in US dollars, or null when it cannot be worked out. Send it back as
expectedTotal. A group with problems has no expectedTotal.
now: Beauty Router charges the card when the order is created. after_verification: the company is
prequalified, so the charge waits until its verification ends.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The lines no supplier can take.
object
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
What stops every group.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The sum of all the groups in US dollars, or null when a group’s total is.
Always usd.
Examples
{ "error": { "code": "validation_failed", "message": "ein must have 9 digits.", "field": "ein" }}invalid_app_token: the Authorization header has no valid app token, or the token expired or was revoked.
The body of every error response.
object
object
A stable error code.
A sentence for developers. It can change, so do not match on it.
The request field that caused the error. Only some errors have it.
Only on verification_data_missing and app_setup_incomplete. What still needs to be set.
Only on order_total_changed and order_has_problems. A fresh quote.
object
One group per supplier. Each group becomes one order.
object
object
An amount in dollars, with up to two decimal places.
The discount on the whole line, in US dollars.
An amount in dollars, with up to two decimal places.
The total of the lines, in US dollars.
The discount on the whole order, in US dollars.
object
The shipping charge in US dollars, or null when it cannot be worked out.
How much more to order for free shipping, or null when it does not apply.
The sales tax in US dollars, or null when it cannot be worked out.
object
The exemption certificate used, or null.
Why no certificate applies, or null when one does.
The amount the salon pays for this group in US dollars, or null when it cannot be worked out. Send it back as
expectedTotal. A group with problems has no expectedTotal.
now: Beauty Router charges the card when the order is created. after_verification: the company is
prequalified, so the charge waits until its verification ends.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The lines no supplier can take.
object
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
What stops every group.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The sum of all the groups in US dollars, or null when a group’s total is.
Always usd.
Examples
{ "error": { "code": "invalid_app_token", "message": "The app token is missing or not valid." }}ip_not_allowed: the app token was sent from an IP address that is not in your allowed list.
The body of every error response.
object
object
A stable error code.
A sentence for developers. It can change, so do not match on it.
The request field that caused the error. Only some errors have it.
Only on verification_data_missing and app_setup_incomplete. What still needs to be set.
Only on order_total_changed and order_has_problems. A fresh quote.
object
One group per supplier. Each group becomes one order.
object
object
An amount in dollars, with up to two decimal places.
The discount on the whole line, in US dollars.
An amount in dollars, with up to two decimal places.
The total of the lines, in US dollars.
The discount on the whole order, in US dollars.
object
The shipping charge in US dollars, or null when it cannot be worked out.
How much more to order for free shipping, or null when it does not apply.
The sales tax in US dollars, or null when it cannot be worked out.
object
The exemption certificate used, or null.
Why no certificate applies, or null when one does.
The amount the salon pays for this group in US dollars, or null when it cannot be worked out. Send it back as
expectedTotal. A group with problems has no expectedTotal.
now: Beauty Router charges the card when the order is created. after_verification: the company is
prequalified, so the charge waits until its verification ends.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The lines no supplier can take.
object
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
What stops every group.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The sum of all the groups in US dollars, or null when a group’s total is.
Always usd.
Examples
{ "error": { "code": "ip_not_allowed", "message": "This IP address is not in the allowed list of your salon app." }}internal_error: something failed on Beauty Router’s side. Try again later.
The body of every error response.
object
object
A stable error code.
A sentence for developers. It can change, so do not match on it.
The request field that caused the error. Only some errors have it.
Only on verification_data_missing and app_setup_incomplete. What still needs to be set.
Only on order_total_changed and order_has_problems. A fresh quote.
object
One group per supplier. Each group becomes one order.
object
object
An amount in dollars, with up to two decimal places.
The discount on the whole line, in US dollars.
An amount in dollars, with up to two decimal places.
The total of the lines, in US dollars.
The discount on the whole order, in US dollars.
object
The shipping charge in US dollars, or null when it cannot be worked out.
How much more to order for free shipping, or null when it does not apply.
The sales tax in US dollars, or null when it cannot be worked out.
object
The exemption certificate used, or null.
Why no certificate applies, or null when one does.
The amount the salon pays for this group in US dollars, or null when it cannot be worked out. Send it back as
expectedTotal. A group with problems has no expectedTotal.
now: Beauty Router charges the card when the order is created. after_verification: the company is
prequalified, so the charge waits until its verification ends.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The lines no supplier can take.
object
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
What stops every group.
object
What stops a group or the whole request. See Problems.
A sentence you can show. It can change, so do not match on it.
The product. Only on problems with one product.
The supplier. Only on problems with one supplier.
How many units can be ordered. Only on insufficient_stock.
The sum of all the groups in US dollars, or null when a group’s total is.
Always usd.
Examples
{ "error": { "code": "internal_error", "message": "Something went wrong. Try again later." }}