laravel-api

SkillSecurity

Use when creating API endpoints, transforming responses with API Resources, or handling API authentication, rate limiting, or versioning.

Available today. Use it from your connected AI after setup.

Connect ahel once, and every AI you use reads what you have installed.

Then ask your AI: use the laravel-api skill

What this skill tells your AI

The instructions your AI receives, as published by fusengine/agents in plugins/laravel-expert/skills/laravel-api/SKILL.md and read by ahel’s review.

Laravel API Development

Agent Workflow (MANDATORY)

Before ANY implementation, spawn 3 agents in parallel, one Agent call each with a name:

  1. fuse-ai-pilot:explore-codebase - Analyze existing API patterns
  2. fuse-ai-pilot:research-expert - Verify Laravel API docs via Context7
  3. mcp__context7__query-docs - Check API Resources and Sanctum patterns

After implementation, run fuse-ai-pilot:sniper for validation.


Overview

Build RESTful APIs with Laravel using API Resources for response transformation and Sanctum for authentication.

ComponentPurpose
ControllersHandle requests, delegate to services
Form RequestsValidate input, authorize actions
API ResourcesTransform models to JSON
MiddlewareAuth, rate limiting, CORS
RoutesVersioned endpoints with groups
PaginationOffset/cursor pagination
HTTP ClientConsume external APIs

Critical Rules

  1. Always use API Resources - Never return Eloquent models directly
  2. Versioned routes - Prefix with /v1/, /v2/
  3. Validate all input - Use Form Requests, not inline validation
  4. Rate limiting - Configure per-route limits
  5. Consistent responses - Same structure, proper status codes
  6. Use services - Keep controllers thin
  7. Eager load - Prevent N+1 with with() before pagination

Reference Guide

Core Concepts

TopicReferenceWhen to consult
Routingrouting.mdDefining versioned API routes
Controllerscontrollers.mdController patterns, resource methods
Middlewaremiddleware.mdRoute protection, request filtering
Validationvalidation.mdForm Requests, validation rules

Request/Response

TopicReferenceWhen to consult
Requestsrequests.mdAccessing input, files, headers
Responsesresponses.mdAPI Resources, status codes
Paginationpagination.mdOffset/cursor pagination

Advanced

TopicReferenceWhen to consult
Rate Limitingrate-limiting.mdThrottle configuration
HTTP Clienthttp-client.mdConsuming external APIs
URLsurls.mdURL generation, signed URLs
Stringsstrings.mdString helpers, UUIDs, slugs
Redirectsredirects.mdRedirect responses

Templates (Code Examples)

Controllers & Routes
TemplatePurpose
ApiController.php.mdComplete CRUD controller with service
api-routes.mdVersioned routes with middleware
routing-examples.mdDetailed routing patterns
Validation & Resources
TemplatePurpose
FormRequest.php.mdStore/Update Form Requests
validation-rules.mdAll validation rules reference
ApiResource.php.mdResource with relationships
External APIs
TemplatePurpose
HttpClientService.php.mdReusable HTTP client service

Quick Reference

Resource Response

return PostResource::collection($posts);
return PostResource::make($post);

Status Codes

return PostResource::make($post)->response()->setStatusCode(201);
return response()->json(null, 204);

Form Request

public function store(StorePostRequest $request): JsonResponse
{
    $post = $this->service->create($request->validated());
    return PostResource::make($post)->response()->setStatusCode(201);
}

Rate Limiting

Route::middleware('throttle:60,1')->group(fn () => ...);

Versioned Routes

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

Pagination

return PostResource::collection(Post::paginate(15));

Feature Matrix

FeatureStatusReference
RESTful Controllerscontrollers.md
API Resourcesresponses.md
Form Request Validationvalidation.md
Route Versioningrouting.md
Route Model Bindingrouting.md
Middlewaremiddleware.md
Rate Limitingrate-limiting.md
Paginationpagination.md
Cursor Paginationpagination.md
HTTP Clienthttp-client.md
Signed URLsurls.md
JSON Responsesresponses.md

Laravel 13 Notes

Attributes pour API Resources

Laravel 13 introduit #[Collects] et #[PreserveKeys] pour configurer les ResourceCollections via attributs PHP.

use Illuminate\Http\Resources\Json\ResourceCollection;
use Illuminate\Http\Resources\Attributes\Collects;
use Illuminate\Http\Resources\Attributes\PreserveKeys;

#[Collects(PostResource::class)]
#[PreserveKeys]
final class PostCollection extends ResourceCollection {}

JSON:API compliance

Pour les APIs JSON:API (sparse fieldsets, inclusion, links), voir [[laravel-jsonapi]] qui couvre ?include=, ?fields[type]=, et la pagination conforme spec.

Best Practices

DO

  • Utiliser API Resources (JsonResource) pour toute réponse JSON publique
  • Versionner via URL (/api/v1) plutôt que via header (lisible, cacheable)
  • Rate-limiter par utilisateur ET par IP (throttle:60,1 + custom limiter)
  • Documenter via OpenAPI/Scribe avant de coder l'endpoint
  • Préférer cursor() pagination pour grandes listes (stable, performant)

DON'T

  • Retourner directement un Model Eloquent (fuite de colonnes sensibles)
  • Mélanger statuts HTTP (toujours 422 pour validation, 401 vs 403)
  • Skip Form Request validation (jamais valider en controller)
  • Exposer les IDs auto-increment publiquement (préférer UUID/ULID)
  • Oublier PreventRequestForgery exemption pour les webhooks externes

Signals

GitHub stars
25
Forks
4
Last commit
Sep 2026
Advanced
Catalog kind
skill
Gateway key
laravel-api
Source
github.com/fusengine/agents