# Extensions https://api-docs.lumar.io/docs/extensions Extensions are pre-built **Custom Metric Containers** that you can easily enable on your projects to unlock additional capabilities. ## Available Extensions Some of the popular extensions include: - **Store HTML**: Stores the HTML of each page as it appeared at the time of crawling. - **Store Screenshots**: Stores a screenshot of each page as it appeared at the time of crawling. You can discover all available global extensions by fetching them from either the Account or Project level: **List global containers (Account)** ```graphql query GetGlobalContainersFromAccount($accountId: ObjectID!, $globalContainersCursor: String) { getAccount(id: $accountId) { availableGlobalCustomMetricContainers(first: 100, after: $globalContainersCursor) { pageInfo { hasNextPage endCursor } edges { node { id name displayName description requiredAddons requiresAiFeatures costs { moduleCode cost } keyFeatures relatedContainerNames } } } } } ``` **Variables:** ```json { "accountId": 123, "globalContainersCursor": null } ``` **List global containers (Project)** ```graphql query GetGlobalContainersFromProject($projectId: ObjectID!, $globalContainersCursor: String) { getProject(id: $projectId) { availableGlobalCustomMetricContainers(first: 100, after: $globalContainersCursor) { pageInfo { hasNextPage endCursor } edges { node { id name displayName description requiredAddons requiresAiFeatures costs { moduleCode cost } keyFeatures relatedContainerNames } } } } } ``` **Variables:** ```json { "projectId": "725158", "globalContainersCursor": null } ``` ### Costs and Availability Extensions may have associated costs. The `costs` field in the query response provides this information: - If `costs` is `null`, the extension is **free** and available for all project types. - If `costs` contains specific module codes (e.g., `SEO`), the price applies only to projects with those modules. - The `cost` field indicates the price. ### Required Add-ons Some extensions rely on specific platform features. Check the `requiredAddons` field to see if an extension needs any additional add-ons enabled on your account. ### Required AI Features Some extensions require AI features to be enabled on the account. The `requiresAiFeatures` field indicates whether an extension depends on AI capabilities. If `true`, the extension will only function if AI features are active for the account. ## Enabling an Extension To use an extension on your project, you need to link the container to your project. **Link container to project** ```graphql mutation LinkContainerToProject($input: LinkCustomMetricContainerToProjectInput!) { linkCustomMetricContainerToProject(input: $input) { customMetricContainerProject { project { id } customMetricContainer { id } enabled } } } ``` **Variables:** ```json { "input": { "projectId": "725158", "customMetricContainerId": "TjAyMUN1c3RvbU1ldHJpY0NvbnRhaW5lcjI3Ng" } } ``` ## Listing Linked Extensions You can find which extensions are already linked to your project using the following query: **List linked containers** ```graphql query GetCrawlSettingsForExtensions($projectId: ObjectID!, $projectContainersCursor: String) { getProject(id: $projectId) { id moduleCode customMetricContainerProjects(first: 100, after: $projectContainersCursor) { pageInfo { hasNextPage endCursor } edges { node { project { id } customMetricContainer { id } enabled } } } } } ``` **Variables:** ```json { "projectId": "725158" } ``` ## Managing Extensions Once an extension is linked to a project, you can toggle its status (enable/disable) without removing the link. **Toggle extension status** ```graphql mutation UpdateContainerProject($input: UpdateCustomMetricContainerProjectInput!) { updateCustomMetricContainerProject(input: $input) { customMetricContainerProject { project { id } customMetricContainer { id } enabled } } } ``` **Variables:** ```json { "input": { "projectId": "725158", "customMetricContainerId": "TjAyMUN1c3RvbU1ldHJpY0NvbnRhaW5lcjI3Ng", "enabled": false } } ```