Modify requests and responses

This is for:

Developer

For advanced use cases such as modifying request bodies with custom parameters or logging data to third parties, you may want to modify requests before Headless sends them to the Coveo APIs, or you may want to modify responses before Headless controllers use them. This article explains how to do so.

Modify Requests

To modify requests sent to the Coveo Search or Usage Analytics APIs, use the preprocessRequest method of the target engine configuration (see search, recommendation or product recommendation, depending on your use case).

const engine = buildSearchEngine({
  configuration: {
    // ...
    preprocessRequest: (request, clientOrigin, metadata) => { 1
      if (metadata?.method === 'search' && clientOrigin === 'searchApiFetch') {
        const body = JSON.parse(request.body);
        // E.g., modify facet requests
        // body.facets = [...];
        request.body = JSON.stringify(body);
      }

      if (clientOrigin === 'analyticsFetch') {
        // E.g., send data to a third party
      }

      return request;
    },
  },
});
1 Initialize the function with its parameters:
  • request: The HTTP request sent to Coveo. See preprocess-request.ts.

  • clientOrigin: The origin of the request. See preprocess-request.ts.

  • metadata: Optional metadata consisting of two properties:

    • method: The method called on the client.

    • origin: The origin of the client that helps to distinguish between features while using the same method.

Modify Responses

If you’re using the search engine, you can leverage the search configuration options to modify Search API responses before Headless controllers use them. Use the preprocessSearchResponseMiddleware, preprocessFacetSearchMiddleware or preprocessQuerySuggestResponseMiddleware method, depending on the target endpoint.

const engine = buildSearchEngine({
  configuration: {
    // ...
    search: {
      preprocessSearchResponseMiddleware: (response) => {
        response.body.results.forEach((result) => {
          // E.g., modify the result object
          return result;
        });
        return response;
      },
      preprocessFacetSearchResponseMiddleware: (response) => response,
      preprocessQuerySuggestResponseMiddleware: (response) => response,
    },
  },
});