Documents
admin-panel-api
admin-panel-api
Type
External
Status
Published
Created
Mar 5, 2026
Updated
Mar 11, 2026
Updated by
Dosu Bot

import Prerequisite from '/docs/snippets/plugins-development-create-plugin-prerequisite.md'

Admin Panel API for plugins: An overview#

The Admin Panel API exposes `register`, `bootstrap`, and `registerTrads` hooks to inject React components and translations into Strapi's UI. Menu, settings, injection zone, reducer, and hook APIs let plugins add navigation, configuration panels, or custom actions.

A Strapi plugin can interact with both the back end and the front end of a Strapi application. The Admin Panel API covers the front-end part: it allows a plugin to customize Strapi's admin panel. The admin panel is a application, and each plugin contributes its own React application to it. Customization consists of editing an entry file to export the required interface and choosing which actions to perform.

For more information on how plugins can interact with the back end part of Strapi, see Server API.

Entry file#

The entry file for the Admin Panel API is [plugin-name]/admin/src/index.js. This file exports the required interface, with the following functions available:

Function typeAvailable functions
Lifecycle functionsregister(), bootstrap()
Async functionregisterTrads() (see admin localization for details)

All admin panel code can technically live in the single entry file, but splitting each concern into its own folder, as generated by the strapi generate plugin CLI command, is strongly recommended. The examples in this documentation follow that structure.

register() {#register}#

Type: Function

This function is called to load the plugin, even before the app is actually bootstrapped. It takes the running Strapi application as an argument (app).

Within the register() function, a plugin can:

Example:

import pluginId from './pluginId';

export default {
  register(app) {
    // highlight-next-line
    app.registerPlugin({ id: pluginId, name: 'My Plugin' });
    // Add menu links, settings sections, injection zones, and reducers here
  },
};
import type { StrapiApp } from '@strapi/admin/strapi-admin';
import pluginId from './pluginId';

export default {
  register(app: StrapiApp) {
    // highlight-next-line
    app.registerPlugin({ id: pluginId, name: 'My Plugin' });
    // Add menu links, settings sections, injection zones, and reducers here
  },
};

registerPlugin() {#registerplugin}#

Type: Function

Registers the plugin to make it available in the admin panel. This function is called within the register() lifecycle function and returns an object with the following parameters:

ParameterTypeDescription
idStringPlugin id
nameStringPlugin name
apisRecord<string, unknown>APIs exposed to other plugins
initializerReact.ComponentTypeComponent for plugin initialization
injectionZonesObjectDeclaration of available injection zones
isReadyBooleanPlugin readiness status (default: true)

Example:

export default {
  register(app) {
    app.registerPlugin({
      id: 'my-plugin',
      name: 'My Plugin',
      apis: {
        // APIs exposed to other plugins
      },
      initializer: MyInitializerComponent,
      injectionZones: {
        // Areas where other plugins can inject components
      },
      isReady: false,
    });
  },
};
import type { StrapiApp } from '@strapi/admin/strapi-admin';

export default {
  register(app: StrapiApp) {
    app.registerPlugin({
      id: 'my-plugin',
      name: 'My Plugin',
      apis: {
        // APIs exposed to other plugins
      },
      initializer: MyInitializerComponent,
      injectionZones: {
        // Areas where other plugins can inject components
      },
      isReady: false,
    });
  },
};

bootstrap() {#bootstrap}#

Type: Function

Exposes the bootstrap function, executed after all the plugins are registered.

Within the bootstrap() function, a plugin can:

Example:

export default {
  // ...
  bootstrap(app) {
    // highlight-next-line
    app.getPlugin('content-manager').injectComponent('editView', 'right-links', { name: 'my-compo', Component: () => 'my-compo' });
  },
};
import type { StrapiApp } from '@strapi/admin/strapi-admin';

export default {
  // ...
  bootstrap(app: StrapiApp) {
    // highlight-next-line
    app.getPlugin('content-manager').injectComponent('editView', 'right-links', { name: 'my-compo', Component: () => 'my-compo' });
  },
};

Available actions#

The Admin Panel API provides several building blocks to customize the user interface, user experience, and behavior of the admin panel.

Use the following table to find which function to use and where to declare it. Click any function name for details:

ActionFunction to useRelated lifecycle function
Add a new link to the main navigationaddMenuLink()register()
Create a new settings sectioncreateSettingSection()register()
Add a single link to a settings sectionaddSettingsLink()bootstrap()
Add multiple links to a settings sectionaddSettingsLinks()bootstrap()
Add panels, options, and actions to the Content Manager's Edit view and List viewbootstrap()
Declare an injection zoneregisterPlugin()register()
Inject a component in an injection zoneinjectComponent()bootstrap()
Add a reduceraddReducers()register()
Create a hookcreateHook()register()
Register a hookregisterHook()bootstrap()
Provide translations for the plugin admin interfaceregisterTrads()registerTrads()

Click on any of the following cards to get more details about a specific topic:

:::tip Replacing the WYSIWYG
The WYSIWYG editor can be replaced by taking advantage of custom fields, for instance using the .
:::