Managing Targets

A target is a smart contract protected by ACE. After deploying your ACE-compatible contract, you register it as a target under a PolicyEngine. Once registered, you can configure the default policy result and attach policies to its functions via protections.

Register a target

After deploying your contract, register it as a target with a POST request. Provide the contract name, type, protected methods, and on-chain addresses:

curl -X POST https://ace.api.chain.link/v1/targets \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "title": "My ERC-20 Token",
    "description": "Production ERC-20 token with compliance enforcement",
    "policy_engine_id": "<POLICY_ENGINE_ID>",
    "protected_methods": [
      "transfer(address,uint256)",
      "transferFrom(address,address,uint256)"
      #[any other methods you want to protect]
    ],
    "desired_default_allow": true,
    "metadata": {"contract_type": "ERC-20"},
    "onchain_targets": [
      {
        "chain_selector": "16015286601757825753",
        "address": "0xYourContractAddressOnSepolia"
      },
      {
        "chain_selector": "3478487238524512106",
        "address": "0xYourContractAddressOnArbitrumSepolia"
      },
      #[any other chains where your contract is deployed]
    ]
  }'
FieldRequiredDescription
titleYesHuman-readable name for the target
descriptionNoDescription of the contract
policy_engine_idYesUUID of the policy engine to associate with
protected_methodsNoArray of function signatures that can be protected
desired_default_allowNoWhether to allow transactions by default (default: true)
onchain_targetsNoArray of objects with chain_selector and contract address
metadataNoArbitrary JSON metadata (e.g., {"contract_type": "ERC-20"})

Default allow behavior

The default policy result controls what happens when a transaction passes through the entire policy chain and no policy explicitly returns Allow or Reject (i.e., every policy returns Continue). This is configured per target contract via the desired_default_allow field:

  • true (default) — The transaction is allowed. This is appropriate when you want policies to act as blockers (reject specific cases), and everything else passes through.
  • false — The transaction is rejected. This is appropriate for allowlist-style enforcement where only explicitly approved transactions proceed.

For more on how policy evaluation ordering works, see Policy Ordering & Composition.

Change the default policy result

Update an existing target's default with a PUT request. Set desired_default_allow to true (allow by default) or false (reject by default). Because PUT is a full replacement, include all fields you want to keep:

curl -X PUT https://ace.api.chain.link/v1/targets/<TARGET_ID> \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "title": "My ERC-20 Token",
    "description": "Production ERC-20 token with compliance enforcement",
    "protected_methods": [
      "transfer(address,uint256)",
      "transferFrom(address,address,uint256)"
    ],
    "desired_default_allow": false,
    "metadata": {"contract_type": "ERC-20"}
  }'

The Coordinator calls SetTargetDefaultPolicyAllow on the PolicyEngine contract for each chain where the target is deployed.

View targets

  1. In the Chainlink Platform, go to Compliance > Policy Manager in the left sidebar. You see all the policy engines in your organization.
  2. Click on a policy engine to open it. The Contracts tab lists all target contracts protected by this policy engine.
  3. Click on a target contract card to see its details. You can switch between two views:
    • Functions — shows unprotected and protected functions, along with the policies protecting each protected function.
    • Policies — shows the list of policies protecting this target contract and which specific functions each policy applies to.

List all targets:

curl https://ace.api.chain.link/v1/targets \
  -H "Authorization: Apikey <API_KEY>"
ParameterDescription
pagePage number (default: 1)
page_sizeResults per page (max: 100)
include_onchainsInclude on-chain contract details (default: true)
policy_engine_idFilter by policy engine
chain_selectorFilter by chain
searchSearch by target title or on-chain address

To retrieve a specific target by ID:

curl https://ace.api.chain.link/v1/targets/<TARGET_ID> \
  -H "Authorization: Apikey <API_KEY>"

Update a target

You can update a target's name, description, contract type, protected methods, default allow behavior, and on-chain addresses.

  1. In the ACE Platform, go to Compliance > Policy Manager and click on your policy engine.
  2. In the Contracts tab, click on the target contract you want to update.
  3. Click the Edit icon in the contract header. A drawer opens on the right.
  4. Update the Name, Contract type, or Description as needed.
  5. Click Save changes.

Update a target with a PUT request. Include all fields you want to preserve:

curl -X PUT https://ace.api.chain.link/v1/targets/<TARGET_ID> \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "title": "My ERC-20 Token (Updated)",
    "description": "Updated description",
    "protected_methods": [
      "transfer(address,uint256)",
      "transferFrom(address,address,uint256)",
      "mint(address,uint256)"
    ],
    "desired_default_allow": true,
    "metadata": {"contract_type": "ERC-20"}
  }'

When you deploy your ACE-compatible contract on a new chain, the control plane detects it automatically and creates a separate detected target (titled "unknown target"). Rather than managing each chain deployment as its own target, you can merge detected targets into an existing target to keep a single multi-chain target with all its on-chain addresses in one place.

Conditions

A detected target can be merged (linked) into an existing target when:

  • The detected target was auto-discovered — it still has the default "unknown target" title.
  • The detected target has at least one on-chain address.
  • A valid destination target exists in the same policy engine: it must be a different target, already named, and deployed on a different chain than the source (no shared chain selectors).

If no valid destination exists, the detected target cannot be merged — you can only rename it via Edit details.

How it works

Merging transfers the on-chain addresses from the source target(s) to the destination target, then archives the sources. After the merge, the destination target contains all chain deployments and any protections remain on the destination.

  1. In the Chainlink Platform, go to Compliance > Policy Manager and open your policy engine.
  2. In the Contracts tab, locate the detected contract (shown as "unknown target").
  3. Click the three-dot menu on the detected contract card.
  4. Click Link to existing contract.
  5. Select the destination contract you want to merge into.
  6. Confirm the merge. The detected contract's on-chain address is transferred to the destination and the detected target is archived.

Merge one or more source targets into a destination target with a POST request:

curl -X POST "https://ace.api.chain.link/v1/targets/<DESTINATION_TARGET_ID>/merge" \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "source_target_ids": ["<SOURCE_TARGET_ID>"]
  }'
Field
RequiredDescription
source_target_idsYesArray of UUID(s) — the detected targets whose on-chain addresses will be transferred to the destination

The response returns the updated destination target with all merged on-chain addresses. The source targets are archived automatically.

Archive a target

Archiving a target removes it from active use. All target protections associated with the target must be archived first.

Archive a target with a PATCH request:

curl -X PATCH https://ace.api.chain.link/v1/targets/<TARGET_ID> \
  -H "Content-Type: application/json" \
  -H "Authorization: Apikey <API_KEY>" \
  -d '{
    "status": "archived"
  }'

Get the latest Chainlink content straight to your inbox.