# Code Examples

Practical examples for integrating AIDP into your applications.

## Available Examples

### [Search Integration](https://amistan.gitbook.io/aidp-docs/for-developers/examples/search)

Learn how to implement business search in your application.

**Topics Covered**:

* Basic search implementation
* Location-based search
* Autocomplete search
* Search with filters
* Pagination
* Error handling

**Languages**:

* TypeScript/JavaScript
* Python
* Vanilla JavaScript

***

### [Analytics Integration](https://amistan.gitbook.io/aidp-docs/for-developers/examples/analytics)

Learn how to display and analyze business performance data.

**Topics Covered**:

* Upstream metrics dashboard
* Intent journey visualization
* Competitive benchmarking
* Attribution tracking
* Real-time updates

**Languages**:

* TypeScript/JavaScript
* Python
* React components

***

## Quick Start Examples

### Simple Search (TypeScript)

```typescript
import { AIDPClient } from '@aidp/sdk';

const client = new AIDPClient({
  apiKey: process.env.AIDP_API_KEY,
});

async function searchBusinesses(query: string) {
  const results = await client.search({
    query,
    location: { lat: 45.5231, lon: -122.6765, distance: '5km' },
  });

  return results.data.businesses;
}

// Usage
const businesses = await searchBusinesses('coffee shops');
console.log(businesses);
```

### Simple Search (Python)

```python
from aidp import AIDPClient
import os

client = AIDPClient(api_key=os.environ['AIDP_API_KEY'])

def search_businesses(query: str):
    results = client.search(
        query=query,
        location={'lat': 45.5231, 'lon': -122.6765, 'distance': '5km'}
    )
    return results.data.businesses

# Usage
businesses = search_businesses('coffee shops')
print(businesses)
```

### Simple Analytics (TypeScript)

```typescript
import { AIDPClient } from '@aidp/sdk';

const client = new AIDPClient({
  apiKey: process.env.AIDP_API_KEY,
});

async function getUpstreamMetrics(businessId: string) {
  const metrics = await client.analytics.upstream({
    businessId,
    startDate: '2024-01-01',
    endDate: '2024-12-31',
  });

  return {
    impressions: metrics.data.totalImpressions,
    citations: metrics.data.totalCitations,
    citationRate: metrics.data.citationRate,
  };
}

// Usage
const metrics = await getUpstreamMetrics('biz_abc123');
console.log(`Impressions: ${metrics.impressions}`);
console.log(`Citation Rate: ${metrics.citationRate}%`);
```

***

## Example Projects

### Full-Stack Search Application

A complete example showing:

* Next.js frontend with search UI
* API routes for backend integration
* TypeScript throughout
* Error handling and loading states

[View Example →](https://amistan.gitbook.io/aidp-docs/for-developers/search#full-stack-example)

### Analytics Dashboard

A complete analytics dashboard showing:

* React components for data visualization
* Chart.js integration
* Real-time data updates
* Responsive design

[View Example →](https://amistan.gitbook.io/aidp-docs/for-developers/analytics#analytics-dashboard)

***

## Common Patterns

### Error Handling

```typescript
async function safeSearch(query: string) {
  try {
    const results = await client.search({ query });
    return { success: true, data: results.data };
  } catch (error) {
    if (error.code === 'RATE_LIMIT_EXCEEDED') {
      return { success: false, error: 'Too many requests. Please try again later.' };
    } else if (error.code === 'VALIDATION_ERROR') {
      return { success: false, error: 'Invalid search parameters.' };
    } else {
      return { success: false, error: 'An error occurred. Please try again.' };
    }
  }
}
```

### Caching

```typescript
const cache = new Map<string, { data: any; timestamp: number }>();
const CACHE_TTL = 5 * 60 * 1000; // 5 minutes

async function cachedSearch(query: string) {
  const cached = cache.get(query);

  if (cached && Date.now() - cached.timestamp < CACHE_TTL) {
    return cached.data;
  }

  const results = await client.search({ query });
  cache.set(query, { data: results.data, timestamp: Date.now() });

  return results.data;
}
```

### Pagination

```typescript
async function getAllResults(query: string) {
  const allBusinesses = [];
  let offset = 0;
  const limit = 50;

  while (true) {
    const response = await client.search({ query, limit, offset });
    allBusinesses.push(...response.data.businesses);

    if (!response.data.pagination.hasMore) break;
    offset += limit;
  }

  return allBusinesses;
}
```

***

## Testing Examples

### Unit Testing

```typescript
import { AIDPClient } from '@aidp/sdk';
import { jest } from '@jest/globals';

describe('Search Integration', () => {
  let client: AIDPClient;

  beforeEach(() => {
    client = new AIDPClient({ apiKey: 'test_key' });
  });

  it('should return businesses for valid query', async () => {
    const results = await client.search({ query: 'coffee' });
    expect(results.success).toBe(true);
    expect(results.data.businesses).toBeInstanceOf(Array);
  });

  it('should handle rate limiting', async () => {
    // Mock rate limit response
    jest.spyOn(client, 'search').mockRejectedValue({
      code: 'RATE_LIMIT_EXCEEDED',
      retryAfter: 60,
    });

    await expect(client.search({ query: 'coffee' })).rejects.toMatchObject({
      code: 'RATE_LIMIT_EXCEEDED',
    });
  });
});
```

***

## Need Help?

* 📧 Email: <examples@aidp.dev>
* 💬 GitHub Discussions: [github.com/aidp/platform/discussions](https://github.com/aidp/platform/discussions)
* 📚 Full Documentation: [docs.aidp.dev](https://docs.aidp.dev)
* 🐛 Report Issues: [github.com/aidp/examples/issues](https://github.com/aidp/examples/issues)
