API Standards
Response Envelope
typescript
// All successful responses follow this format
interface SuccessResponse<T> {
success: true;
data: T;
meta?: {
pagination?: PaginationMeta;
[key: string]: unknown;
};
}
interface PaginationMeta {
total: number;
page: number;
pageSize: number;
totalPages: number;
hasNext: boolean;
hasPrevious: boolean;
}Examples
Single item
json
{
"success": true,
"data": {
"id": "uuid",
"email": "user@example.com"
}
}List with pagination
json
{
"success": true,
"data": [
{ "id": "uuid1", "name": "Product 1" },
{ "id": "uuid2", "name": "Product 2" }
],
"meta": {
"pagination": {
"total": 100,
"page": 1,
"pageSize": 20,
"totalPages": 5,
"hasNext": true,
"hasPrevious": false
}
}
}Pagination
typescript
// Offset pagination with query params: ?page=1&pageSize=20
interface PaginationQuery {
page?: number; // Default: 1, min: 1
pageSize?: number; // Default: 20, max: 100
}
// Controller usage
@Get()
async findAll(
@Query() pagination: PaginationQuery,
): Promise<SuccessResponse<Product[]>> {
const { page = 1, pageSize = 20 } = pagination;
const result = await this.productService.findAll({ page, pageSize });
return {
success: true,
data: result.items,
meta: { pagination: result.pagination },
};
}Filtering and Sorting
typescript
// Query params for filtering
// GET /api/v1/products?status=ACTIVE&categoryId=uuid&minPrice=100&maxPrice=500
// Query params for sorting
// GET /api/v1/products?sortBy=price&sortOrder=asc
interface ProductFilterQuery {
status?: ProductStatus;
categoryId?: string;
minPrice?: number;
maxPrice?: number;
search?: string; // Full-text search on name/description
sortBy?: "price" | "name" | "createdAt";
sortOrder?: "asc" | "desc";
}API Versioning
/api/v1/... ← Current version
Future:
/api/v2/... ← Major breaking changes onlyStrategy: URL-based versioning (simplest). Only create v2 when breaking changes are unavoidable.
API Documentation (Scalar)
Interactive API documentation using Scalar — a modern alternative to Swagger UI with better UX, dark mode, and faster rendering.
Installation
bash
npm install @nestjs/swagger @scalar/nestjs-api-referenceSetup
typescript
// main.ts
import { DocumentBuilder, SwaggerModule } from "@nestjs/swagger";
import { apiReference } from "@scalar/nestjs-api-reference";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
// OpenAPI specification
const config = new DocumentBuilder()
.setTitle("IWM Platform API")
.setDescription("MLM Platform with Investment and Product Marketplaces")
.setVersion("1.0")
.addBearerAuth()
.addTag("auth", "Authentication endpoints")
.addTag("users", "User management")
.addTag("mlm", "MLM/Partner operations")
.addTag("products", "E-commerce products")
.addTag("orders", "Order management")
.addTag("investments", "Investment operations")
.build();
const document = SwaggerModule.createDocument(app, config);
// Scalar UI at /api/docs (replaces Swagger UI)
app.use(
"/api/docs",
apiReference({
spec: { content: document },
theme: "purple", // or 'default', 'moon', 'mars'
}),
);
// Optional: JSON spec endpoint for external tools
app.use("/api/docs/openapi.json", (req, res) => res.json(document));
await app.listen(3000);
}Features
| Feature | Description |
|---|---|
| Try It | Interactive request builder with auth support |
| Search | Full-text search across all endpoints |
| Dark Mode | Built-in theme switching |
| Code Samples | Auto-generated examples in multiple languages |
| OpenAPI 3.1 | Full specification support |
Access
- Interactive Docs:
http://localhost:3000/api/docs - OpenAPI JSON:
http://localhost:3000/api/docs/openapi.json