Products - Search

Either search or categoryId is required.

Search the global catalog of products by text and/or category (with optional segments).
Use this to power product pickers, discovery, and faceted search.

Base URL: https://api.salescaddy.ai/api

Requirement: Provide either search or categoryId (or both).
Supports pagination via page/size.


Endpoint

POST /products/search (parameters in query string)

Query parameters

NameTypeRequiredDefaultDescription
searchstringNo*Text query (matches name/description, etc.)
categoryIdstringNo*Filter by product category ID
segmentarray of stringNoSegment filter (multiple values allowed)
pageintNo0Page index (0‑based)
sizeintNo20Page size (max 200)

* At least one of search or categoryId must be provided.


Example — Text search

curl -sS -X POST "https://api.salescaddy.ai/api/products/search?search=crm&page=0&size=10" \
  -H "Authorization: Bearer $TOKEN"
const url = "https://api.salescaddy.ai/api/products/search?search=crm&page=0&size=10";
const res = await fetch(url, { method: "POST", headers: { Authorization: `Bearer ${process.env.TOKEN}` } });
console.log(await res.json());
import os, requests
r = requests.post("https://api.salescaddy.ai/api/products/search",
                  params={"search":"crm","page":0,"size":10},
                  headers={"Authorization": f"Bearer {os.environ['TOKEN']}"})
print(r.json())
using System.Net.Http.Headers;
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", TOKEN);
var res = await http.PostAsync("https://api.salescaddy.ai/api/products/search?search=crm&page=0&size=10", null);
Console.WriteLine(await res.Content.ReadAsStringAsync());

Sample response (trimmed):

{
  "totalPages": 80,
  "totalElements": 400,
  "content": [
    {
      "id": "prod_hubspot_crm",
      "name": "HubSpot CRM",
      "description": "CRM platform for sales & marketing",
      "logo": "https://logo.example/hubspot.svg",
      "category": "CRM",
      "features": ["Pipeline","Email","Automation"],
      "reviewCount": 5321,
      "starRating": 4.4,
      "avgRating": 4.3,
      "vendor": { "id": "ven_hubspot", "name": "HubSpot", "domain": "hubspot.com" },
      "categoryId": "cat_crm"
    },
    {
      "id": "prod_salesforce_salescloud",
      "name": "Salesforce Sales Cloud",
      "description": "Sales CRM",
      "logo": "https://logo.example/salescloud.svg",
      "category": "CRM",
      "features": ["Accounts","Opportunities","Reporting"],
      "reviewCount": 10421,
      "starRating": 4.5,
      "avgRating": 4.4,
      "vendor": { "id": "ven_salesforce", "name": "Salesforce", "domain": "salesforce.com" },
      "categoryId": "cat_crm"
    }
  ]
}

Example — Category filter

curl -sS -X POST "https://api.salescaddy.ai/api/products/search?categoryId=cat_crm&page=0&size=10" \
  -H "Authorization: Bearer $TOKEN"
const url = "https://api.salescaddy.ai/api/products/search?categoryId=cat_crm&page=0&size=10";
const res = await fetch(url, { method: "POST", headers: { Authorization: `Bearer ${process.env.TOKEN}` } });
console.log(await res.json());
r = requests.post("https://api.salescaddy.ai/api/products/search",
                  params={"categoryId":"cat_crm","page":0,"size":10},
                  headers={"Authorization": f"Bearer {os.environ['TOKEN']}"})
print(r.json())
var res = await http.PostAsync("https://api.salescaddy.ai/api/products/search?categoryId=cat_crm&page=0&size=10", null);
Console.WriteLine(await res.Content.ReadAsStringAsync());

Example — Text + Segments

curl -sS -X POST "https://api.salescaddy.ai/api/products/search?search=analytics&segment=midmarket&segment=enterprise&page=0&size=10" \
  -H "Authorization: Bearer $TOKEN"
const url = "https://api.salescaddy.ai/api/products/search?search=analytics&segment=midmarket&segment=enterprise&page=0&size=10";
const res = await fetch(url, { method: "POST", headers: { Authorization: `Bearer ${process.env.TOKEN}` } });
console.log(await res.json());
r = requests.post("https://api.salescaddy.ai/api/products/search",
                  params=[("search","analytics"),("segment","midmarket"),("segment","enterprise"),("page",0),("size",10)],
                  headers={"Authorization": f"Bearer {os.environ['TOKEN']}"})
print(r.json())
var url = "https://api.salescaddy.ai/api/products/search?search=analytics&segment=midmarket&segment=enterprise&page=0&size=10";
var res = await http.PostAsync(url, null);
Console.WriteLine(await res.Content.ReadAsStringAsync());

Sample response (trimmed):

{
  "totalPages": 25,
  "totalElements": 245,
  "content": [
    {
      "id": "prod_snowflake",
      "name": "Snowflake",
      "description": "Cloud data platform",
      "logo": "https://logo.example/snowflake.svg",
      "category": "Data Warehouse",
      "features": ["SQL","Elastic compute","Secure data sharing"],
      "reviewCount": 3120,
      "starRating": 4.6,
      "avgRating": 4.5,
      "vendor": { "id": "ven_snowflake", "name": "Snowflake", "domain": "snowflake.com" },
      "categoryId": "cat_warehouse"
    },
    {
      "id": "prod_lookerstudio",
      "name": "Looker Studio",
      "description": "BI and visualization",
      "logo": "https://logo.example/looker.svg",
      "category": "Business Intelligence",
      "features": ["Dashboards","Connectors","Calculated fields"],
      "reviewCount": 980,
      "starRating": 4.2,
      "avgRating": 4.1,
      "vendor": { "id": "ven_google", "name": "Google", "domain": "google.com" },
      "categoryId": "cat_bi"
    }
  ]
}

Errors

CodeMeaningHow to fix
400Bad requestProvide search or categoryId; validate page/size and query types.
401UnauthorizedProvide/refresh Bearer token
404Not foundNo products match filters
429Rate limit exceededRetry with exponential backoff
500Internal server errorRetry later; contact support if persistent