nurbekjummayev / laravel-api-response-helpers
A Laravel package for standardized API responses
Package info
github.com/nurbekjummayev/laravel-api-response-helpers
pkg:composer/nurbekjummayev/laravel-api-response-helpers
Requires
- php: ^8.1
- illuminate/contracts: ^10 || ^11 || ^12 || ^13
- illuminate/http: ^10 || ^11 || ^12 || ^13
- spatie/laravel-package-tools: ^1.92.7
Requires (Dev)
- laravel/pint: ^1.14
- orchestra/testbench: ^8.0 || ^9.0 || ^10.0 || ^11.0
- pestphp/pest: ^2.0 || ^3.0 || ^4.0
README
A Laravel package for standardized API responses with helpful exceptions.
Installation
Install the package via composer:
composer require nurbekjummayev/laravel-api-response-helpers
Usage
Helper Functions
The package provides convenient helper functions for common HTTP responses:
Success Responses
// List with pagination public function index(Request $request) { $query = Product::query(); $data = $query->paginate($request->get('per_page', 10)); return okWithPaginateResponse($data); } // Show single resource public function show(int $id) { $model = Product::findOrFail($id); return okResponse($model); } // Create resource public function store(Request $request) { $model = Product::create($request->all()); return createdResponse($model); } // Update resource public function update(Request $request, int $id) { $model = Product::findOrFail($id); $model->update($request->all()); return okResponse($model); } // Delete resource public function destroy(int $id) { $model = Product::findOrFail($id); $model->delete(); return okResponse($model); }
Error Responses
// Validation error (422) $validator = Validator::make($request->all(), $rules); if ($validator->fails()) { return invalidData('Validation failed', ['errors' => $validator->errors()]); } // Not found (404) $model = Product::find($id); if (!$model) { return notFoundRequestResponse('Product not found'); } // Unauthorized (401) if (!auth()->check()) { return unauthorizedRequestResponse(); } // Forbidden (403) if (!auth()->user()->can('update', $model)) { return forbiddenRequestResponse('Access denied'); } // Bad request (400) if (!$request->has('required_field')) { return badRequestResponse('Missing required field'); } // Method not allowed (405) return methodNotAllowedRequestResponse(); // Payload too large (413) return postTooLargeResponse(); // Too many requests (429) return tooManyRequestsResponse(); // Server error (500) try { // Some operation } catch (\Exception $e) { return serverErrorResponse('Something went wrong'); } // Any custom status return errorResponse('Custom error', httpStatus: 418, errorMsg: 'TEAPOT');
Custom Response
return apiResponse( msg: 'Custom message', data: ['key' => 'value'], success: true, httpStatus: 200, errorMsg: null, extraData: ['meta' => ['version' => '1.0']] );
Exceptions
The package provides exception classes that automatically render as JSON responses:
use NurbekJummayev\ApiResponseHelper\Exceptions\NotFoundException; use NurbekJummayev\ApiResponseHelper\Exceptions\ForbiddenException; use NurbekJummayev\ApiResponseHelper\Exceptions\ValidationException; // Not Found Exception public function show(int $id) { $model = Product::find($id); if (!$model) { throw new NotFoundException('Product not found', ['product_id' => $id]); } return okResponse($model); } // Validation Exception public function store(Request $request) { $validator = Validator::make($request->all(), $rules); if ($validator->fails()) { throw new ValidationException( message: 'Validation failed', data: ['errors' => $validator->errors()] ); } $model = Product::create($request->all()); return createdResponse($model); } // Forbidden Exception public function update(Request $request, int $id) { $model = Product::findOrFail($id); if (!auth()->user()->can('update', $model)) { throw new ForbiddenException('You cannot update this product'); } $model->update($request->all()); return okResponse($model); }
Available Exceptions
ApiResponseException- Base exception classBadRequestException- 400UnauthorizedException- 401ForbiddenException- 403NotFoundException- 404MethodNotAllowedException- 405PostTooLargeException- 413ValidationException- 422TooManyRequestsException- 429ServerErrorException- 500
Note:
ValidationExceptionshares its short name with Laravel's ownIlluminate\Validation\ValidationException. If you need both in the same file, import this package's class with an alias:use NurbekJummayev\ApiResponseHelper\Exceptions\ValidationException as ApiValidationException;
Response Format
All responses follow a consistent structure:
Standard Response:
{
"msg": "Success message",
"error": null,
"success": true,
"data": {}
}
Paginated Response:
{
"msg": "OK",
"error": null,
"success": true,
"data": [
{
"id": 1,
"name": "Product 1"
},
{
"id": 2,
"name": "Product 2"
}
],
"meta": {
"current_page": 1,
"from": 1,
"last_page": 5,
"per_page": 15,
"to": 15,
"total": 75
}
}
okWithPaginateResponse() supports all three Laravel paginators:
paginate()— fullmetaas shown above.simplePaginate()—metawithcurrent_page,from,per_page,to,has_more(nototal/last_page).cursorPaginate()—metawithper_page,next_cursor,prev_cursor.
With Extra Data:
{
"msg": "Success",
"error": null,
"success": true,
"data": {},
"custom_key": "custom_value"
}
AI Support (Laravel Boost)
This package ships first-class AI support for Laravel Boost. When a project that uses Boost installs this package, the guidelines and an agent skill are discovered automatically.
What's included:
- Guideline —
resources/boost/guidelines/core.blade.php: a short, always-loaded overview of the response envelope and helpers. - Skill —
resources/boost/skills/api-response-helper/SKILL.md: the fullapi-response-helperskill, loaded on demand when an agent works on API responses.
In a consuming project that already has Boost installed:
composer require nurbekjummayev/laravel-api-response-helpers # Discover and publish this package's guidelines + skill php artisan boost:install # or, for an existing Boost setup: php artisan boost:update --discover
Boost then teaches the coding agent (Claude Code, Cursor, Copilot, etc.) to use okResponse(), okWithPaginateResponse(), the error helpers, and the renderable exceptions correctly. No configuration is required — discovery is based on the resources/boost/ directory.
Testing
composer test
Code Quality
# Format code composer format # Test coverage composer test-coverage
License
The MIT License (MIT). Please see License File for more information.