Back to Portfolio
REST API Architecture • Reusable Boilerplate

Laravel API Routes & Response Helpers

A clean, standardized API response pattern and versioned routing architecture built for production Laravel applications. Click any code card to quickly copy and drop directly into your projects.

1

Reusable Response Functions

Consistent successRes() and errorRes() response helpers for controllers or traits.

app/Traits/ApiResponse.php (or Base Controller)
PHP • Trait / Controller
/**
 * Standardized Success Response
 *
 * @param int|null $statusCode
 * @param string|null $message
 * @param mixed $data
 * @return \Illuminate\Http\JsonResponse
 */
public function successRes($statusCode = 200, $message = null, $data = null)
{
    return response()->json([
        'success'    => true,
        'statusCode' => $statusCode,
        'message'    => $message,
        'data'       => $data,
    ], $statusCode);
}

/**
 * Standardized Error Response
 *
 * @param int|null $statusCode
 * @param string|null $message
 * @param mixed $data
 * @return \Illuminate\Http\JsonResponse
 */
public function errorRes($statusCode = 400, $message = null, $data = null)
{
    return response()->json([
        'success'    => false,
        'statusCode' => $statusCode,
        'message'    => $message,
        'data'       => $data,
    ], $statusCode);
}
2

Structured API Routes

Clean versioned routing structure under v1 with public auth and protected resource groups.

routes/api.php
Laravel 11 & 12 • Routes
<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\Api\V1\AuthController;
use App\Http\Controllers\Api\V1\UserController;

/*
|--------------------------------------------------------------------------
| API Routes — Version 1 (v1)
|--------------------------------------------------------------------------
| Base URL: /api/v1/...
*/

Route::prefix('v1')->group(function () {

    // ==========================================
    // Public Authentication Endpoints
    // ==========================================
    Route::prefix('auth')->group(function () {
        Route::post('register', [AuthController::class, 'register']);
        Route::post('login', [AuthController::class, 'login']);
        Route::post('forgot-password', [AuthController::class, 'forgotPassword']);
        Route::post('reset-password', [AuthController::class, 'resetPassword']);
    });

    // ==========================================
    // Protected API Endpoints (Auth: Sanctum)
    // ==========================================
    Route::middleware('auth:sanctum')->group(function () {

        // Authenticated Session Actions
        Route::prefix('auth')->group(function () {
            Route::get('me', [AuthController::class, 'me']);
            Route::post('logout', [AuthController::class, 'logout']);
            Route::post('refresh', [AuthController::class, 'refresh']);
        });

        // User Account Management
        Route::prefix('user')->group(function () {
            Route::get('profile', [UserController::class, 'profile']);
            Route::put('profile', [UserController::class, 'updateProfile']);
            Route::put('change-password', [UserController::class, 'changePassword']);
        });

    });

});
3

Controller Implementation Example

See how successRes() and errorRes() are called in AuthController.php.

app/Http/Controllers/Api/V1/AuthController.php
AuthController
<?php

namespace App\Http\Controllers\Api\V1;

use App\Http\Controllers\Controller;
use App\Traits\ApiResponse;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;

class AuthController extends Controller
{
    use ApiResponse; // Imports successRes() and errorRes()

    /**
     * User Registration
     */
    public function register(Request $request)
    {
        $validator = Validator::make($request->all(), [
            'name'     => 'required|string|max:255',
            'email'    => 'required|string|email|max:255|unique:users',
            'password' => 'required|string|min:8|confirmed',
        ]);

        if ($validator->fails()) {
            return $this->errorRes(422, 'Validation failed.', $validator->errors());
        }

        $user = User::create([
            'name'     => $request->name,
            'email'    => $request->email,
            'password' => Hash::make($request->password),
        ]);

        $token = $user->createToken('auth_token')->plainTextToken;

        return $this->successRes(201, 'User registered successfully.', [
            'user'  => $user,
            'token' => $token,
        ]);
    }

    /**
     * User Login
     */
    public function login(Request $request)
    {
        $credentials = $request->only('email', 'password');

        if (!Auth::attempt($credentials)) {
            return $this->errorRes(401, 'Invalid credentials provided.');
        }

        $user  = Auth::user();
        $token = $user->createToken('auth_token')->plainTextToken;

        return $this->successRes(200, 'Login successful.', [
            'user'  => $user,
            'token' => $token,
        ]);
    }

    /**
     * User Profile (Current Authenticated User)
     */
    public function me(Request $request)
    {
        return $this->successRes(200, 'Profile retrieved successfully.', $request->user());
    }

    /**
     * User Logout (Revoke Token)
     */
    public function logout(Request $request)
    {
        $request->user()->currentAccessToken()->delete();

        return $this->successRes(200, 'User logged out successfully.');
    }
}
4

Standard JSON Response Payload

Predictable response schema for frontend frameworks (React, Inertia, Vue, Mobile apps).

200 / 201 Success Response
{
  "success": true,
  "statusCode": 200,
  "message": "Login successful.",
  "data": {
    "user": {
      "id": 1,
      "name": "Shivanshu Kamboj",
      "email": "user@example.com"
    },
    "token": "1|ql34oYkK8Vq..."
  }
}
400 / 401 / 422 Error Response
{
  "success": false,
  "statusCode": 401,
  "message": "Invalid credentials provided.",
  "data": null
}

Need a Custom Laravel API Architecture?

Experienced with OAuth, Sanctum, JWT, Webhooks, Stripe Connect & High-Throughput Microservices. Available for senior backend roles & consulting.