Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validation responses in REST API

I'm designing a RESTful API and wondering what's the best format for validation error messages.

For example, my account creation endpoint accepts a JSON object:

user: {
  first_name: string,
  last_name: string,
  address: {
    street: string,
    city: string,
    zip_code: string
  }
}

My responses will be in the following format:

{
    code: 400,  // HTTP code
    message: "Validation failed",  // general message
    type: "validation_failed",  // there are other types of errors as well
    errors: WHAT_DO_I_SHOW_HERE
}

I have several choices for validation error messages:

Format 1

errors: {
  last_name: "First name is required",
  address: {
    zip_code: "ZIP code is invalid"
  }
}

or flatten the errors as in Format 2

errors: {
  last_name: "First name is required",
  "address.city": "City is required",
  "address.zip_code": "ZIP code is invalid"
}

or use an array, where each element can have field name, error code, error message, nested errors, etc.

errors: [
  {
    field: "first_name",
    message: "First name is required",
  },
  {
    field: "address",
    errors: [
      {
        field: "zip_code",
        message: "ZIP code is invalid"
      }
    ]
  }
]

or

errors: [
  {
    field: "first_name",
    message: "First name is required",
  },
  {
    field: "address.zip_code",
    message: "ZIP code is invalid"
  }
]

Apparently the array format is more flexible since field name is optional, so it can accommodate errors related to a combination of multiple fields (e.g., end time of a time interval must be after the begin time). But my question is, which one would be easier for API users to consume?

like image 270
sean hawk Avatar asked Oct 15 '25 17:10

sean hawk


1 Answers

I would prefer having an errors response as an array to an object. An error array can represent multiple errors per one field.

errors: [
    {
        field: "name",
        message: "name should be at least 4 characters"
    },
    {
        field: "name",
        message: "name should not begin with a dollar sign ($)"
    },
    {
        // other fields
    }
]

For a nested field, I would represent it as array of string.

errors: [
  {
    field: ["address", "zip_code"],
    message: "ZIP code is invalid"
  }
]
like image 85
Sithideth Bouasavanh Avatar answered Oct 18 '25 06:10

Sithideth Bouasavanh