Extensions
Extensions provide the delegates behind conditions, actions, and data elements. This page focuses on installed extension instances inside a property. Use Extension packages & authorizations when you are working with packaged distribution rather than installed instances.
Extensions
| Attribute | Data type | Description |
|---|---|---|
| list_for_property(property_id) | Array<Extension> | Lists extensions installed in the property. |
| create(property_id:, attributes:, relationships:) | Extension | Creates an extension instance in the property. |
| revise(extension_id) | Extension | Revises the extension for library workflows. |
| upstream_chain(extension_or_id, library_id:, property_id:) | UpstreamChain | Resolves the extension across the upstream library chain for a specific library context. |
| find_comprehensive(extension_id, library_id:, property_id:) | ComprehensiveExtension | Returns the extension from a library-context review snapshot together with dependent data elements, rule components, rules, and normalized review payload. |
| comprehensive_upstream_chain(extension_or_id, library_id:, property_id:) | ComprehensiveUpstreamChain | Resolves the extension upstream with snapshot-aware dependent records and normalized JSON. |
| extension_package(extension_id) | ExtensionPackage | Traverses from an installed extension to its backing extension package. |
Comprehensive review
Extension review object
# EX123 = extension ID.
# LB_DEV = library ID.
# PR123 = property ID.
review_extension = client.extensions.find_comprehensive(
"EX123",
library_id: "LB_DEV",
property_id: "PR123"
)
# Dependent resources from the same library snapshot.
puts review_extension.data_elements.map(&:name).inspect
puts review_extension.rule_components.map(&:name).inspect
puts review_extension.rules.map(&:name).inspect
# Pretty JSON intended for code review or diff tooling.
puts review_extension.normalized_json
Upstream lookup
Upstream lookup is library-contextual, not just resource-contextual. That is
why the helper asks for both library_id and property_id: the same rule,
data element, or extension can appear in multiple libraries, and the correct
upstream answer depends on which library you are comparing from.
Use client.extensions.comprehensive_upstream_chain(...) when you need the dependent resources and normalized JSON, not just the lean upstream revision lookup.
Raw API mapping
Sample: list installed extensions for a property
GET /properties/:property_id/extensions
# PR... = property ID.
# Request all installed extension instances for the property.
curl -s "https://reactor.adobe.io/properties/PR1234567890abcdef1234567890abcd/extensions" \
-H "Authorization: Bearer YOUR_ACCESS_TOKEN" \
-H "x-api-key: YOUR_ADOBE_CLIENT_ID" \
-H "x-gw-ims-org-id: YOUR_IMS_ORG_ID" \
-H "Accept: application/vnd.api+json;revision=1"
Sample response
{
// Collection response for installed extension instances.
"data": [
{
// EX... = extension instance ID.
"id": "EX1234567890abcdef1234567890abcd",
"type": "extensions",
"attributes": {
// Human-readable extension name.
"name": "Core",
// Delegate that identifies the extension configuration type.
"delegate_descriptor_id": "core::extensionConfiguration::config",
// Serialized extension settings.
"settings": "{}",
// Adobe creation timestamp.
"created_at": "2026-03-26T09:58:22.000Z",
// Adobe last-update timestamp.
"updated_at": "2026-03-26T09:58:22.000Z",
// Publish timestamp, or null while unpublished.
"published_at": null
}
}
]
}