# SDK

TypeScript and Python SDKs for the Query API

Programmatically access and search your Raindrop data. Build dashboards, create eval sets, export data, or integrate Raindrop into your workflows.

## Installation

```bash
npm install @raindrop-ai/query
```

```bash
pip install raindrop-query
```

## Quick Start

```typescript
import { RaindropQuery } from "@raindrop-ai/query";

const client = new RaindropQuery({
  apiKey: process.env.RAINDROP_QUERY_API_KEY,
});

// Semantic search user inputs for frustration
const results = await client.events.search({
  query: "frustration about load times",
  mode: "semantic",
  searchIn: "user_input,assistant_output",
});
```

```python
import os
from raindrop_query import RaindropQuery

client = RaindropQuery(api_key=os.environ["RAINDROP_QUERY_API_KEY"])

# Semantic search user inputs for frustration
results = client.events.search(
  query="frustration about load times",
  mode="semantic",
  search_in="user_input"
)
```

[Get your Query API key here](https://auth.raindrop.ai/org/api_keys) (this is different from the write key used for ingestion).

## Common Patterns

### List Signals

```typescript
const response = await client.signals.list({ limit: 10 });

// Returns: { data: [...], meta: { cursor, has_more } }
const signals = response.data;
```

### Get Events for a Signal

```typescript
const signal = signals[0];

// Get count
const count = await client.events.count({ signal: signal.id });

// Get the actual events
const events = await client.events.list({
  signal: signal.id,
  limit: 100,
});
```

### Event Counts Over Time

```typescript
const timeseries = await client.events.timeseries({
  signal: signal.id,
  timestamp: { gte: new Date(Date.now() - 7 * 24 * 60 * 60 * 1000).toISOString() },
  interval: "day",
});
```

## Error Handling

```typescript
import { RaindropQuery, SDKValidationError } from "@raindrop-ai/query";

try {
  const events = await client.events.list();
} catch (error) {
  if (error instanceof SDKValidationError) {
    console.error("Invalid request:", error.message);
  }
}
```
