This is the official documentation of the @forestadmin/agent Node.js agent.

When relationships are defined during the customization step, Forest Admin Collections act as if the 2 Collections were natively linked at the data source level.

You may have noticed that relationships within a data source are configured out of the box, so you won't need to define those.

However, you may want to create additional intra and cross data source relationships to:

  • help users navigate within your admin panel,

  • create charts that use data from multiple data sources,

  • let users filter, use scopes, or segment with conditions that cross data source boundaries.

Minimal example

agent.customizeCollection('towns', collection =>
    // Towns belong to 1 country
    .addManyToOneRelation('country', 'countries', { foreignKey: 'country_id' })

    // Towns have 1 mayor
    .addOneToOneRelation('mayor', 'mayors', { originKey: 'town_id' })

    // Towns have multiple inhabitants
    .addOneToManyRelation('inhabitants', 'people', { originKey: 'town_id' })

    // Towns electricity is supplied by power plants that are shared with other towns
    .addManyToManyRelation('energyProviders', 'powerPlants', 'utilityContracts', {
      originKey: 'town_id',
      foreignKey: 'power_plant_id',

    // Towns have a list of honorary citizen that is retrievable through a public API
    .addExternalRelation('honoraryCitizen', {
      schema: { firstName: 'String', lastName: 'String' },
      listRecords: async ({ id }) => {
        const response = await axios.get(
        return response.body;

Last updated