3.6.11. Retrieve Custom Links from Medusa's API Route

In this chapter, you'll learn how to retrieve custom data models linked to existing Medusa data models from Medusa's API routes.

Why Retrieve Custom Linked Data Models?#

Often, you'll link custom data models to existing Medusa data models to implement custom features or expand on existing ones.

For example, to add brands for products, you can create a Brand data model in a Brand Module, then define a link to the Product Module's Product data model.

When you implement this customization, you might need to retrieve the brand of a product using the existing Get Product API Route. You can do this by passing the linked data model's name in the fields query parameter of the API route.


How to Retrieve Custom Linked Data Models Using fields?#

Most of Medusa's API routes accept a fields query parameter that allows you to specify the fields and relations to retrieve in the resource, such as a product.

For example, to retrieve the brand of a product, you can pass the brand field in the fields query parameter of the Get Product API Route:

Code
1curl 'http://localhost:9000/admin/products/{id}?fields=*brand' \2-H 'Authorization: Bearer {access_token}'

The fields query parameter accepts a comma-separated list of fields and relations to retrieve. To learn more about using the fields query parameter, refer to the API Reference.

By prefixing brand with an asterisk (*), you retrieve all the default fields of the product, including the brand field. If you don't include the * prefix, the response will only include the product's brand.


API Routes that Restrict Retrievable Fields#

Some of Medusa's API routes restrict the fields and relations you can retrieve, which means you can't pass your custom linked data models in the fields query parameter. Medusa makes this restriction to ensure the API routes are performant and secure.

The API routes that restrict the fields and relations you can retrieve are:

How to Override Allowed Fields and Relations#

For these routes, you need to override the allowed fields and relations to be retrieved. You can do this by adding a middleware to those routes.

For example, to allow retrieving the b2b_company of a customer using the Get Customer Admin API Route, create the file src/api/middlewares.ts with the following content:

Note: Learn how to create a middleware in the Middlewares chapter.
src/api/middlewares.ts
1import { defineMiddlewares } from "@medusajs/medusa";2
3export default defineMiddlewares({4  routes: [5    {6      matcher: "/store/customers/me",7      method: "GET",8      middlewares: [9        (req, res, next) => {10          req.allowed?.push("b2b_company");11          next();12        },13      ],14    },15  ],16});

In this example, you apply a middleware to the Get Customer Admin API Route.

The request object passed to middlewares has an allowed property that contains the fields and relations that can be retrieved. So, you modify the allowed array to include the b2b_company field.

You can now retrieve the b2b_company field using the fields query parameter of the Get Customer Admin API Route:

Code
1curl 'http://localhost:9000/admin/customers/{id}?fields=*b2b_company' \2-H 'Authorization: Bearer {access_token}'

In this example, you retrieve the b2b_company relation of the customer using the fields query parameter.

Was this chapter helpful?
Ask Anything
FAQ
What is Medusa?
How can I create a module?
How can I create a data model?
How do I create a workflow?
How can I extend a data model in the Product Module?
Recipes
How do I build a marketplace with Medusa?
How do I build digital products with Medusa?
How do I build subscription-based purchases with Medusa?
What other recipes are available in the Medusa documentation?
Chat is cleared on refresh
Line break