🎯

rest-api-design

🎯Skill

from emvnuel/skill.md

VibeIndex|
What it does

Designs consistent REST APIs with best practices for endpoint naming, HTTP methods, status codes, and OpenAPI documentation using MicroProfile annotations.

πŸ“¦

Part of

emvnuel/skill.md(8 items)

rest-api-design

Installation

πŸ“‹ No install commands found in docs. Showing default command. Check GitHub for actual instructions.
Quick InstallInstall with npx
npx skills add emvnuel/skill.md --skill rest-api-design
2Installs
-
AddedFeb 4, 2026

Skill Details

SKILL.md

REST API design patterns and MicroProfile OpenAPI documentation. Use when designing endpoints, choosing HTTP methods, status codes, or documenting APIs with OpenAPI annotations.

Overview

# REST API Design Best Practices

Design consistent, intuitive REST APIs with proper documentation.

---

Endpoint Design Rules

Use Nouns, Not Verbs

```java

// ❌ Bad

@GET @Path("/getUsers")

@POST @Path("/createUser")

// βœ“ Good

@GET @Path("/users")

@POST @Path("/users")

```

Use Plural Nouns for Collections

```java

@Path("/users") // Collection

@Path("/users/{id}") // Single resource

@Path("/orders") // Collection

@Path("/orders/{id}") // Single resource

```

Nest Related Resources (Max 3 Levels)

```java

@Path("/users/{userId}/orders") // User's orders

@Path("/users/{userId}/orders/{orderId}") // Specific order

@Path("/posts/{postId}/comments") // Post's comments

```

Cookbook: [endpoint-design.md](./cookbook/endpoint-design.md)

---

HTTP Methods

| Method | Purpose | Idempotent | Request Body |

| -------- | ---------------- | ---------- | ------------ |

| GET | Retrieve | Yes | No |

| POST | Create | No | Yes |

| PUT | Replace entirely | Yes | Yes |

| PATCH | Partial update | Yes | Yes |

| DELETE | Remove | Yes | No |

Cookbook: [http-methods.md](./cookbook/http-methods.md)

---

Status Codes

| Code | Meaning | When to Use |

| ---- | -------------------- | -------------------------- |

| 200 | OK | Successful GET, PUT, PATCH |

| 201 | Created | Successful POST |

| 204 | No Content | Successful DELETE |

| 400 | Bad Request | Validation errors |

| 401 | Unauthorized | Missing/invalid auth |

| 403 | Forbidden | Insufficient permissions |

| 404 | Not Found | Resource doesn't exist |

| 422 | Unprocessable Entity | Business rule violation |

| 500 | Internal Error | Unexpected server error |

Cookbook: [status-codes.md](./cookbook/status-codes.md)

---

Filtering & Pagination

```java

@GET

@Path("/products")

public List list(

@QueryParam("category") String category,

@QueryParam("minPrice") BigDecimal minPrice,

@QueryParam("sort") @DefaultValue("name") String sort,

@QueryParam("page") @DefaultValue("0") int page,

@QueryParam("size") @DefaultValue("20") int size

) { }

```

Cookbook: [filtering-pagination.md](./cookbook/filtering-pagination.md)

---

API Versioning

```java

// URL path versioning (recommended)

@Path("/v1/users")

public class UserResourceV1 { }

@Path("/v2/users")

public class UserResourceV2 { }

```

Cookbook: [versioning.md](./cookbook/versioning.md)

---

MicroProfile OpenAPI Documentation

```java

@Path("/users")

@Tag(name = "Users", description = "User management")

public class UserResource {

@GET

@Path("/{id}")

@Operation(summary = "Get user by ID")

@APIResponse(responseCode = "200", description = "User found")

@APIResponse(responseCode = "404", description = "User not found")

public User getById(@PathParam("id") Long id) { }

}

```

Cookbook: [openapi-documentation.md](./cookbook/openapi-documentation.md)

---

Cookbook Index

Design: [Endpoint Design](./cookbook/endpoint-design.md) Β· [HTTP Methods](./cookbook/http-methods.md)

Responses: [Status Codes](./cookbook/status-codes.md)

Querying: [Filtering & Pagination](./cookbook/filtering-pagination.md)

Evolving: [Versioning](./cookbook/versioning.md)

Documentation: [OpenAPI Documentation](./cookbook/openapi-documentation.md)