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]
]
}'
| Field | Required | Description |
|---|---|---|
title | Yes | Human-readable name for the target |
description | No | Description of the contract |
policy_engine_id | Yes | UUID of the policy engine to associate with |
protected_methods | No | Array of function signatures that can be protected |
desired_default_allow | No | Whether to allow transactions by default (default: true) |
onchain_targets | No | Array of objects with chain_selector and contract address |
metadata | No | Arbitrary 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
- In the Chainlink Platform, go to Compliance > Policy Manager in the left sidebar. You see all the policy engines in your organization.
- Click on a policy engine to open it. The Contracts tab lists all target contracts protected by this policy engine.
- 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>"
| Parameter | Description |
|---|---|
page | Page number (default: 1) |
page_size | Results per page (max: 100) |
include_onchains | Include on-chain contract details (default: true) |
policy_engine_id | Filter by policy engine |
chain_selector | Filter by chain |
search | Search 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.
- In the ACE Platform, go to Compliance > Policy Manager and click on your policy engine.
- In the Contracts tab, click on the target contract you want to update.
- Click the Edit icon in the contract header. A drawer opens on the right.
- Update the Name, Contract type, or Description as needed.
- 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"}
}'
Link targets
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.
- In the Chainlink Platform, go to Compliance > Policy Manager and open your policy engine.
- In the Contracts tab, locate the detected contract (shown as "unknown target").
- Click the three-dot menu on the detected contract card.
- Click Link to existing contract.
- Select the destination contract you want to merge into.
- 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 | Required | Description |
|---|---|---|
source_target_ids | Yes | Array 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"
}'
Related pages
- Making Your Contract ACE-Compatible — how to integrate
PolicyProtectedinto your contract - Managing Policy Engines — create the engine your target will use
- Managing Policies — create policy instances to attach to your target
- Protecting Target Functions — attach policies to specific functions on your target
- Coordinator API Reference — full API schema