Customer-managed egress and remotes are currently available through Forge's Early Access Program (EAP). EAP capabilities are experimental, unsupported, and subject to change without notice, and are not recommended for production use.
For more details, see Forge EAP, Preview, and GA.
Customer-managed egress and remotes are a way of defining egress in your app. They let customers and admins control which external services your app can talk to, and when those connections are enabled.
In other implementations, Forge apps must declare all possible egress destinations up front, which limits customer choice and can introduce unnecessary security risks.
Customer-managed egress enables apps to declare and manage their egress and remotes per installation, instead of listing every destination in the manifest. This approach improves trust for customers by giving them more visibility and control over data flows, and provides more flexible integration options.
Consider using customer‑managed egress and remotes when:
Customer‑managed egress and remotes must not be used to request pre‑defined, required egress.
If your app always needs to talk to specific external domains that are fixed or pre‑set, you must declare those via static external permissions and remotes, rather than prompting admins to approve them immediately via customer‑managed egress.
If your app always talks to the same fixed set of external destinations, you can keep using static external permissions and remotes.
Instead of declaring every external destination up front in manifest.yml, your app can:
Forge apps that use customer‑managed egress or customer‑managed remotes are not eligible for Runs on Atlassian. For more information, see Limitations and compatibility.
permissions.external.* model.In practice, you will usually:
The customer-managed egress data model is based on the idea of an egress group. A group may have one or more egress entries defined. Grouping makes it easier for an admin to understand what a particular egress is related to.
An example egress group looks like:
1 2{ "key": "egress-group", "description": "Access to example.com", "configured": [ { "domain": "https://api.example.com", "type": ["FETCH_BACKEND_SIDE", "FETCH_CLIENT_SIDE"] }, { "domain": "https://media.example.com", "type": ["IMAGES", "MEDIA"] }, { "domain": "https://cdn.example.com", "type": ["FONTS", "SCRIPTS", "STYLES"] } ] }
Field details
| Field | Type | Description |
|---|---|---|
key | string | A key for the egress group that is defined by the Forge app. |
description | string | A user‑facing description for this egress group. |
configured[].domain | string | A URL or wildcard that will be used to fetch resources from. |
configured[].type | EgressType[] |
The type(s) of allowed egress. These map to the existing manifest egress types documented in Add content security and egress controls. There is an enum
|
The data model for a customer-managed remote looks like:
1 2{ "key": "external-api", "configured": { "endpoint": "https://api.external.com" } }
Field details
| Field | Type | Description |
|---|---|---|
key | string | Must correlate to a remote key defined in the manifest. |
endpoint | string (URL) | The absolute URL for the remote as defined by the admin of your app (inside configured). |
To enable customer‑managed egress, enable the feature in your app manifest:
1 2permissions: external: configurable: enabled: true
If this property is not true, any calls to the egress APIs will fail.
This property is required for egress and remotes, but a customer-managed remote requires one additional
property to be set.
Customer-managed remotes are defined in the manifest similarly to existing remotes, but add a configurable object describing how admins can configure the endpoint URL. A customer-managed remote must be specified in the manifest, arbitrary remotes cannot be configured.
Basic example:
1 2remotes: - key: my-site-1 configurable: name: "My site" description: "This will be used to make connections to My Site" supportedPatterns: - "*.example.com"
Key points:
key is still required; remotes are always keyed values.baseUrl becomes optional when configurable is defined. If you omit baseUrl, the remote is purely customer‑configured.configurable object provides:
name and description: Used in the Atlassian Administration Connected Apps UI and in in‑app modals to explain what the remote is used for.supportedPatterns: An optional array of patterns used to validate admin‑provided URLs. This accepts any string values, including a single * wildcard character. Validation for these will be performed in Admin Hub, and server-side. If a URL is provided that does not match a specified pattern, setting the remote will be rejected.For example, to provide a default baseUrl while still allowing customers to override it:
1 2remotes: - key: my-site-1 baseUrl: "https://default.example.com" configurable: name: "My site" description: "This will be used to make connections to My Site" supportedPatterns: - "*.example.com"
Customer-managed remotes are not eligible for data residency. A remote must not have configured for it to be eligible.
Once the manifest is configured, your app can interact with customer‑managed egress and remotes at runtime using the Forge bridge.
All customer-managed egress and remotes APIs:
permissions module in @forge/bridge.permissions.external.configurable.enabled: true in the manifest.There are six async Forge bridge functions available in @forge/bridge:
permissions.egress.getpermissions.egress.setpermissions.egress.deleteDomainpermissions.egress.deleteGrouppermissions.remote.setpermissions.remote.getFor detailed arguments and TypeScript types, see the API documentation.
Customer‑managed egress and remotes are designed to be understandable and controllable for admins. An admin’s primary experience is usually within the context of your app, but some functionality is also available in Connected Apps in Atlassian Administration.
When a Forge app invokes the set operations for egress or remotes, an admin will see a modal asking them to confirm the addition or change. If the permissions.external.configurable.enabled is not true, this will be rejected.
If egress has already been configured for a particular domain and that domain is reused for a different type, the modal is not shown again for the same domain.
When viewing a specific app after navigating to Connected Apps in Atlassian Administration, and selecting an app, the Data management tab provides:
This gives admins a centralized place to review data flows across multiple apps in their organization.
The customer-managed egress and remotes APIs are designed so that admins must be in control of any changes:
For detailed API behaviour and type definitions, see the Forge bridge permissions reference.
configurable field to a Connect remote will be rejected.Rate this page: