레오나르드 리차드슨(Leonard Richardson)은 REST API를 잘 적용하기 위한 4단계 모델을 만들었다.
이 모델의 2단계 까지만 적용해도 좋은 API 디자인이라고 볼 수 있고, 이런 경우를 HTTP API 라고 부른다.

0단계에서는 리소스 구분 없이 단순히 HTTP 프로토콜을 사용하기만 한다.
하나의 엔드포인트만 사용해서 HTTP Method도 POST만 사용한다.
따라서 서로 다른 매개변수를 통해서 여러 동작을 하게 된다.
이 단계에서는 해당 API를 REST API라고 할 수 없으며, REST API를 작성하기 위한 기본 단계하고 볼 수 있다.
POST /api/student
{
  "function": "getStudent",
  "arguments" [
    "1"
  ]
}HTTP/1.1 200 OK
{
  "result" {
    "id": "1"
    "name": "sangbin",
  }
}CREATE : POST /api/student
READ :   POST /api/student
UPDATE : POST /api/student
DELETE : POST /api/student1단계에서는 리소스 개념을 도입한다. 모든 요청을 하나의 엔드포인트로 보내는 것이 아닌, 각기 다른 엔드포인트로 구분하여 개별 리소스와 통신한다.
또한, 요청에 따른 응답으로 리소스에 대한 정보와 함께 리소스 사용에 대한 성공/실패 여부를 반환해야 한다.
POST /api/student/create
{
  "name': "sangbin"
}HTTP/1.1 200 OK
{
  "result" : "이미 있습니다."
}CREATE : POST /api/student/create
READ :   POST /api/student/1
UPDATE : POST /api/student/update
DELETE : POST /api/student/remove/12단계에서는 CRUD에 맞게 적절한 HTTP Method를 사용하는 것에 중점을 둔다.
또한, Response에는 의미있는 HTTP Status Code가 반환된다.
성숙도 모델의 2단계까지 적용하면 대체적으로 잘 작성된 API라고 한다.
PUT /api/student/create
{
  "name': "sangbin"
}HTTP/1.1 201 Created
Content-Type: application/json
{
  "result" {
    "id": "1",
    "name": "sangbin"
  }
}CREATE : POST /api/student
READ :   GET /api/student/1
UPDATE : PUT /api/student/1
DELETE : DELETE /api/student/13단계의 요청은 2단계와 동일하지만, 응답에 리소스의 URI를 포함한 링크 요소를 삽입한다.
응답에 들어가게 되는 링크 요소는 응답을 받은 다음에 할 수 있는 다양한 액션들을 위해 많은 하이퍼미디어 컨트롤을 포함한다.
GET /api/student/1
HTTP/1.1 200 OK
Content-Type: application/json
{
 "result" {
    "id": "1",
    "name": "sangbin",
    "nextActions": {
       "/api/users/{studentId}/roles",
     }
  }
}