# Plugin's front-end Field API
As plugins developer you may need to add custom fields in your application. To do so, a **Field API** is available in order for a plugin to register a field which will be available for all plugins.
::: warning NOTE
Currently, only the content manager uses this API to extend its current fields.
:::
## Registering a new field
Registering a field can be made in two different ways:
1. During the load phase of a plugin
2. Using the provided `react-hook` in a component.
### Registering a field during the load of a plugin
Registering a field during the load phase of a plugin can be done as follows:
1. Create a new Field type (in this example a **`media`** field type):
**Path —** `plugins/my-plugin/admin/src/components/InputMedia/index.js`.
```js
import React from 'react';
const InputMedia = props => {
  // Check out the provided props
  console.log(props);
  return 
InputMedia
;
};
export default InputMedia;
```
2. Register the field into the application:
**Path —** `plugins/my-plugin/admin/src/index.js`.
```js
import pluginPkg from '../../package.json';
import InputMedia from './components/InputMedia';
import pluginId from './pluginId';
export default strapi => {
  const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
  const plugin = {
    blockerComponent: null,
    blockerComponentProps: {},
    description: pluginDescription,
    icon: pluginPkg.strapi.icon,
    id: pluginId,
    initializer: () => null,
    injectedComponents: [],
    isReady: true,
    leftMenuLinks: [],
    leftMenuSections: [],
    mainComponent: null,
    name: pluginPkg.strapi.name,
    preventComponentRendering: false,
    trads: {},
  };
  strapi.registerField({ type: 'media', Component: InputMedia });
  return strapi.registerPlugin(plugin);
};
```
By doing so, all the plugins from your project will be able to use the newly registered **Field** type.
### Registering a field inside a React Component
The other way to register a **Field** is to use the provided `react-hook`: **`useStrapi`** it can be done in the `Initializer` Component so it is accessible directly when the user is logged in, if you decide to register your plugin in another component than the `Initializer` the **Field** will only be registered in the administration panel once the component is mounted (the user has navigated to the view where the **Field** is registered).
1. Register the **Field** in the `Initializer` Component:
**Path —** `plugins/my-plugin/admin/src/containers/Initializer/index.js`.
```js
/**
 *
 * Initializer
 *
 */
import { useEffect, useRef } from 'react';
import PropTypes from 'prop-types';
import { useStrapi } from 'strapi-helper-plugin';
import pluginId from '../../pluginId';
import InputMedia from './components/InputMedia';
const Initializer = ({ updatePlugin }) => {
  const {
    strapi: { fieldApi },
  } = useStrapi();
  const ref = useRef();
  ref.current = updatePlugin;
  useEffect(() => {
    // Register the new field
    strapi.fieldApi.registerField({ type: 'media', Component: InputMedia });
    ref.current(pluginId, 'isReady', true);
  }, []);
  return null;
};
Initializer.propTypes = {
  updatePlugin: PropTypes.func.isRequired,
};
export default Initializer;
```
2. Add the `Initializer` component to your plugin so it is mounted in the administration panel once the user is logged in:
```js
import pluginPkg from '../../package.json';
import pluginLogo from './assets/images/logo.svg';
import App from './containers/App';
import Initializer from './containers/Initializer';
import lifecycles from './lifecycles';
import trads from './translations';
import pluginId from './pluginId';
export default strapi => {
  const pluginDescription = pluginPkg.strapi.description || pluginPkg.description;
  const plugin = {
    blockerComponent: null,
    blockerComponentProps: {},
    description: pluginDescription,
    icon: pluginPkg.strapi.icon,
    id: pluginId,
    initializer: Initializer,
    injectedComponents: [],
    isRequired: pluginPkg.strapi.required || false,
    layout: null,
    lifecycles,
    leftMenuLinks: [],
    leftMenuSections: [],
    mainComponent: App,
    name: pluginPkg.strapi.name,
    pluginLogo,
    preventComponentRendering: false,
    trads,
  };
  return strapi.registerPlugin(plugin);
};
```
## Consuming the Field API
Consuming the **Field** API can only be done by using the provided `react-hook` **`useStrapi`**. Here's an example from the **content-manager** plugin:
**Path —** `~/strapi-plugin-content-manager/admin/src/components/Inputs/index.js`.
```js
import React, { memo, useMemo } from 'react';
// Other imports
// ...
// Import the Inputs component from our component library Buffet.js
import { Inputs as InputsIndex } from '@buffetjs/custom';
// Import the Hook with which you can access the Field API
import { useStrapi } from 'strapi-helper-plugin';
function Inputs({ autoFocus, keys, layout, name, onBlur }) {
  // This is where you will access the field API
  const {
    strapi: { fieldApi },
  } = useStrapi();
  // Other boilerplate code
  // ...
  return (
    
      {error => {
        return (
          
        );
      }}
    
  );
}
```
## Field API definition
| Method        | Param         | Description                            |
| :------------ | :------------ | :------------------------------------- |
| getField      | {String} type | Retrieve a Field depending on the type |
| getFields     |               | Retrieve all the Fields                |
| registerField | {Object}      | Register a Field                       |
| removeField   |               | Remove a Field                         |