> ## Documentation Index
> Fetch the complete documentation index at: https://docs.limitly.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Next.js SDK Request Validation

> Learn how to validate requests using the Limitly Next.js SDK

The Limitly Next.js SDK provides powerful request validation capabilities to enforce rate limits and usage policies.

## Basic Validation

Validate a request using the user's API key:

```typescript theme={null}
import { Limitly } from '@limitly/limitly-nextjs';

const limitly = new Limitly({
  apiKey: process.env.LIMITLY_API_KEY!
});

// Validate a request
const result = await limitly.validation.validate(
  'user_api_key',
  '/api/users',
  'GET'
);

if (result.success) {
  console.log('Request allowed');
} else {
  console.log('Request denied:', result.error);
}
```

## API Route Integration

Integrate validation directly into your Next.js API routes:

```typescript theme={null}
// app/api/users/route.ts
import { Limitly } from '@limitly/limitly-nextjs';

const limitly = new Limitly({
  apiKey: process.env.LIMITLY_API_KEY!
});

export async function GET(request: Request) {
  const apiKey = request.headers.get('authorization')?.replace('Bearer ', '');
  
  if (!apiKey) {
    return Response.json({ error: 'API Key required' }, { status: 401 });
  }

  const result = await limitly.validation.validate(
    apiKey,
    new URL(request.url).pathname,
    request.method
  );

  if (!result.success) {
    return Response.json({
      error: 'Rate limit exceeded',
      details: result.details
    }, { status: 429 });
  }

  // Process the request
  return Response.json({ message: 'Success' });
}
```

## Validation Response

The validation method returns a detailed response:

```typescript theme={null}
interface ValidateRequestResponse {
  success: boolean;
  error?: string;
  details?: {
    limit: number;
    remaining: number;
    reset: number;
    retryAfter?: number;
  };
}
```

## Using withRateLimit Helper

The SDK provides a `withRateLimit` helper for easier integration:

```typescript theme={null}
// app/api/users/route.ts
import { Limitly } from '@limitly/limitly-nextjs';

const limitly = new Limitly({
  apiKey: process.env.LIMITLY_API_KEY!
});

async function handleGetUsers(request: Request) {
  // Your API logic here
  return Response.json({ users: [] });
}

// Wrap your handler with rate limiting
export const GET = limitly.withRateLimit(handleGetUsers);
```

## Custom Error Handling

Customize error responses for rate limit exceeded:

```typescript theme={null}
// app/api/users/route.ts
import { Limitly } from '@limitly/limitly-nextjs';

const limitly = new Limitly({
  apiKey: process.env.LIMITLY_API_KEY!
});

async function handleGetUsers(request: Request) {
  return Response.json({ users: [] });
}

export const GET = limitly.withRateLimit(handleGetUsers, {
  onRateLimitExceeded: (request: Request) => {
    return Response.json({
      error: 'Too many requests',
      message: 'Please try again later'
    }, { status: 429 });
  }
});
```

## Validation Options

You can pass additional options to the validation:

```typescript theme={null}
const result = await limitly.validation.validate(
  'user_api_key',
  '/api/users',
  'GET',
  {
    // Custom options
    timeout: 5000,
    retryAttempts: 3
  }
);
```

## Error Types

The SDK handles various error scenarios:

* **Invalid API Key**: Returns 401 Unauthorized
* **Rate Limit Exceeded**: Returns 429 Too Many Requests
* **Network Errors**: Returns 500 Internal Server Error
* **Validation Errors**: Returns 400 Bad Request

## Next Steps

* [Middleware](/sdk/nextjs/middleware) - Use built-in middleware for API routes
* [API Key Management](/sdk/nextjs/api-keys) - Manage API keys for your users
* [Plans](/sdk/nextjs/plans) - Configure usage plans
