# Pagination and filtering

## Pagination

Asset list endpoints use zero-based pagination. The [events feed](/docs/api/events) uses an `after` cursor instead.

| Field | Meaning |
| --- | --- |
| `pageIndex` | Zero-based page number; defaults to `0`. |
| `pageSize` | Items per page, from `1` through `100`. |
| `ordering` | An array of `{ field, direction }` values. |

Responses include `items`, `total`, `pageIndex`, `pageSize`, `ordering`, and `hasMore`.

**JavaScript**

```javascript
const page = await client.assets.list({
  pageIndex: 0,
  pageSize: 25,
  ordering: [{ field: "createdAt", direction: "DESC" }],
});
```

**python**

```python
import os
import json
from calmlens import CalmLensClient

client = CalmLensClient(
    api_key=os.environ["CALMLENS_API_KEY"],
    project_id="your-project-id",
)

options = json.loads("{\"pageIndex\":0,\"pageSize\":25,\"ordering\":[{\"field\":\"createdAt\",\"direction\":\"DESC\"}]}")
response = client.assets.list(options)
print(response)
```

**go**

```go
package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "os"

    calmlens "github.com/Censkh/CalmLens/packages/go-sdk"
)

func main() {
    client, err := calmlens.NewClient(calmlens.Options{
        APIKey: os.Getenv("CALMLENS_API_KEY"),
        ProjectID: "your-project-id",
    })
    if err != nil { log.Fatal(err) }

    var options calmlens.ListAssetsOptions
    if err := json.Unmarshal([]byte("{\"pageIndex\":0,\"pageSize\":25,\"ordering\":[{\"field\":\"createdAt\",\"direction\":\"DESC\"}]}"), &options); err != nil { log.Fatal(err) }
    response, err := client.Assets.List(context.Background(), options)
    if err != nil { log.Fatal(err) }
    fmt.Println(response)
}
```

**ruby**

```ruby
require 'calmlens'

client = CalmLens::Client.new(api_key: ENV.fetch('CALMLENS_API_KEY'), project_id: ENV.fetch('CALMLENS_PROJECT_ID'))
result = client.assets.list(page_index: 0, page_size: 25, ordering: [{"field" => "createdAt", "direction" => "DESC"}])
puts result
client.close
```

**rust**

```rust
use calmlens::{models::*, Client};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new(std::env::var("CALMLENS_API_KEY")?, std::env::var("CALMLENS_PROJECT_ID")?)?;
    let result = client.assets().list(ListAssets { page_index: Some(0), page_size: Some(25), ordering: Some(vec![Order { field: "createdAt".into(), direction: "DESC".into(), ..Default::default() }]), ..Default::default() }).await?;
    println!("{result:?}");
    Ok(())
}
```

**java**

```java
import com.calmlens.CalmLensClient;
import com.calmlens.Models.*;

public class Example {
  public static void main(String[] args) {
    var client = new CalmLensClient(System.getenv("CALMLENS_API_KEY"), System.getenv("CALMLENS_PROJECT_ID"));
    var result = client.assets.list(new ListAssets().pageIndex(0).pageSize(25).ordering(java.util.Arrays.asList(new Order().field("createdAt").direction("DESC"))));
    System.out.println(result);
  }
}
```

**curl**

```sh
curl -X GET "https://api.calmlens.com/v1/projects/$CALMLENS_PROJECT_ID/assets/page?pageIndex=0&pageSize=25&ordering%5B0%5D%5Bfield%5D=createdAt&ordering%5B0%5D%5Bdirection%5D=DESC" \
  -H "X-Api-Key: $CALMLENS_API_KEY"
```

## Asset filters

The asset list accepts an RSQL-style `filter`. Supported operators include equality (`==`), inequality (`!=`), comparisons (`>`, `>=`, `<`, `<=`), and inclusion (`=in=`). Use `;` for AND, `,` for OR, and parentheses for grouping.

```text
# Approved assets
status==approved

# Approved or pending assets
status=in=(approved,pending)

# Rejected top-level assets
status==rejected;parentId==null

# Private assets awaiting or passing moderation
(status==approved,status==pending);visibility==private

# Assets tagged homepage
tags=in=(homepage)
```

Pass the expression as one URL-encoded query value or directly through the SDK:

**JavaScript**

```javascript
const page = await client.assets.list({
  pageIndex: 0,
  filter: "status==approved;tags=in=(homepage)",
});
```

**python**

```python
import os
import json
from calmlens import CalmLensClient

client = CalmLensClient(
    api_key=os.environ["CALMLENS_API_KEY"],
    project_id="your-project-id",
)

options = json.loads("{\"pageIndex\":0,\"filter\":\"status==approved;tags=in=(homepage)\"}")
response = client.assets.list(options)
print(response)
```

**go**

```go
package main

import (
    "context"
    "encoding/json"
    "fmt"
    "log"
    "os"

    calmlens "github.com/Censkh/CalmLens/packages/go-sdk"
)

func main() {
    client, err := calmlens.NewClient(calmlens.Options{
        APIKey: os.Getenv("CALMLENS_API_KEY"),
        ProjectID: "your-project-id",
    })
    if err != nil { log.Fatal(err) }

    var options calmlens.ListAssetsOptions
    if err := json.Unmarshal([]byte("{\"pageIndex\":0,\"filter\":\"status==approved;tags=in=(homepage)\"}"), &options); err != nil { log.Fatal(err) }
    response, err := client.Assets.List(context.Background(), options)
    if err != nil { log.Fatal(err) }
    fmt.Println(response)
}
```

**ruby**

```ruby
require 'calmlens'

client = CalmLens::Client.new(api_key: ENV.fetch('CALMLENS_API_KEY'), project_id: ENV.fetch('CALMLENS_PROJECT_ID'))
result = client.assets.list(page_index: 0, filter: "status==approved;tags=in=(homepage)")
puts result
client.close
```

**rust**

```rust
use calmlens::{models::*, Client};

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let client = Client::new(std::env::var("CALMLENS_API_KEY")?, std::env::var("CALMLENS_PROJECT_ID")?)?;
    let result = client.assets().list(ListAssets { page_index: Some(0), filter: Some("status==approved;tags=in=(homepage)".into()), ..Default::default() }).await?;
    println!("{result:?}");
    Ok(())
}
```

**java**

```java
import com.calmlens.CalmLensClient;
import com.calmlens.Models.*;

public class Example {
  public static void main(String[] args) {
    var client = new CalmLensClient(System.getenv("CALMLENS_API_KEY"), System.getenv("CALMLENS_PROJECT_ID"));
    var result = client.assets.list(new ListAssets().pageIndex(0).filter("status==approved;tags=in=(homepage)"));
    System.out.println(result);
  }
}
```

**curl**

```sh
curl -X GET "https://api.calmlens.com/v1/projects/$CALMLENS_PROJECT_ID/assets/page?pageIndex=0&filter=status%3D%3Dapproved%3Btags%3Din%3D%28homepage%29" \
  -H "X-Api-Key: $CALMLENS_API_KEY"
```

Invalid syntax or unknown fields return a client error. Avoid constructing filters from untrusted input without restricting allowed fields and operators.
