# Sales Layer Catalog REST API

The Sales Layer Catalog REST API provides programmatic access to the catalog data managed in Sales Layer.

Use this reference to retrieve, filter, create, update, or delete products, variants, categories, attribute sets, custom entities, metadata, and changelog records. These endpoints support synchronization, enrichment, publishing, reporting, and other integration workflows across ecommerce platforms, ERPs, marketplaces, DAM systems, supplier systems, and internal tools.

Start with metadata endpoints when your integration needs to discover available fields and relationships, use pagination and filtering for large reads, and rely on changelogs for incremental synchronization whenever possible.


Version: 2.0.0

## Servers

Sales Layer Catalog API
```
https://api2.saleslayer.com/catalog
```

## Download OpenAPI description

 - [Sales Layer Catalog REST API](https://docs.api.saleslayer.com/_bundle/apis/catalog-v2.0.yaml)

## Attribute Sets

 - [GET /AttributeSets](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets/filterattributesetsasync.md): Filters the tenant's <b>Attribute Set</b> resources using OData query options (<b>$select</b>, <b>$expand</b>, <b>$filter</b>, <b>$orderby</b>, <b>$skip</b>, <b>$top</b>, <b>$skipToken</b>). Result's
 - [GET /AttributeSets({attributeSetIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets/searchattributesetasync.md): Returns a single <b>Attribute Set</b> resource by its identifier, using OData query options (<b>$select</b>, <b>$expand</b>) to shape the result. <b>Parameters details</b> <para> <b> <i>X-API-KEY</i>
 - [GET /AttributeSets({attributeSetIdentifier})/Products](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets/filterproductsinattributesetasync.md): Filters and returns a paginated collection of Product resources scoped to the given Attribute Set, using OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## H
 - [GET /AttributeSets/$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets/getattributesetmetadataasync.md): Returns the public metadata of the <b>Attribute Set</b> model as a JSON schema document describing the resources (<b>Product</b>, <b>Variant</b>) associated to the <b>Attribute Set</b> and the relatio
## Attribute Sets v2

 - [GET /v2/AttributeSets](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets-v2/getattributesets.md): Returns all attribute sets defined for the tenant, each including its name, identifier, and form layout configuration for Products and Variants (`ProductLayout`, `VariantLayout`). **See also:** A lega
 - [POST /v2/AttributeSets](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets-v2/createattributeset.md): Creates a new attribute set for the tenant from the supplied `name` and optional Product and Variant form layouts, returning the created attribute set and a `Location` header pointing to it. The Produ
 - [GET /v2/AttributeSets({id})](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets-v2/getattributeset.md): Returns a single attribute set identified by `id`. Accepted values: - **`default`** (case-insensitive) — retrieves the tenant's default attribute set. - **Positive integer** — retrieves the attribute
 - [PATCH /v2/AttributeSets({id})](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets-v2/updateattributeset.md): Partially updates an existing attribute set identified by `id`. Accepted values: - **`default`** (case-insensitive) — updates the tenant's default attribute set. - **Positive integer** — updates the a
 - [DELETE /v2/AttributeSets({id})](https://docs.api.saleslayer.com/apis/catalog-v2.0/attribute-sets-v2/deleteattributeset.md): Deletes the attribute set identified by `id` (a positive integer). The tenant's default attribute set cannot be deleted. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Query
## Categories

 - [GET /Categories](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/filtercategoriesasync.md): Filters the tenant's Categories using OData query options and returns the matching resources as a paginated collection. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers
 - [POST /Categories](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/createcategoryasync.md): Creates a new Category from the supplied JSON object and returns its location in the `Location` header. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-Lang
 - [GET /Categories({categoryIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/searchcategoryasync.md): Returns a single Category resource identified by its route identifier, optionally shaping the response with `$select` and `$expand`. ## Authentication Requires a valid API key in the `X-API-KEY` heade
 - [PATCH /Categories({categoryId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/updatecategoryasync.md): Updates an existing Category identified by its route identifier, applying only the writable fields supplied in the request body (PATCH semantics). ## Authentication Requires a valid API key in the `X-
 - [DELETE /Categories({categoryId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/deletecategoryasync.md): Deletes the Category identified by its route identifier. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Response **204 No Content** — Category deleted. ## Error Responses - *
 - [GET /Categories({categoryIdentifier})/Products](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/filterproductsincategoryasync.md): Filters and returns a paginated collection of Product resources scoped to the given Category, using OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Header
 - [GET /Categories({categoryIdentifier})/Products({productIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/searchproductincategoryasync.md): Returns a single Product resource by its identifier, scoped to the given Category. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-Language Indicates the pr
 - [GET /Categories/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/filtercategorieschangelogasync.md): Returns the changelog entries for the tenant's Categories as a collection, filterable and pageable with OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## OD
 - [GET /Categories({categoryIdentifier})/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/filtercategorychangelogasync.md): Returns the changelog entries for a single Category identified by its route identifier, filterable and pageable with OData query options. ## Authentication Requires a valid API key in the `X-API-KEY`
 - [GET /Categories/layout](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/getcategoryformlayoutasync.md): The layout describes how the Category edit form is rendered. It is a JSON document with a `sections` array; each section has a `title` and a `rows` array; each row has a `fields` array and, optionally
 - [PUT /Categories/layout](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/updatecategoryformlayoutasync.md): Fully overwrites the currently stored Category layout. The payload is **not merged** with the existing layout — it replaces it entirely. A layout must already exist for the tenant; this operation repl
 - [GET /Categories/$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/categories/getcategorymetadataasync.md): The metadata is a JSON Schema document that describes: - The implicit and custom properties exposed by the Category resource. - The embedded resources (`Products`, `Variants`) and their relationships.
## Products

 - [GET /Products](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/filterproductsasync.md): Filters and returns a paginated collection of Product resources using OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-Language Indicate
 - [POST /Products](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/createproductasync.md): Creates a new Product resource from the supplied JSON body and returns its location. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-Language Culture used t
 - [GET /Products({productIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/searchproductasync.md): Returns a single Product resource by its identifier. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-Language Indicates the preferred natural language and l
 - [PATCH /Products({productId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/updateproductasync.md): Updates an existing Product resource, applying only the fields supplied in the JSON body (PATCH semantics). ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-
 - [DELETE /Products({productId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/deleteproductasync.md): Deletes the Product resource identified by the given identifier. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Response **204 No Content** — Product deleted. ## Error Respon
 - [GET /Products({productIdentifier})/Variants](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/filtervariantsinproductasync.md): Filters the Variant resources nested within the specified Product using OData query options and returns the matching collection. ## Authentication Requires a valid API key in the `X-API-KEY` header. #
 - [GET /Products({productIdentifier})/Variants({variantIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/searchvariantinproductasync.md): Returns a single Variant resource nested within the specified Product, with the published fields selected via OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header.
 - [GET /Products/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/filterproductschangelogasync.md): Returns a paginated collection of changelog entries recording changes to Products, filterable with OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## OData Q
 - [GET /Products({productIdentifier})/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/filterproductchangelogasync.md): Returns a paginated collection of changelog entries for a single Product, filterable with OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## OData Query Supp
 - [GET /Products/$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/products/getproductmetadataasync.md): The metadata is a JSON Schema document that describes: - The implicit and custom properties exposed by the Product resource. - The associated resources (`Category`, `Attribute Set`, `Variant`) and the
## Variants

 - [GET /Variants](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/filtervariantsasync.md): Filters the tenant's Variant resources using OData query options and returns the matching collection. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accept-Langua
 - [POST /Variants](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/createvariantasync.md): Creates a new Variant resource from the supplied JSON body and returns its location in the `Location` header. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Headers ### Accep
 - [GET /Variants({variantIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/searchvariantasync.md): Returns a single Variant resource identified by its identifier, with the published fields selected via OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Hea
 - [PATCH /Variants({variantId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/updatevariantasync.md): Updates the writable fields of an existing Variant from the supplied JSON body using PATCH semantics (only the supplied fields are modified). ## Authentication Requires a valid API key in the `X-API-K
 - [DELETE /Variants({variantId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/deletevariantasync.md): Deletes the Variant resource identified by its identifier. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## Response **204 No Content** — Variant deleted. ## Error Responses -
 - [GET /Variants/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/filtervariantschangelogasync.md): Returns the changelog entries recorded across the tenant's Variants, filtered and paged via OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. ## OData Query Su
 - [GET /Variants({variantIdentifier})/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/filtervariantchangelogasync.md): Returns the changelog entries recorded for the Variant identified by its identifier, filtered and paged via OData query options. ## Authentication Requires a valid API key in the `X-API-KEY` header. #
 - [GET /Variants/$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/variants/getvariantmetadataasync.md): The metadata is a JSON Schema document that describes: - The implicit and custom properties exposed by the Variant resource. - The associated resources (`Product`) and their relationships. The schema
## Custom Entities

 - [GET /CustomEntities('{customEntityDenominator}')](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/filtercustomentitiesasync.md): Filters the items of a Custom Entity type, identified by its denominator, returning the matching resources as a collection. Supports OData query options for selecting, expanding, filtering, ordering a
 - [POST /CustomEntities('{customEntityDenominator}')](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/createcustomentityasync.md): Creates a new item for a Custom Entity type, identified by its denominator, from the supplied JSON object. On success returns `201 Created` with the new resource location in the `Location` header. ##
 - [PATCH /CustomEntities('{customEntityDenominator}')/item({itemId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/updatecustomentityasync.md): Updates an existing item of a Custom Entity type, identified by its denominator and item identifier, applying PATCH semantics so that only the supplied fields are modified. Returns `200 OK` when the u
 - [DELETE /CustomEntities('{customEntityDenominator}')/item({itemId})](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/deletecustomentityasync.md): Deletes an item of a Custom Entity type, identified by its denominator and item identifier. Returns `204 No Content` when the item has been deleted. ## Authentication Requires a valid API key in the `
 - [GET /CustomEntities('{customEntityDenominator}')/Changelog](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/filtercustomentitieschangelogasync.md): Returns the changelog entries for a Custom Entity type, identified by its denominator, as a collection. Supports OData query options to filter, order and page the results. ## Authentication Requires a
 - [GET /CustomEntities('{customEntityDenominator}')/Changelog({itemIdentifier})](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/filtercustomentitychangelogasync.md): Returns the changelog entries for a single Custom Entity item, identified by its denominator and item identifier, as a collection. Supports OData query options to filter, order and page the results. #
 - [GET /CustomEntities('{customEntityDenominator}')/layout](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/getcustomentityformlayoutasync.md): Unlike the Category model — which has a single layout shared by all categories — each Custom Entity type has its own layout, selected by the route's customEntityDenominator. The layout describes how t
 - [PUT /CustomEntities('{customEntityDenominator}')/layout](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/updatecustomentityformlayoutasync.md): Each Custom Entity type has its own layout identified by `customEntityDenominator`. The supplied layout fully overwrites the currently stored layout for that Custom Entity; it is **not merged**. A lay
 - [GET /CustomEntities/$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/getcustomentitiesmetadataasync.md): The metadata is a JSON Schema document that lists the Custom Entities defined in the PIM for the current tenant, together with their relationships. Use the returned denominators to query individual Cu
 - [GET /CustomEntities('{customEntityDenominator}')/$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/custom-entities/getcustomentitymetadataasync.md): The metadata is a JSON Schema document that describes the implicit and custom properties exposed by the specified Custom Entity resource. The schema should be consulted to build requests against the o
## Metadata

 - [GET /$metadata](https://docs.api.saleslayer.com/apis/catalog-v2.0/metadata/getmetadataasync.md): Returns the Catalog metadata as a JSON Schema document describing every resource (`Category`, `Attribute Set`, `Product`, `Variant`, `Point of Sale`) and the relationships between them. Use it to buil
