2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								# Custom data response
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-22 13:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In this guide we will see how you can customize your API's response.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Introduction
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								To be able to update the default data response you have first to understand how it works.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-29 23:08:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								When you create a content type, it generates an API with the following list of [endpoints ](../content-api/api-endpoints.md ).
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-02-29 23:08:49 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Each of these endpoint triggers a controller action. Here is the list of [controller actions ](../concepts/controllers.md ) that exist by default when a content type is created.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-26 11:21:19 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								If you check the controller file of your generated API `./api/{content-type}/controller/{Content-Type}.js` , you will see an empty file. It is because all the default logic is managed by Strapi. But you can override these actions with your own code.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								And that is what we will do to manage our custom data response.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Example
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-22 13:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In our example we will use a restaurant type with a chef. By default when you fetch restaurants, you will get all information for the chef.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-26 11:18:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								Let's consider you don't want to expose the chef's email for privacy reasons.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-26 11:18:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								To enforce this rule we will customize the action that fetchs all restaurants and remove the email from the returned data.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-26 11:18:39 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								To follow the example your will have to create a content type `restaurant`  and add the following field definition:
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  `string`  attribute named `name`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  `text`  attribute named `description`  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								-  `relation`  attribute **Restaurant**  (`chef` ) - **User**  has many **Restaurants**  - **Users**  (`restaurants` ) 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Then add some data.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Override controller action
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								To customize the function that fetch all our restaurants we will have to override the `find`  function.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								First, to see the difference, let's request `GET /restaurants` . You will see all the data you created.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								Now let's start the customization.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Path —** `./api/restaurant/controller/Restaurant.js` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module.exports = {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  async find() {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return 'strapi';
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								After saving the new function, let's restart the `GET /restaurants`  request. We will see `strapi`  as response.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Get the data back
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								We now know the function we have to update, but we just want to customize the returned restaurant values.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-25 19:16:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								In the [controller documentation ](../concepts/controllers.html#extending-a-model-controller ) you will find the default implementation of every actions. It will help you overwrite the fetch logic.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Path —** `./api/restaurant/controller/Restaurant.js` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const { sanitizeEntity } = require('strapi-utils');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module.exports = {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  async find(ctx) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let entities;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (ctx.query._q) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      entities = await strapi.services.restaurant.search(ctx.query);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } else {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      entities = await strapi.services.restaurant.find(ctx.query);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-04 09:32:13 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    return entities.map(entity => sanitizeEntity(entity, { model: strapi.models.restaurant }));
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								  },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								And now the data is back on `GET /restaurants` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								## Apply our changes
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-11-25 19:16:42 +01:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								We can see the `find`  function returns the result of the `map` . And the map function just sanitizes all entries.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-22 13:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								So instead of just returning the sanitized entry, we will also remove the chef email of each restaurant.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								**Path —** `./api/restaurant/controller/Restaurant.js` 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```js
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const { sanitizeEntity } = require('strapi-utils');
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								module.exports = {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  async find(ctx) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let entities;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (ctx.query._q) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      entities = await strapi.services.restaurant.search(ctx.query);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    } else {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      entities = await strapi.services.restaurant.find(ctx.query);
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    return entities.map(entity => {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      const restaurant = sanitizeEntity(entity, {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        model: strapi.models.restaurant,
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      if (restaurant.chef & &  restaurant.chef.email) {
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        delete restaurant.chef.email;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								      return restaurant;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    });
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								  },
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								};
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								```
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2020-03-22 13:28:03 -04:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								And tada! The email disappeared.
							 
						 
					
						
							
								
									
										
										
										
											2019-11-21 16:39:42 +01:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								::: tip
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								This guide can be applied to any other controller action.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								:::