---
title: "Create a plugin"
method: POST
path: "/v1/orgs/{org_id}/plugins"
tags: ["Plugins"]
---

# Create a plugin

`POST /v1/orgs/{org_id}/plugins`

## Request

- Base URL: `https://api.arcade.dev`
- URL: `https://api.arcade.dev/v1/orgs/{org_id}/plugins`
- Auth: API key in header `Authorization`

Creates a new plugin with optional inline hooks

## Path parameters

- `org_id` string, required

## Request body

- SchemasCreatePluginRequest
  - `description` string
  - `group_access_config` SchemasCreateGroupAccessConfigRequest
    - `backend` 'okta' | 'entra' | 'sailpoint', required
    - `entra` SchemasCreateEntraBackendRequest
      - `client_id` string, required
      - `client_secret` string, required
      - `tenant_id` string, required
    - `okta` SchemasCreateOktaBackendRequest
      - `api_token` string, required
      - `org_url` string, required
    - `rules` SchemasGroupAccessRuleRequest[], required
      - `allow_on_unavailable` boolean
      - `match` string, required
      - `required_groups` string[], required
    - `sailpoint` SchemasCreateSailPointBackendRequest
      - `client_id` string, required
      - `client_secret` string, required
      - `tenant_url` string, required
    - `status` 'inactive' | 'active'
  - `name` string, required
  - `plugin_type` 'webhook' | 'rate_limit' | 'group_access', required
  - `rate_limit_config` SchemasCreateRateLimitConfigRequest
    - `rules` SchemasRateLimitRuleRequest[], required
      - `allow_on_unavailable` boolean
      - `limit` integer, required
      - `match` string, required
      - `time_unit` 's' | 'm' | 'h' | 'd' | 'mo', required
    - `status` 'inactive' | 'active'
  - `retry` SchemasCreateRetryConfigRequest
    - `backoff` 'fixed' | 'exponential'
    - `base_delay_ms` integer
    - `enabled` boolean
    - `max_attempts` integer
    - `retry_on` string[]
  - `status` 'inactive' | 'active'
  - `webhook_config` SchemasCreateWebhookConfigRequest
    - `auth` SchemasWebhookAuthRequest
      - `ca_cert` string
      - `client_cert` string
      - `client_key` string
      - `token` string
      - `type` 'bearer' | 'mtls' | 'none'
    - `endpoints` SchemasCreateWebhookEndpointsRequest, required
      - `access` SchemasWebhookEndpointRequest
        - `cache_enabled` boolean
        - `cache_ttl_ms` integer: 1s to 1 week
        - `failure_mode` 'fail_closed' | 'fail_open', required
        - `phase` 'before' | 'after', required
        - `priority` integer
        - `status` 'inactive' | 'active'
        - `timeout_ms` integer: 100ms to 2 minutes
        - `url` string, required
      - `post` SchemasWebhookEndpointRequest
        - `cache_enabled` boolean
        - `cache_ttl_ms` integer: 1s to 1 week
        - `failure_mode` 'fail_closed' | 'fail_open', required
        - `phase` 'before' | 'after', required
        - `priority` integer
        - `status` 'inactive' | 'active'
        - `timeout_ms` integer: 100ms to 2 minutes
        - `url` string, required
      - `pre` SchemasWebhookEndpointRequest
        - `cache_enabled` boolean
        - `cache_ttl_ms` integer: 1s to 1 week
        - `failure_mode` 'fail_closed' | 'fail_open', required
        - `phase` 'before' | 'after', required
        - `priority` integer
        - `status` 'inactive' | 'active'
        - `timeout_ms` integer: 100ms to 2 minutes
        - `url` string, required
    - `health_check_path` string

## Response `201`

Created

