Stay organized with collections
Save and categorize content based on your preferences.
This page
applies to Apigee and Apigee hybrid.
This page describes how to create custom plugins in API hub. Custom plugins are created manually to connect API hub to a specific API data source. You can create custom plugins to connect to on-premises or multi-cloud sources, or to adapt API hub to meet specific business needs. For more information about plugins in API hub, see Plugins overview.
Before you begin
Grant the following IAM permissions to your principal account:
If you are creating a custom plugin to connect any Google Cloud services, ensure that you attached the runtime project to API hub. See Attach a runtime project.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Hard to understand","hardToUnderstand","thumb-down"],["Incorrect information or sample code","incorrectInformationOrSampleCode","thumb-down"],["Missing the information/samples I need","missingTheInformationSamplesINeed","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2025-09-04 UTC."],[],[],null,["# Create custom plugins\n\n*This page\napplies to **Apigee** and **Apigee hybrid**.*\n\n\nThis page describes how to create custom plugins in API hub. Custom plugins are created manually to connect API hub to a specific API data source. You can create custom plugins to connect to on-premises or multi-cloud sources, or to adapt API hub to meet specific business needs. For more information about plugins in API hub, see [Plugins overview](/apigee/docs/apihub/plugins).\n\nBefore you begin\n----------------\n\n- Grant the following [IAM permissions](/iam/docs/understanding-roles) to your principal account:\n - `apihub.plugins.create`\n - `apihub.plugins.delete`\n - `apihub.plugins.get`\n - `apihub.plugins.list`\n\n\n For information on granting roles to principals, see [Granting, changing, and revoking access](/iam/docs/granting-changing-revoking-access).\n- If you are creating a custom plugin to connect any Google Cloud services, ensure that you attached the runtime project to API hub. See [Attach a runtime project](/apigee/docs/apihub/auto-register-apigee-proxies#attach-a-runtime-project).\n- For Apigee Edge Public Cloud plugins, read about [Apigee Edge API hub connector integration](https://docs.apigee.com/api-platform/get-started/apigee-edge-uapim).\n- For Apigee Edge Private Cloud (OPDK) plugins, read about [API hub connector integration](https://docs.apigee.com/private-cloud/v4.53.00/privatecloud-uapim-overview).\n\nCreate a custom plugin\n----------------------\n\n### Console\n\n\nTo create a custom plugin, do the following:\n\n1. In the Google Cloud console, go to the **API hub** page.\n\n [Go to API hub](https://console.cloud.google.com/apigee/api-hub)\n2. Click settings **Settings** from the left navigation menu to open the **Settings** page.\n3. Click the **Plugins** tab to view the available plugins in your project.\n4. Click **Create a new plugin**.\n5. Configure the following fields in the **Create plugin** pane:\n - **Display name**: Enter a name for the plugin.\n - Optional: Click **Specify ID** to provide a unique ID for the plugin. API hub generates a unique ID if you don't provide one. **Note:** The ID must be between 4 to 500 characters in length and can only contain the following characters: `/[A-Z][a-z][0-9]-/.`\n - **Description**: Enter a description for the plugin.\n - **Plugin type**: This field is selected by default.\n6. Click **Create plugin** to create the plugin.\n\n On successful creation, you can see a new plugin card displayed in the **Plugins** tab. To use the plugin, you need to [create a plugin instance](/apigee/docs/apihub/create-plugin-instances).\n\n### REST\n\n\nYou can create a custom plugin using the [Create Plugin API](/apigee/docs/reference/apis/apihub/rest#rest-resource:-v1.projects.locations.plugins):\n\n\n**Custom plugin without a hosting service:** \n\n```\ncurl -X POST \\\n -H \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"display_name\": \"PLUGIN_DISPLAY_NAME\",\n \"description\": \"PLUGIN_DESCRIPTION\",\n \"actions_config\": [\n {\n \"id\": \"PLUGIN_ACTION_ID\",\n \"display_name\": \"PLUGIN_ACTION_DISPLAY_NAME\",\n \"description\": \"PLUGIN_ACTION_DESCRIPTION\",\n \"trigger_mode\": \"PLUGIN_ACTION_TRIGGER_MODE\"\n }\n ],\n \"plugin_category\": \"PLUGIN_CATEGORY\",\n \"ownership_type\": \"USER_OWNED\"\n }' \\\n \"https://apihub.googleapis.com/v1/projects/PROJECT_ID/locations/HUB_LOCATION/plugins?plugin_id=PLUGIN_ID\"\n \n```\n\n#### Example\n\n```\ncurl -X POST \\\n -H \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"display_name\": \"Nebula Connect\",\n \"description\": \"Nebula Connect plugin for syncing metadata via gRPC.\",\n \"actions_config\": [\n {\n \"id\": \"sync-metadata-core\",\n \"display_name\": \"Sync Core Metadata\",\n \"description\": \"Initiates synchronization of core API metadata.\",\n \"trigger_mode\": \"API_HUB_SCHEDULE_TRIGGER\"\n }\n ],\n \"plugin_category\": \"API_GATEWAY\",\n \"ownership_type\": \"USER_OWNED\"\n }' \\\n \"https://apihub.googleapis.com/v1/projects/test-project/locations/us-west1/plugins?plugin_id=nebula-connect-v1\"\n \n```\n\n**Custom plugin with a hosting service:** \n\n```\ncurl -X POST \\\n -H \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"display_name\": \"PLUGIN_DISPLAY_NAME\",\n \"description\": \"PLUGIN_DESCRIPTION\",\n \"actions_config\": [\n {\n \"id\": \"PLUGIN_ACTION_ID\",\n \"display_name\": \"PLUGIN_ACTION_DISPLAY_NAME\",\n \"description\": \"PLUGIN_ACTION_DESCRIPTION\",\n \"trigger_mode\": \"PLUGIN_ACTION_TRIGGER_MODE\"\n }\n ],\n \"plugin_category\": \"PLUGIN_CATEGORY\",\n \"hosting_service\": {\n \"service_uri\": \"PLUGIN_HOSTING_SERVICE_URI\"\n },\n \"ownership_type\": \"USER_OWNED\"\n }' \\\n \"https://apihub.googleapis.com/v1/projects/PROJECT_ID/locations/HUB_LOCATION/plugins?plugin_id=PLUGIN_ID\"\n \n```\n\n#### Example\n\n```\ncurl -X POST \\\n -H \"Authorization: Bearer $(gcloud auth print-access-token)\" \\\n -H \"Content-Type: application/json\" \\\n -d '{\n \"display_name\": \"Nebula Connect\",\n \"description\": \"Nebula Connect plugin for syncing metadata via gRPC.\",\n \"actions_config\": [\n {\n \"id\": \"sync-metadata-core\",\n \"display_name\": \"Sync Core Metadata\",\n \"description\": \"Initiates synchronization of core API metadata.\",\n \"trigger_mode\": \"API_HUB_SCHEDULE_TRIGGER\"\n }\n ],\n \"plugin_category\": \"API_GATEWAY\",\n \"hosting_service\": {\n \"service_uri\": \"[https://nebula-endpoints-987654321098.us-west1.run.app](https://nebula-endpoints-987654321098.us-west1.run.app)\"\n },\n \"ownership_type\": \"USER_OWNED\"\n }' \\\n \"https://apihub.googleapis.com/v1/projects/test-project/locations/us-west1/plugins?plugin_id=nebula-connect-v1\"\n\n \n```\n\n\nReplace the following:\n\n- \u003cvar translate=\"no\"\u003ePLUGIN_DISPLAY_NAME\u003c/var\u003e: The display name of the plugin.\n- \u003cvar translate=\"no\"\u003ePLUGIN_DESCRIPTION\u003c/var\u003e: A description of the plugin.\n- \u003cvar translate=\"no\"\u003ePLUGIN_ACTION_ID\u003c/var\u003e: The ID of the plugin action.\n- \u003cvar translate=\"no\"\u003ePLUGIN_ACTION_DISPLAY_NAME\u003c/var\u003e: The display name of the plugin action.\n- \u003cvar translate=\"no\"\u003ePLUGIN_ACTION_DESCRIPTION\u003c/var\u003e: A description of the plugin action.\n- \u003cvar translate=\"no\"\u003ePLUGIN_ACTION_TRIGGER_MODE\u003c/var\u003e: The trigger mode of the plugin action.\n- \u003cvar translate=\"no\"\u003ePLUGIN_CATEGORY\u003c/var\u003e: The category of the plugin.\n- \u003cvar translate=\"no\"\u003ePLUGIN_HOSTING_SERVICE_URI\u003c/var\u003e: The URI of the hosting service.\n- \u003cvar translate=\"no\"\u003ePROJECT_ID\u003c/var\u003e: The name of your API hub host project. The host project was selected when API hub was provisioned.\n- \u003cvar translate=\"no\"\u003eHUB_LOCATION\u003c/var\u003e: The location of the API hub.\n- \u003cvar translate=\"no\"\u003ePLUGIN_ID\u003c/var\u003e: The ID of the plugin.\n\nWhat's next\n-----------\n\n- Learn how to [Manage custom plugins](/apigee/docs/apihub/manage-custom-plugins).\n- See [Plugins overview](/apigee/docs/apihub/plugins).\n- Learn about [Creating plugin instances](/apigee/docs/apihub/create-plugin-instances).\n- Learn about [Managing plugin instances](/apigee/docs/apihub/manage-plugin-instances)."]]