Get product details
- Production and sandbox. The token decides the environment.
https://api.beautyrouter.com/v1/catalog/products/{productId}
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/products/prod-4Fz9QbX2kL"), 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/products/prod-4Fz9QbX2kL"
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/products/prod-4Fz9QbX2kL") .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/products/prod-4Fz9QbX2kL', 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/products/prod-4Fz9QbX2kL';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/products/prod-4Fz9QbX2kL") .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/products/prod-4Fz9QbX2kL', [ 'headers' => [ 'Authorization' => 'Bearer <token>', ],]);
echo $response->getBody();import requests
url = "https://api.beautyrouter.com/v1/catalog/products/prod-4Fz9QbX2kL"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.json())require 'uri'require 'net/http'
url = URI("https://api.beautyrouter.com/v1/catalog/products/prod-4Fz9QbX2kL")
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/products/prod-4Fz9QbX2kL \ --header 'Authorization: Bearer <token>'import Foundation
let headers = ["Authorization": "Bearer <token>"]
let request = NSMutableURLRequest(url: NSURL(string: "https://api.beautyrouter.com/v1/catalog/products/prod-4Fz9QbX2kL")! 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 one product with every catalog field, plus all its images, benefits, ingredients, usage,
attributes, and suppliers. Call it when a user opens product details. It has no batch form. It has no prices:
those are in POST /v1/products/offers.
Authorizations
Section titled “Authorizations”Parameters
Section titled “Parameters”Path Parameters
Section titled “Path Parameters”The product ID.
Example
prod-4Fz9QbX2kLResponses
Section titled “Responses”The product.
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.
The URLs of all the product images.
What the product does, as text.
The ingredients, as text.
How to use the product, as text.
Ready-made text rows.
object
One entry per supplier that sells any size in the product group, sorted best first for this salon. There are no prices here.
object
The size this supplier sells.
The supplier ID.
This supplier’s suggested retail price in US dollars, or null.
Examples
{ "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", "images": [ "https://images.beautyrouter.com/prod-4Fz9QbX2kL/1.jpg", "https://images.beautyrouter.com/prod-4Fz9QbX2kL/2.jpg" ], "benefits": "Rebuilds broken bonds and leaves hair stronger after every wash.", "ingredients": "Water, Sodium Cocoyl Isethionate, Cocamidopropyl Betaine, Glycerin, Hydrolyzed Keratin.", "usage": "Massage into wet hair, lather, and rinse. Follow with Amberlin Bond Repair Conditioner.", "attributes": [ { "name": "Volume", "value": "33.8 fl oz" }, { "name": "Hair type", "value": "Color-treated" } ], "suppliers": [ { "productId": "prod-4Fz9QbX2kL", "id": "sup-1Ry6tUi3Op", "name": "Amberlin", "logo": "https://images.beautyrouter.com/sup-1Ry6tUi3Op/logo.png", "msrp": 48 }, { "productId": "prod-9Cv5bNm3Ws", "id": "sup-8Wq2eRt5Yu", "name": "Dunmore Beauty Supply", "logo": "https://images.beautyrouter.com/sup-8Wq2eRt5Yu/logo.png", "msrp": 22 } ]}invalid_user_token: the user token is missing or wrong. user_token_expired: the user token expired. Log the
user in again with POST /v1/login.
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_user_token", "message": "The user token is missing or not valid." }}{ "error": { "code": "user_token_expired", "message": "The user token expired. Log the user in again." }}not_found: the object does not exist, or the user has no access to 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": "not_found", "message": "The object was not found." }}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." }}