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:
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:
// 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:
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:
// 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:
// 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:
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