API design
This section gives you best practices for designing an API with clear naming conventions and data modeling strategies. Adhering to consistent conventions across your API ensures better maintainability, scalability, and ease of use for developers.
Principles
Consider following REST API principles.
Naming convention
Do use kebab-case for path.
- ❌ 
/bestPractices - ❌ 
/best_practices - ✅ 
/best-practices 
Do use snake_case or camelCase for query params, but be consistent.
- ❌ 
/users?first-name=Martin - ✅ 
/users?first_name=Martin - ✅ 
/users?firstName=Martin 
Consider using only resource names in path, not verbs.
- ❌ 
/getUsers, - ❌ 
/users/all - ❌ 
/users/delete - ✅ 
/userswithGETHTTP verb - ✅ 
/userswithDELETEHTTP verb 
The HTTP verb (GET, POST, ...) is already indicates the action to be performed.
It often happens that you don't have enough HTTP verbs to represent all the actions you can perform on the same resource in your application. In that case, you can safely break this rule and append the action name at the end of the path. Examples:
- A complex search request that requires a body can be turned into a POST request.
 - Additional domain-specific actions other than CRUD can also use the PUT method: validating, reviewing, submitting, ...
 
Do use plural forms for resources.
- ❌ 
GET /user - ✅ 
GET /users - ❌ 
GET /user/:id - ✅ 
GET /users/:id 
Do use the appropriate HTTP verb.
GETfor retrieving one or multiple resourcesPOSTfor creating a resource.PUTfor updating a resource.PATCHfor partially updating a resource.DELETEfor deleting a resource.
Do use path to reflect the hierarchical relationship between resources.
- ❌ 
GET /users?companyId=1 - ✅ 
GET /companies/1/users 
Data modeling
Consider defining a dedicated DTO for each endpoint rather than reusing the same one.
- Clarity: clearly indicates the expected input/output, making it easier for consumers.
 - Flexibilty: allow different structure of the same data.
 - Maintainability & evolutivity: future modifications on an endpoint will not break others.
 - Performance: Transfer only the required fields in responses, reducing bandwidth.
 
In some cases, you can safely reuse the same model in multiple endpoints to reduce redundancy. For example, when you need to reference an object in different DTOs using the exact same data structure,
you can create a shared DTO (see Company in example below).
Do prefix DTO names by the endpoint action (Create, Read, Update, Delete, Search, ...).
Do suffix DTO names by either Request or Response.
// In this example you need to mark almost every field as optional to match all use cases.
interface User {
  id?: number;
  name: string;
  age?: number;
  company?: Company;
}
// Read DTO is complete and all fields can be marked as required.
interface ReadUserResponse {
  id: number;
  name: string;
  age: number;
  company: Company;
}
// Create DTO does not have an id yet and only company's id is needed.
interface CreateUserRequest {
  name: string;
  age: number;
  companyId: number;
}
// Search DTO can be lighter with only id and name.
interface SearchUserResponse {
  id: number;
  name: string;
}
Response codes
Do use the appropriate HTTP response code.
Successful responses
Do use 2XX HTTP codes for successful responses, the most common are:
200 OKwhen the request was successfully processed.201 Createdwhen a resource was successfully created.202 Acceptedwhen an action has been queued for execution.204 No Contentwhen an action was successfully completed but did not return any content.206 Partially Returnedwhen only part of the collection is returned or the resource is incomplete.
Client error responses
Do use 4XX HTTP codes for client-side errors, the most common are:
400 Bad Requestwhen the request is malformed or violates business rules.401 Unauthorizedwhen the client's authentication is invalid.403 Forbiddenwhen the authentication is valid, but the client does not have permission to access the resource.404 Not Foundwhen the requested resource could not be found.404 Method Not Allowedwhen the action requested by the HTTP verb cannot be performed on the specified resource.409 Conflictwhen there is a version mismatch between the client and the server for the resource.
Server error responses
Do use 5XX HTTP codes for server-side errors, the most common are:
500 Internal Server Errorwhen an unexpected, not anticipated server error occurs.501 Not Implementedwhen a feature is not implemented yet.503 Service Unavailablewhen the server is unable to respond.504 Gateway Timeoutthe server takes too long to respond.