API Standards

RESTful Conventions

Follow RESTful principles for API design. Use resourceful routes and controllers, and standard HTTP methods:

  • GET: Retrieve resources
  • POST: Create resources
  • PUT/PATCH: Update resources
  • DELETE: Remove resources

Example:

Route::apiResource('users', UserController::class);
  • Use singular resource names in controllers (e.g., UserController).
  • Use plural resource names in routes (e.g., /users).

Status Codes

Return appropriate HTTP status codes for all API responses:

  • 200 OK: Successful GET or PUT/PATCH
  • 201 Created: Successful POST
  • 204 No Content: Successful DELETE
  • 400 Bad Request: Invalid input
  • 401 Unauthorized: Authentication required
  • 403 Forbidden: Insufficient permissions
  • 404 Not Found: Resource not found
  • 422 Unprocessable Entity: Validation errors
  • 500 Internal Server Error: Unexpected errors

Example:

return response()->json(['message' => 'User created'], 201);

Versioning

Prefix API routes with a version number to allow for future changes without breaking clients.

Route::prefix('v1')->group(function () {
    Route::apiResource('users', UserController::class);
});

Pagination, Filtering, Sorting

Support pagination, filtering, and sorting for endpoints that return collections.

  • Use query parameters: ?page=2&per_page=10&sort=name&filter[active]=1
  • Return pagination metadata in the response.

Example:

public function index(Request $request) {
    $users = User::where('active', 1)->paginate(10);
    return UserResource::collection($users);
}

API Resources

Use Laravel API Resource classes for consistent, structured JSON responses.

  • Transform data using Resource classes (e.g., UserResource).
  • Hide sensitive fields and format output as needed.

Example:

class UserResource extends JsonResource {
    public function toArray($request) {
        return [
            'id' => $this->id,
            'name' => $this->name,
            'email' => $this->email,
        ];
    }
}

Error Responses

Return structured error responses with a message, code, and optional details.

return response()->json([
    'error' => [
        'message' => 'Validation failed',
        'code' => 422,
        'details' => $validator->errors(),
    ]
], 422);

Best Practices

  • Document all API endpoints and request/response formats.
  • Use authentication (e.g., Sanctum) for protected endpoints.
  • Validate all input and return clear error messages.
  • Use consistent naming and structure for all endpoints.
  • Avoid exposing internal implementation details in API responses.