# Managing Policy Engines
Source: https://docs.chain.link/ace/guides/policy-manager/manage-engines
Last Updated: 2026-05-26

> For the complete documentation index, see [llms.txt](/llms.txt).

A **policy engine** is the on-chain orchestrator that evaluates policies whenever a protected function is called. Each policy engine is deployed as a smart contract on one or more chains, and all your targets, policies, and protections are scoped to a specific engine. For a deeper explanation of how policy engines fit into the architecture, see [Architecture](/ace/concepts/architecture) and [Policy Management](/ace/concepts/policy-management).

> **NOTE**
>
> Before creating a policy engine, make sure you have completed [Account Setup](/ace/getting-started/account-setup) and
> have a [CRE Connect Wallet](/ace/getting-started/account-setup#4-set-up-cre-connect-wallets) deployed on each chain
> where you want the engine to operate.

## Create a policy engine

## View policy engines

## Update a policy engine

You can update a policy engine's name, description, and extractor associations.

## Add or remove extractors

Extractors decode transaction calldata into named parameters (sender, recipient, amount, etc.) so policies can evaluate them. If you forgot to attach an extractor during engine creation or need to remove one, use the `PUT /policy-engines/{id}` endpoint.

> **CAUTION: Full replacement**
>
> The `extractor_ids` field in a PUT request **replaces all current extractors** — it is not additive. Always include
> every extractor you want to keep. Omitting an extractor from the list detaches it from the engine.

### Add a missing extractor

First, retrieve your engine to see which extractors are currently attached:

```bash
curl https://ace.api.chain.link/v1/policy-engines/<POLICY_ENGINE_ID> \
  -H "Authorization: Apikey <API_KEY>"
```

Check the `extractor_registrations` array in the response. Then send a PUT request that includes the existing extractor IDs plus the new one:

```bash
curl -X PUT https://ace.api.chain.link/v1/policy-engines/<POLICY_ENGINE_ID> \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "name": "My Policy Engine",
    "extractor_ids": [
      "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c",
      "572201bb-170b-4fda-ab89-a65b5bbc594b",
      "f17bbe8b-8462-4dd7-8fb7-a4973dff04fc"
    ],
    "onchain_policy_engines": [
      { "chain_selector": "16015286601757825753" },
      { "chain_selector": "3478487238524512106" },
      { "chain_selector": "14767482510784806043" },
      { "chain_selector": "16281711391670634445" },
      { "chain_selector": "10344971235874465080" }
    ]
  }'
```

In this example, `f17bbe8b-8462-4dd7-8fb7-a4973dff04fc` is the new extractor being added alongside two that were already attached.

### Remove an extractor

Send a PUT request with the `extractor_ids` array that **omits** the extractor you want to detach:

```bash
curl -X PUT https://ace.api.chain.link/v1/policy-engines/<POLICY_ENGINE_ID> \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "name": "My Policy Engine",
    "extractor_ids": [
      "d4b8cd51-7d5a-487a-9ba5-bb7236e3184c",
      "572201bb-170b-4fda-ab89-a65b5bbc594b"
    ],
    "onchain_policy_engines": [
      { "chain_selector": "16015286601757825753" },
      { "chain_selector": "3478487238524512106" },
      { "chain_selector": "14767482510784806043" },
      { "chain_selector": "16281711391670634445" },
      { "chain_selector": "10344971235874465080" }
    ]
  }'
```

> **TIP: Available extractors**
>
> See the [Policy Manager Quick Start](/ace/getting-started/policy-manager#extractor-ids-for-api-creation) for the full
> list of pre-deployed extractor IDs for ERC-20 and ERC-3643 contracts, or retrieve them at any time with `GET
>   https://ace.api.chain.link/v1/extractors`.

## Archive a policy engine

Archiving a policy engine deactivates it and prevents any further operations. All policy instances associated with the engine must be archived first.

> **CAUTION**
>
> All policy instances must be archived before the engine itself can be archived. Attempting to archive an engine with
> active policies returns an error.

## Related pages

- [Architecture](/ace/concepts/architecture) — how PolicyEngine contracts fit into the ACE system
- [Policy Management](/ace/concepts/policy-management) — how policy chains and evaluation work
- [Managing Targets](/ace/guides/policy-manager/manage-targets) — register contracts to protect under an engine
- [Managing Policies](/ace/guides/policy-manager/manage-policies) — create and configure policy instances
- [Coordinator API Reference](/api/ace/coordinator/docs) — full API schema