# Filter Categories

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
            
### Accept-Language
            
Indicates the preferred natural language and locale for localized content.
- omitted / null: content in the tenant's default culture.
- culture-code (e.g. en-US, es): content localized in the specified culture.
- * and q-factor weighting are currently not supported.
            
## OData Query Support
            
### $select
            
Comma-separated list of root-resource property names to include in the response.
The available property names are published in /Categories/$metadata.
Selecting properties of embedded resources is not supported.
            
Example: $select=cat_title,cat_description
            
### $expand
            
Comma-separated list of embedded collections to include.
By default, embedded collections are not included.
Only embedded collections (not embedded resources) are supported.
            
Example: $expand=Products
            
### $filter
            
OData v4.01 URI conventions. Filtering is restricted to properties of the root resource (Category).
            
Comparison operators: eq, ne, gt, ge, lt, le
            
Logical operators: and, or, not
            
Set operator: in
            
String functions: contains, startswith, endswith
            
Examples:
- $filter=cat_title eq 'Outdoor'
- $filter=contains(cat_title, 'pro')
- $filter=cat_id in (1, 2, 3)
- $filter=cat_id gt 100 and contains(cat_title, 'pro')
            
### $orderby
            
Single property, ascending by default. Multi-property ordering and ordering on embedded
properties are not supported.
            
Examples:
- $orderby=cat_title (asc by default)
- $orderby=cat_title asc
- $orderby=cat_ref desc
            
### Pagination — $top, $skip, $skipToken
            
- $top — maximum number of items returned.
- $skip — number of items to skip (offset paging).
- $skipToken — continuation-token paging. Recommended when no $orderby is applied
  (faster than offset paging).
            
Paging applies only to the root resource (Category), never to embedded collections.
            
## Response
            
200 OK — CollectionRepresentation with the matching Category resources, pagination
metadata (Count, Skip, Top, HasNext, continuation token) and the cultures echoed
from Accept-Language.
            
## Error Responses
            
- 400 Bad Request — Invalid OData expression or unsupported $orderby/$filter field
  (returns ValidationFailureRepresentation).
- 401 Unauthorized — Missing or invalid API key. Returned by the API gateway as
  { "message": "Unauthorized", "request_id": "d8aafa5b8f3e400b60bea0123dd33317" }.
- 404 Not Found — Tenant or model not found.
- 500 Internal Server Error — Unexpected technical error.
            
## Example
            
Request:
http
GET /Categories?$filter=contains(cat_title,'pro')&$orderby=cat_title asc&$top=20 HTTP/1.1
X-API-KEY: your-api-key-here
Accept-Language: en-US

            
Response:
http
HTTP/1.1 200 OK
Content-Type: application/json

Endpoint: GET /Categories
Version: 2.0.0

## Header parameters:

  - `X-API-KEY` (string)
    Tenant's API key (required)

  - `Accept-Language` (string)
    Preferred localization culture (Accept-Language header)

## Query parameters:

  - `$filter` (string)

  - `$orderby` (string)

  - `$skip` (integer)

  - `$skipToken` (string)

  - `$top` (integer)

  - `$select` (string)

  - `$expand` (string)

## Response 200 fields (application/json):

  - `@readLink` (string,null)

  - `@nextLink` (string,null)

  - `@deltaLink` (string,null)

  - `@context` (string,null)

  - `value` (any,null)

  - `@count` (integer,null)

## Response 400 fields (application/json):

  - `validationFailures` (object,null)
    Example: {"Layout":[{"PropertyName":"Layout","ErrorMessage":"The layout must contain exactly the attributes of the stored layout. Missing: tags. Unknown: extra_field.","AttemptedValue":null}]}

## Response 401 fields (application/json):

  - `message` (string,null)

  - `request_id` (string,null)

## Response 404 fields (application/json):

  - `type` (string,null)

  - `title` (string,null)

  - `status` (integer,null)

  - `detail` (string,null)

  - `instance` (string,null)

## Response 500 fields (application/json):

  - `error` (string,null)

  - `details` (any,null)


