Clerk.io Recommendations API
The Recommendations API from Clerk.io — 25 operation(s) for recommendations.
The Recommendations API from Clerk.io — 25 operation(s) for recommendations.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/clerk-io-recommendations-api"
curl "https://apis.io/api/v1/apis?limit=25"
Discovery needs no key. Ratings and market analysis are Pro.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: Clerk.io Recommendations API
version: '2'
description: 'Clerk.io e-commerce personalisation REST API. Ingest and manage catalog data (products, categories, pages, orders, order parcels, customers, accessories), run behaviour-ranked search and predictive search-as-you-type, request recommendation logics (popular, trending, new, complementary, substituting, visitor- and customer-personalised, category- and page-scoped), manage merchandising (custom search configurations, synonyms, redirects), drive audiences/campaigns/subscribers for email, log visitor behaviour events, and service GDPR privacy requests.
All endpoints live under https://api.clerk.io/v2. Authentication uses a dual-key model: the public `key` identifies the store and is safe in browser-side calls; `private_key` is additionally required for write and sensitive operations and MUST only be sent over SSL.'
contact:
name: Clerk.io Documentation
url: https://docs.clerk.io/
x-provenance:
method: searched
harvested: '2026-08-13'
source: https://docs.clerk.io/reference/ (ReadMe API Designer OpenAPI 3.1.0 fragments per reference page)
original: openapi/_original/clerk-io-api-settings-openapi-original.yml
note: Provider-published operation content is verbatim. API Evangelist added the document title/description, tags[] declarations and per-operation tag assignment; see overlays/clerk-io-api-overlay.yaml.
servers:
- url: https://api.clerk.io/v2
security:
- sec0: []
tags:
- name: Recommendations
paths:
/recommendations/bundle:
get:
summary: recommendations/bundle
description: This endpoint is deprecated and has been replaced by recommendations/complementary
operationId: recommendations-bundle
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
- name: product
in: query
description: Product ID for the product you want bundled products for.
required: true
schema:
type: string
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: labels
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>A list of one or more text labels, used to track the labels performance in Analytics.'
schema:
type: array
items:
type: string
- name: attributes
in: query
description: Product attributes to be provided in the response. See API documentation on Product Metadata for details.
schema:
type: array
items:
type: string
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [123, 456, 789, ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/bundle?key=store_api_key&product=123&limit=30&labels=["Bundled products"]
name: GET
- language: curl
code: "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -d '{\"key\": \"store_api_key\",\n \"product\": 123, \n \"limit\": 30,\n \"visitor\": \"unique_visitor_id\",\n \"exclude\": [42],\n \"filter\": \"price > 100\",\n \"labels\": [\"Bundle options\"],\n \"facets\": [\"categories\", \"brands\"]}' \\\n http://api.clerk.io/v2/recommendations/bundle"
name: POST
samples-languages:
- curl
tags:
- Recommendations
/recommendations/category/new:
get:
summary: recommendations/category/new
description: The products in a given category (and subcategories) that were most recently added to the store.
operationId: recommendationscategorynew
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
- name: category
in: query
description: Category ID for the category you want popular products for.
required: true
schema:
type: string
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: labels
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>A list of one or more text labels, used to track the labels performance in Analytics.'
schema:
type: array
items:
type: string
- name: filter
in: query
description: A attribute filter to filter the result. See API documentation on Filters for details.
schema:
type: string
- name: exclude
in: query
description: Array of product IDs to be excluded from the result. See API documentation on Filters for details.
schema:
type: array
items:
type: string
- name: attributes
in: query
description: Product attributes to be provided in the response. See API documentation on Product Metadata for details.
schema:
type: array
items:
type: string
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
- name: debug
in: query
description: When `true`, the response will include a JSON dictionary of the various customisations made to the results shown by Synonyms, Customized Search, Merchandising etc.
schema:
type: boolean
default: false
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [123, 456, 789, ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/category/new?key=store_api_key&category=123&limit=30&labels=["New products in this category"]
name: GET
- language: curl
code: "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -d '{\"key\": \"store_api_key\",\n \"category\": 123, \n \"limit\": 30,\n \"visitor\": \"unique_visitor_id\",\n \"exclude\": [42],\n \"filter\": \"price > 100\",\n \"labels\": [\"Category Popular\"]' \\\n http://api.clerk.io/v2/recommendations/category/new"
name: POST
samples-languages:
- curl
tags:
- Recommendations
/recommendations/category/popular:
get:
summary: recommendations/category/popular
description: The products in a given category (and subcategories) that are most popular among customers right now.
operationId: recommendations-category-popular
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
- name: category
in: query
description: Category ID for the category you want popular products for.
required: true
schema:
type: string
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: labels
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>A list of one or more text labels, used to track the labels performance in Analytics.'
schema:
type: array
items:
type: string
- name: offset
in: query
description: Offset into the result. See pagenation docs for a deeper specification on how to use pagenation.
schema:
type: integer
format: int32
default: 0
- name: filter
in: query
description: A attribute filter to filter the result. See API documentation on Filters for details.
schema:
type: string
- name: exclude
in: query
description: Array of product IDs to be excluded from the result. See API documentation on Filters for details.
schema:
type: array
items:
type: string
- name: facets
in: query
description: List of facets to be returned for the products in the result. See API documentation on Facets for details.
schema:
type: array
items:
type: string
- name: orderby
in: query
description: Attribute to order the results by.
schema:
type: string
- name: order
in: query
description: Should the ordering from `orderby` be ascending (asc) or descending (desc).
schema:
type: string
default: asc
- name: attributes
in: query
description: Product attributes to be provided in the response. See API documentation on Product Metadata for details.
schema:
type: array
items:
type: string
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
- name: debug
in: query
description: When `true`, the response will include a JSON dictionary of the various customisations made to the results shown by Synonyms, Customized Search, Merchandising etc.
schema:
type: boolean
default: false
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [123, 456, 789, ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/category/popular?key=store_api_key&category=123&limit=30&labels=["Category Popular"]
name: GET
- language: curl
code: "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -d '{\"key\": \"store_api_key\",\n \"category\": 123, \n \"limit\": 30,\n \"offset\": 60,\n \"visitor\": \"unique_visitor_id\",\n \"exclude\": [42],\n \"filter\": \"price > 100\",\n \"labels\": [\"Category Popular\"],\n \"facets\": [\"categories\", \"brands\"]}' \\\n http://api.clerk.io/v2/recommendations/category/popular"
name: POST
samples-languages:
- curl
tags:
- Recommendations
/recommendations/category/popular_subcategories:
get:
summary: recommendations/category/popular_subcategories
description: The subcategories in a given category that are most popular among customers right now.
operationId: recommendationscategorypopular_subcategories
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
- name: category
in: query
description: Category ID for the category you want popular products for.
required: true
schema:
type: string
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: offset
in: query
description: Offset into the result. See pagenation docs for a deeper specification on how to use pagenation.
schema:
type: integer
format: int32
default: 0
- name: order
in: query
description: Should the subcategories be in descending or ascending order. Default is descending so the most popular is the first result.
schema:
type: string
default: desc
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
- name: debug
in: query
description: When `true`, the response will include a JSON dictionary of the various customisations made to the results shown by Synonyms, Customized Search, Merchandising etc.
schema:
type: boolean
default: false
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [{'url':'https://www.yoursite.com/category1','name':'category1','id':123},{'url':'https://www.yoursite.com/category2','name':'category2','id':124},{'url':'https://www.yoursite.com/category3','name':'category3','id':325} ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/category/popular_subcategories?key=store_api_key&category=123&limit=30
name: GET
- language: curl
code: "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -d '{\"key\": \"store_api_key\",\n \"category\": 123, \n \"limit\": 30,\n \"offset\": 60,\n \"visitor\": \"unique_visitor_id\",\n \"exclude\": [42],\n \"filter\": \"price > 100\",\n \"labels\": [\"Category Popular\"],\n \"facets\": [\"categories\", \"brands\"]}' \\\n http://api.clerk.io/v2/recommendations/category/popular"
name: POST
samples-languages:
- curl
tags:
- Recommendations
/recommendations/category/trending:
get:
summary: recommendations/category/trending
description: The products in a given category (and subcategories) that are growing the most in popularity amongst customers right now.
operationId: recommendationscategorytrending
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
- name: category
in: query
description: Category ID for the category you want popular products for.
required: true
schema:
type: string
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: labels
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>A list of one or more text labels, used to track the labels performance in Analytics.'
schema:
type: array
items:
type: string
- name: offset
in: query
description: Offset into the result. See pagenation docs for a deeper specification on how to use pagenation.
schema:
type: integer
format: int32
default: 0
- name: filter
in: query
description: A attribute filter to filter the result. See API documentation on Filters for details.
schema:
type: string
- name: exclude
in: query
description: Array of product IDs to be excluded from the result. See API documentation on Filters for details.
schema:
type: array
items:
type: string
- name: facets
in: query
description: List of facets to be returned for the products in the result. See API documentation on Facets for details.
schema:
type: array
items:
type: string
- name: attributes
in: query
description: Product attributes to be provided in the response. See API documentation on Product Metadata for details.
schema:
type: array
items:
type: string
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
- name: debug
in: query
description: When `true`, the response will include a JSON dictionary of the various customisations made to the results shown by Synonyms, Customized Search, Merchandising etc.
schema:
type: boolean
default: false
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [123, 456, 789, ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/category/trending?key=store_api_key&category=123&limit=30&labels=["Trending In This Category"]
name: GET
- language: curl
code: "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -d '{\"key\": \"store_api_key\",\n \"category\": 123, \n \"limit\": 30,\n \"offset\": 60,\n \"visitor\": \"unique_visitor_id\",\n \"exclude\": [42],\n \"filter\": \"price > 100\",\n \"labels\": [\"Trending In This Category\"],\n \"facets\": [\"categories\", \"brands\"]}' \\\n http://api.clerk.io/v2/recommendations/category/trending"
name: POST
samples-languages:
- curl
tags:
- Recommendations
/recommendations/complementary:
get:
summary: recommendations/complementary
description: The products that customers are most likely to buy with a given product or multiple products.
operationId: recommendations-complementary
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
- name: products
in: query
description: Product ID(s) for the products you want complementary products for.
required: true
schema:
type: array
items:
type: string
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: labels
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>A list of one or more text labels, used to track the labels performance in Analytics.'
schema:
type: array
items:
type: string
- name: filter
in: query
description: A attribute filter to filter the result. See API documentation on Filters for details.
schema:
type: string
- name: exclude
in: query
description: Array of product IDs to be excluded from the result. See API documentation on Filters for details.
schema:
type: array
items:
type: string
- name: attributes
in: query
description: Product attributes to be provided in the response. See API documentation on Product Metadata for details.
schema:
type: array
items:
type: string
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
- name: debug
in: query
description: When `true`, the response will include a JSON dictionary of the various customisations made to the results shown by Synonyms, Customized Search, Merchandising etc.
schema:
type: boolean
default: false
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [123, 456, 789, ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/complementary?key=store_api_key&products=[123,456,789]&limit=30&labels=["Best Cross-Sell Products"]
name: GET
- language: curl
code: "curl -X POST \\\n -H 'Content-Type: application/json' \\\n -d '{\"key\": \"store_api_key\",\n \"products\": [123], \n \"limit\": 30,\n \"visitor\": \"unique_visitor_id\",\n \"exclude\": [42],\n \"filter\": \"price > 100\",\n \"labels\": [\"Best Cross-Sell Products\"],\n \"facets\": [\"categories\", \"brands\"]}' \\\n https://api.clerk.io/v2/recommendations/complementary"
name: POST
samples-languages:
- curl
tags:
- Recommendations
/recommendations/currently_watched:
get:
summary: recommendations/currently_watched
description: The products other store visitors are currently looking at.
operationId: recommendationscurrently_watched
parameters:
- name: key
in: query
description: You store API key.
required: true
schema:
type: string
default: insert_api_key
- name: limit
in: query
description: Number of results to be returned.
required: true
schema:
type: integer
format: int32
- name: visitor
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>Visitor ID for the given visitor. <br/> If `auto`, an anonymous ID is generated. <br/> See <a href="https://docs.clerk.io/docs/visitor-tracking" target="_blank">API documentation on Visitor Tracking</a> for details.'
schema:
type: string
- name: labels
in: query
description: '<small style="color: #eea236;">Required for tracking</small><br/>A list of one or more text labels, used to track the labels performance in Analytics.'
schema:
type: array
items:
type: string
- name: exclude
in: query
description: Array of product IDs to be excluded from the result. See API documentation on Filters for details.
schema:
type: array
items:
type: string
- name: attributes
in: query
description: Product attributes to be provided in the response. See API documentation on Product Metadata for details.
schema:
type: array
items:
type: string
- name: callback
in: query
description: JSONP - Wraps the response as a function call with the name of the string.
schema:
type: string
- name: debug
in: query
description: When `true`, the response will include a JSON dictionary of the various customisations made to the results shown by Synonyms, Customized Search, Merchandising etc.
schema:
type: boolean
default: false
responses:
'200':
description: '200'
content:
application/json:
examples:
Result:
value: "{\n \"status\": \"ok\",\n \"result\": [123, 456, 789, ...]\n}"
Error:
value: "{\n \"status\": \"error\",\n \"message\": \"A message explaining the error.\",\n \"moreInfo\": \"http://help.clerk.io/error/{ERROR_ID}\",\n \"type\": \"ErrorType\",\n \"id\": \"{ERROR_ID}\"\n}"
schema:
type: object
properties:
status:
type: string
example: error
message:
type: string
example: A message explaining the error.
moreInfo:
type: string
example: http://help.clerk.io/error/{ERROR_ID}
type:
type: string
example: ErrorType
id:
type: string
example: '{ERROR_ID}'
deprecated: false
x-readme:
code-samples:
- language: curl
code: curl http://api.clerk.io/v2/recommendations/currently_watched?key=store_api_key&limit=30&labels=["Customers Are Looking
# --- truncated at 32 KB (110 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/clerk-io/refs/heads/main/openapi/clerk-io-recommendations-api-openapi.yml