- SchemasCreatePluginResponse
  - `binding` SchemasBindingResponse
    - `id` string
    - `type` 'static' | 'tenant' | 'project' | 'account'
  - `created_at` string
  - `created_by` string
  - `description` string
  - `group_access_config` SchemasGroupAccessConfigResponse
    - `backend` string
    - `entra` SchemasEntraBackendResponse
      - `client_id` string
      - `client_secret` SchemasSecretResponse
        - `binding` 'static' | 'tenant' | 'project' | 'account'
        - `editable` boolean
        - `exists` boolean
        - `value` string
      - `tenant_id` string
    - `okta` SchemasOktaBackendResponse
      - `api_token` SchemasSecretResponse
        - `binding` 'static' | 'tenant' | 'project' | 'account'
        - `editable` boolean
        - `exists` boolean
        - `value` string
      - `org_url` string
    - `rules` SchemasGroupAccessRuleResponse[]
      - `allow_on_unavailable` boolean
      - `match` string
      - `required_groups` string[]
    - `sailpoint` SchemasSailPointBackendResponse
      - `client_id` string
      - `client_secret` SchemasSecretResponse
        - `binding` 'static' | 'tenant' | 'project' | 'account'
        - `editable` boolean
        - `exists` boolean
        - `value` string
      - `tenant_url` string
  - `health_status` string
  - `hooks` SchemasHookResponse[]
    - `cache_enabled` boolean
    - `cache_ttl_ms` integer
    - `created_at` string
    - `failure_mode` 'fail_closed' | 'fail_open'
    - `hook_point` string
    - `id` string
    - `name` string
    - `phase` 'before' | 'after'
    - `plugin_id` string
    - `priority` integer
    - `status` 'inactive' | 'active'
    - `timeout_ms` integer
    - `updated_at` string
    - `version` integer
  - `id` string
  - `name` string
  - `plugin_type` string
  - `rate_limit_config` SchemasRateLimitConfigResponse
    - `rules` SchemasRateLimitRuleResponse[]
      - `allow_on_unavailable` boolean
      - `limit` integer
      - `match` string
      - `time_unit` string
  - `retry` SchemasRetryConfigResponse
    - `backoff` string
    - `base_delay_ms` integer
    - `enabled` boolean
    - `max_attempts` integer
    - `retry_on` string[]
  - `status` 'inactive' | 'active'
  - `updated_at` string
  - `updated_by` string
  - `version` integer
  - `webhook_config` SchemasWebhookConfigResponse
    - `auth` SchemasWebhookAuthResponse
      - `ca_cert` string
      - `client_cert_configured` boolean
      - `client_key_configured` boolean
      - `token` SchemasSecretResponse
        - `binding` 'static' | 'tenant' | 'project' | 'account'
        - `editable` boolean
        - `exists` boolean
        - `value` string
      - `type` string
    - `endpoints` SchemasWebhookEndpointsResponse
      - `access` SchemasWebhookEndpointResponse
        - `cache_enabled` boolean
        - `cache_ttl_ms` integer
        - `timeout_ms` integer
        - `url` string
      - `post` SchemasWebhookEndpointResponse
        - `cache_enabled` boolean
        - `cache_ttl_ms` integer
        - `timeout_ms` integer
        - `url` string
      - `pre` SchemasWebhookEndpointResponse
        - `cache_enabled` boolean
        - `cache_ttl_ms` integer
        - `timeout_ms` integer
        - `url` string
    - `health_check_path` string

## Other responses

- `400`: Bad Request
- `409`: Conflict
- `500`: Internal Server Error

## Changes

- **2026-10-16** `4c694686f453`: 1 info
  - endpoint added

[Operation history](https://skmtc.dev/arcadeai/apis/arcade-api/changes/v1/orgs/:org_id/plugins/post.md)

---

[API](https://skmtc.dev/arcadeai/apis/arcade-api.md) - [All operations](https://skmtc.dev/arcadeai/apis/arcade-api/llms.txt) - [OpenAPI document](https://skmtc.dev/arcadeai/apis/arcade-api/revisions/f487ce74dc56?raw)
