# Changelog Source: https://www.activepieces.com/docs/about/changelog A log of all notable changes to Activepieces **September 2026** Agents: Reusable, Chattable, and Yours to Place ### Agents you can keep, talk to, and put where they belong An agent used to be a bag of settings inside one flow step. Now it is something you name, brief, talk to, and reuse. **Build one from a sentence** * **Describe the job**: the Agents page opens with a prompt box. Write *"summarise my unread emails every morning"* and you get a drafted agent — a name, instructions, and the tools it needs from the apps you have already connected. See [Create an agent](/docs/agents/create). * **It only reaches for what you asked for**: the draft picks actions that read your data, and adds one that sends, posts or files only when the sentence asks for it. * **Edit with AI**: describe a change in the editor — *"only reply to paying customers"* — and the instructions and tools are rewritten for you. Edits stay a draft until you press **Publish**, and publishing updates every flow already using the agent on its next run, with nothing to republish. **Where an agent lives** * **Choose the project up front**: new agents no longer land wherever you happened to be. The prompt box names the project and lets you change it, because the project decides which connections, flows and files the agent can reach. * **Move one later**: with a preview of what it costs first — the apps that have no connection in the new project, the people who lose a share, and the fact that tools which keep working now use the new project's accounts. See [Manage an agent](/docs/agents/manage). * **Deleting is honest about consequences**: an agent still running inside a published flow cannot be deleted or moved, and the flows are named so you know where to look. **Finding them** * The Agents page spans every project you can read, with search, sorting and a project filter answered by the server, so a long list stays complete and fast. **August 2026** AI-Ready Pieces: Tool Search, AI Metadata & Audience ### AI-ready pieces: tool search, AI metadata, and audience The piece catalog is now built for AI agents as much as for humans. An agent connected through the [MCP server](/docs/mcp/overview) can find the right action across hundreds of pieces by describing the task — then inspect its schema and run it. **Tool search** * **Search by task, not by name**: the new `ap_search_actions` and `ap_search_triggers` MCP tools take a plain-language description (*"send a message to a Slack channel"*) and return the most relevant actions or triggers, ranked by semantic similarity. See [Tool Search](/docs/mcp/tool-search). * **Honest no-match**: results below a relevance threshold are dropped rather than padded, so agents don't grab a wrong tool when nothing fits. * **Self-host ready**: turn it on with `AP_TOOL_SEARCH_ENABLED`; semantic ranking uses an OpenAI key, with a keyword fallback when none is configured. **AI metadata & audience** * **Agent-oriented descriptions**: actions and triggers across the catalog carry `aiMetadata` — a description written for agents plus an idempotency declaration for safe retries. See [AI Metadata](/docs/build-pieces/piece-reference/ai-metadata). * **Audience targeting**: actions can target humans, agents, or both — the visual builder shows the human view while agents discover the AI view, so agent-only atomic actions don't clutter the piece selector. * **Output schemas**: pieces can declare a labelled, formatted presentation of their step output, driving the builder's data selector and output viewer. See [Output Schema](/docs/build-pieces/piece-reference/output-schema). **June 2026** Production Setup: Lightweight Workers, Bundled Pieces & Predictable Scaling ### Production setup: lightweight workers, bundled pieces, and predictable scaling A ground-up overhaul of how Activepieces runs in production. The new shape is sized from a single number, your peak concurrent flows, and every piece of it is cheaper to run and easier to reason about. See the updated [Production Setup](/docs/install/configure-operate/production-setup). **Workers** * **New lightweight worker image**: a dedicated, slimmer Docker image for the execution tier. * **One flow per worker**: run workers at `AP_WORKER_CONCURRENCY=1` so each worker handles a single flow at a time. Recommended size is **0.5 vCPU / 1 GB** per worker; about 300 MB is warm-process overhead, leaving \~700 MB for the flow. * **No noisy neighbours**: every flow gets its own guaranteed CPU and memory slice, so one flow can't starve or crash another. See [Reserved Resources](/docs/install/guarantees/reserved-resources). * **Less to provision**: the pre-warm feature and worker persistent disks are no longer required; each worker fills its cache lazily and reaches steady-state on its own. **Pieces & flows** * **Pieces are now bundled**: each piece (and its dependencies) is compiled into a single small artifact, KB-scale instead of multi-megabyte module trees. Bundling is applied uniformly, so existing pieces shrink too. * **Faster cold boot**: less code to compile and only a trivial amount of ephemeral disk needed per run. * **Served from S3**: flow bundles and pieces are served and cached from your in-region object store (npm registry stays as a fallback), cutting install time from seconds to under 100 ms. See [S3 Storage](/docs/install/configure-operate/setup-s3). **Scaling** * **Arithmetic scaling**: for every 10 workers, add 1 app (a **1:10** app-to-worker ratio). * **Measured**: throughput scales near-linearly through 80 workers / 8 apps (484 req/s warm) and keeps climbing to 777 req/s at 160 workers, though the per-worker rate tapers as the database takes more of the load. Full methodology in the [Benchmark](/docs/install/architecture/benchmark). **Worker Groups** Reserve dedicated worker capacity for specific projects. A worker group is a **floor**, capacity a project's runs can always claim and no other project can take, complementing the soft-cap **ceiling** that limits how much a project may use. Shield your critical projects from noisy neighbours. See [Worker Groups](/docs/install/configure-operate/worker-groups). **April 2026** Waitpoints — Durable Pause & Resume for Flow Runs ### Waitpoints — durable pause and resume for flow runs Flows can now **pause mid-execution and resume later** without losing any state. The execution context is fully persisted so restarts, deployments, or extended wait times do not affect in-progress runs. Two pause types are available out of the box: * **Webhook waitpoints** — the flow pauses and resumes the moment a specific callback URL is called. The URL is unique to the run, carries the caller's request body, headers, and query parameters through to the next step, and supports both async and synchronous (respond-when-done) modes. * **Delay waitpoints** — the flow pauses until a scheduled timestamp and then resumes automatically, freeing up worker capacity during the wait. Both types survive worker restarts. If a resume signal arrives before the run has finished writing its paused state, it is buffered and replayed automatically — no lost callbacks. Read more: [Waitpoints](/docs/install/architecture/waitpoints) · [Durable Execution](/docs/install/architecture/durable-execution) **April 2026** Network Security ### Network Security Activepieces now ships with a built-in **network proxy that protects your automations from network attacks**. * **One switch to turn it on** — set `AP_NETWORK_MODE=STRICT` and the protection is active. It's **opt-in today**, but in an upcoming release it will become **opt-out** (on by default). * **Allow list for trusted internal services** — if a flow legitimately needs to reach an internal API or database, add its address (or a whole subnet like `10.10.0.0/24`) to `AP_SSRF_ALLOW_LIST`. * **Works with your corporate proxy** — if you already use `HTTP_PROXY` / `HTTPS_PROXY`, Activepieces respects them automatically. See the [Network Security](/docs/install/architecture/network-security) architecture page for the full breakdown. **April 2026** Shared Concurrency Pools ### Shared concurrency pools Projects can now share a single concurrency limit through **concurrency pools**, giving platform operators finer control over how worker capacity is distributed. * **Per-project concurrency** — set **Max Concurrent Jobs** directly in Project Settings > General. * **Shared pools** — multiple projects can be grouped into the same pool so they draw from one shared limit instead of each having its own. * **Embedding support** — when provisioning users via JWT, include `concurrencyPoolKey` and `concurrencyPoolLimit` claims to create or reuse a pool automatically. See [Provision Users](/docs/embedding/provision-users). ![Project Settings — Max Concurrent Jobs](https://mintcdn.com/activepieces/voeQOCG8sTBPJ08H/resources/screenshots/manage-concurrency.png?fit=max\&auto=format\&n=voeQOCG8sTBPJ08H\&q=85\&s=618b34b10c1416a4b3ae9a8e06dd4c72) Learn more in the [Manage Concurrency](/docs/admin-guide/guides/manage-concurrency) guide. **March 2026** Stability & Reliability Improvements ### Stability & reliability improvements Major investments in worker architecture, testing, and resilience to ensure more reliable flow execution. **Worker Architecture** * Complete worker rewrite (worker v2) focused on stability and reliability * New sandbox process model with improved error handling and resource cleanup **Testing & Quality — what we added and why it matters** Race condition tests: * **Queue dispatcher** (12 tests) — tests orphaned job handling when a job is dequeued but all waiters have timed out, prevents double-loop spawn during close with in-flight dequeue, verifies single dequeue concurrency control, tests waiter timeout and retry behavior * **Subflow resume** (8 tests) — tests the race condition where the engine writes pause metadata to Redis before it's persisted to DB, verifies Redis fallback when DB is stale, simulates concurrent reads/writes with spy mocks, covers sync endpoint with concurrent Redis updates * **Rate limiter** (5+ tests) — tests concurrent job slot allocation, idempotency with concurrent dispatch, per-project isolation so different projects don't interfere * **Concurrent flow execution** — end-to-end test creating 5 concurrent flow runs verifying none get stuck or deadlocked * **Memory lock** — verifies mutual exclusion (two concurrent lock acquire calls on same key are serialized) Worker unit tests: * **Worker polling** — tests job execution lifecycle, resilience to invalid job data, null polls, unrecognized job types, mixed valid/invalid sequences * **Sandbox execution** — tests sandbox creation, startup, RPC communication, stdout/stderr accumulation, resource cleanup on timeout or memory issues, process cleanup and listener removal * **Process forking** — tests execArgv configuration (memory limits, node options), environment variable propagation * **Cache logic** — tests cache hit/miss, disk persistence, memory caching, cache invalidation predicates * **Configuration** — tests config loading for different container types (WORKER\_AND\_APP vs WORKER) End-to-end validation: * **[Smoke tests](https://github.com/activepieces/activepieces/blob/main/.github/workflows/smoke-test.yml) in GitHub Actions** — validates health checks and webhook flow execution on AMD64 and ARM64 * **[Benchmark tests](https://github.com/activepieces/activepieces/blob/main/.github/workflows/benchmark.yml) in GitHub Actions** — load testing across 6 app/worker configurations measuring throughput, mean latency, P50, P99 ([see results](/docs/install/architecture/benchmark)) **Resilience** * Worker gracefully handles invalid job data, null polls, and unrecognized job types * Sandbox properly cleans up processes, listeners, and resources on timeout or memory issues * Race condition fixes for subflow resume and user interaction jobs **March 2026** Platform Admin ### Platform Admin — full UI redesign A comprehensive visual refresh across all Platform Admin and Project pages with a cleaner, more consistent interface. **Platform Admin** * **Projects** — filter chips, inline edit icons, and cleaner sidebar without branding * **Users** — new Role and Last Active columns, dedicated Invite button, and per-row action menus * **Project Roles** — switched from table to card-based layout with permission viewing * **Audit Logs** — fully enabled with Action, Performed By, Project, and Date Range filters, plus detail slide-over panels with a full JSON payload viewer * **Secret Managers** — card-based layout with Hashicorp Vault, AWS Secrets Manager, Cyberark Conjur, and 1Password * **Branding** — refreshed page layout **Project pages** * **Automations** — renamed from "Flows", with Type and Owner filters, search, step icon details, status toggles, and favorites * **Connections** — Pieces and Owner filters, flow usage count, inline edit and refresh actions * **Runs** — updated tab navigation and consistent styling **General improvements** * Unified tab navigation across Automations, Runs, and Connections * Platform Admin link added to the bottom of the project sidebar * Slide-over panels for detail views instead of full-page navigation * Previous / Next pagination style throughout * Sidebar header replaced with a "Back to app" link **March 2026** Staging Environment & Release Process ### Dedicated staging environment & improved release process All changes now go through a dedicated staging environment before reaching production. Every update is validated internally for a minimum of 16 hours before being promoted, ensuring higher reliability and fewer disruptions for our users. * **Staging-first deployment** — every change is tested in a production-like environment before going live * **Daily production promotions** — only validated, stable builds are promoted to production * **Weekly self-hosted releases** — predictable, stable releases published every week for self-hosted customers * **Emergency hotfix path** — critical fixes can still be fast-tracked to production when needed [Read more about our release cycle](/docs/handbook/engineering/onboarding/release-cycle) For previous releases, see the [GitHub Releases](https://github.com/activepieces/activepieces/releases) page. # i18n Translations Source: https://www.activepieces.com/docs/about/i18n This guide helps you understand how to change or add new translations. Activepieces uses Crowdin because it helps translators who don't know how to code. It also makes the approval process easier. Activepieces automatically sync new text from the code and translations back into the code. ## Contribute to existing translations 1. Create Crowdin account 2. Join the project [https://crowdin.com/project/activepieces](https://crowdin.com/project/activepieces) ![Join Project](https://mintcdn.com/activepieces/ki8mFooo8mAmhMdP/resources/crowdin.png?fit=max\&auto=format\&n=ki8mFooo8mAmhMdP\&q=85\&s=03c9dc5339937dbdea68c7d8ecf325ff) 3. Click on the language you want to translate 4. Click on "Translate All" ![Translate All](https://mintcdn.com/activepieces/ki8mFooo8mAmhMdP/resources/crowdin-translate-all.png?fit=max\&auto=format\&n=ki8mFooo8mAmhMdP\&q=85\&s=dd817de22d06df6fbb07e091103dc7cc) 5. Select Strings you want to translate and click on "Save" button ## Adding a new language * Please contact us ([support@activepieces.com](mailto:support@activepieces.com)) if you want to add a new language. We will add it to the project and you can start translating. # License Source: https://www.activepieces.com/docs/about/license Activepieces' **core** is released as open source under the [MIT license](https://github.com/activepieces/activepieces/blob/main/LICENSE) and enterprise / cloud editions features are released under [Commercial License](https://github.com/activepieces/activepieces/blob/main/packages/ee/LICENSE) The MIT license is a permissive license that grants users the freedom to use, modify, or distribute the software without any significant restrictions. The only requirement is that you include the license notice along with the software when distributing it. Using the enterprise features (under the packages/ee and packages/server/api/src/app/ee folder) with a self-hosted instance requires an Activepieces license. If you are looking for these features, contact us at [sales@activepieces.com](mailto:sales@activepieces.com). **Benefits of Dual Licensing Repo** * **Transparency** - Everyone can see what we are doing and contribute to the project. * **Clarity** - Everyone can see what the difference is between the open source and commercial versions of our software. * **Audit** - Everyone can audit our code and see what we are doing. * **Faster Development** - We can develop faster and more efficiently. > [!TIP] > > If you are still confused or have feedback, please open an issue on GitHub or send a message in the #contribution channel on Discord. # Capabilities Source: https://www.activepieces.com/docs/admin-guide/guides/ai-capabilities Give chat, agents and knowledge bases web search, web scraping, image generation and embeddings ## Overview Capabilities give the AI extra skills that the model can't do on its own, such as searching the web. You choose the service behind each one, once, for the whole platform. Builders don't need their own keys. Go to **Platform admin** → **AI Center** → **Capabilities**. ![Capabilities page](https://mintcdn.com/activepieces/H0ldfKIBwECfz9DC/resources/screenshots/ai-center-capabilities.png?fit=max\&auto=format\&n=H0ldfKIBwECfz9DC\&q=85\&s=94bd73bb2cd6278b440faadbd5507595) > [!NOTE] > > Capabilities are available on Cloud and self-hosted Enterprise. Community Edition doesn't have this page. ## The four capabilities The page has two groups. **Chat and agents** | Capability | What it does | Works with | | - | - | - | | **Web Search** | Searches the live web for current information. | A Tavily API key, or an AI provider key whose provider has built-in web search. | | **Web Scraping** | Reads any web page as clean text, including JavaScript pages. | A Firecrawl or Apify API key. | | **Image Generation** | Creates images, from photos to graphics with text. | A fal.ai API key, or an AI provider key plus the image model to use. | **Knowledge bases** | Capability | What it does | Works with | | - | - | - | | **Embeddings** | Indexes knowledge-base files so agents can search them. | An AI provider key plus the embedding model to use, for example OpenAI, Google, Azure or OpenRouter. | An AI provider key used for a capability must serve **all projects**. Add or edit keys on the [Providers](/docs/admin-guide/guides/setup-ai-providers) page. ## What the card shows The bottom of each card tells you where the capability stands: * **Using** and a name: the capability is on. The name is the service or key it runs on, followed by the model when there is one. * **Works with** and a list: nothing serves the capability yet. The list shows which keys can. When you haven't set a capability up, it may still work through your chat key. Web search and image generation use the key behind your [Default chat model](/docs/admin-guide/guides/setup-ai-providers#default-chat-model) when that provider supports them. Embeddings use the chat key when it supports embeddings, and otherwise your AI credits. In that case the card already shows **Using** with that key's name. ## Set up a capability **1. Open the card** Click **Set up** on the capability. If it is already in use, the button says **Change**. **2. Pick the source** When there is more than one option, pick it under **Source**: one of your AI provider keys or an outside service. **3. Enter the details** For an outside service, paste its API key. The dialog links to where you get one. For an AI provider key, pick the **Image model** or **Embedding model** when the capability needs one. **4. Save** Click **Save**. If no key can serve **Embeddings**, the card shows **Connect a provider** instead. Add a key that serves all projects and supports embeddings first. > [!WARNING] > > Changing the Embeddings key or model doesn't re-index files. Files already in knowledge bases keep their old vectors. Re-upload them to search with the new key or model. ## Reset a capability Hover the card and click the trash icon to **Reset** it. This removes the saved API key or key choice. The capability then goes back to your chat key, if that key supports it. Otherwise it turns off. ## Providers vs capabilities **Providers** connect the AI models that chat, agents and AI steps run on. **Capabilities** add skills on top of those models: web search, web scraping, image generation and embeddings. ## Related * [Providers and keys](/docs/admin-guide/guides/setup-ai-providers) * [Knowledge bases](/docs/agents/knowledge) * API reference: [list capabilities](/docs/endpoints/ai-capabilities/list), [set up](/docs/endpoints/ai-capabilities/set-up), [update](/docs/endpoints/ai-capabilities/update), [reset](/docs/endpoints/ai-capabilities/reset). # Tiers Source: https://www.activepieces.com/docs/admin-guide/guides/ai-tiers Group models from your keys into named choices, with fallbacks, for your builders ## Overview A **tier** is a named group of models that builders pick instead of a raw model id, for example **Expert** or **Everyday**. Each tier has: * A **name**, an **emoji** and a short **description**. Builders see these when they pick a model. * A **main model**, tried first. * Up to **4 fallbacks**, tried in order when the main model can't serve a request. Fallbacks can come from different keys and providers. * A **thinking** budget: Default, Off, Low (5,000 tokens), Medium (10,000 tokens) or High (20,000 tokens). Only models that support reasoning use it. Tiers show up in the model picker for chat, agents, Run Agent steps and AI text steps. When you swap the model behind a tier, every flow and agent that uses the tier moves with it. Nothing needs to be edited. Go to **Platform admin** → **AI Center** → **Tiers**. ![Tiers page with three tiers](https://mintcdn.com/activepieces/H0ldfKIBwECfz9DC/resources/screenshots/ai-center-tiers.png?fit=max\&auto=format\&n=H0ldfKIBwECfz9DC\&q=85\&s=188d403c398d29c96544e8906a9f675c) > [!NOTE] > > On Cloud, **Tiers** is in the AI Center menu. On self-hosted, open it by URL: `/platform/ai/tiers`. Tiers are built from your own keys, so add a key on the [Providers](/docs/admin-guide/guides/setup-ai-providers) page first. ## Create a tier **1. Start a new tier** Click **New tier**. **2. Name it** Pick an emoji, enter a name (up to 40 characters) and an optional description (up to 120 characters). **3. Pick the main model** Choose the main model from any of your keys. Only models the key allows are listed. **4. Set thinking and save** Choose a thinking budget, then click **Save tier**. **5. Add fallbacks** On the tier card, click **Add fallback** and pick a model. Repeat for up to 4 fallbacks. Models whose key is **Active** are tried first, in tier order. A model whose key is marked **Out of credits**, **Key rejected** or **Unreachable** moves behind them, so an active fallback can serve a request before the main model is retried. Within that order, the next model is used when the one before it fails at the provider, for example a rate limit, an outage, an expired key or no credits left. Without a fallback, the tier fails when its main model is unavailable. To change a model, use the **...** menu on its row: **Change main model**, **Move up**, **Move down** or **Remove**. ## Default and fast tiers Use the **...** menu on a tier card: * **Make default**: the tier builders get when they haven't picked a model. It is marked **Default**. * **Use as fast model**: chat and agent runs use this tier for quick, light steps. It is marked **Fast**. The default tier is not the same as the [Default chat model](/docs/admin-guide/guides/setup-ai-providers#default-chat-model). New chats start on the Default chat model, and use the default tier only when that model can't run. ## Reorder and edit The order of the cards is the order builders see. Use **Move up** and **Move down** in a tier's **...** menu to change it. Use **Edit** to change the name, emoji, description or thinking. To change the main model, use **Change main model** in the model row's **...** menu. ## Delete a tier Click **Delete** in the tier's **...** menu, then pick a tier under **Move them to**. Everything that used the deleted tier now runs on the tier you picked. If the deleted tier was the default or the fast tier, the tier you picked takes that role. You can delete your last tier without picking a replacement. Anything still using it stops working until someone picks a new model. If you had hidden specific models, they are shown to builders again, so builders still have something to pick. ## Tiers follow key project access Each key can be limited to some projects (see [Access](/docs/admin-guide/guides/setup-ai-providers#access)). Tiers respect that: * A tier is offered in a project only when its **main model's key** serves that project. * A **fallback** whose key doesn't serve a project is skipped there. The tier card warns you when this happens, for example "Not available in 1 project" or "Fallback ... is skipped in 2 projects". To check one project, pick it in the **Preview as project** list at the top of the page. This list shows up when at least one key is limited to some projects. A key that a tier uses can't be deleted, and you can't remove a tier's model from that key's model list. Change the tier first. ## Specific models Below the tiers, **Specific models** lists the models on your keys that are not a tier's main model. Builders can pick these directly. Click **Make a tier** on a model to start a tier from it. Use the **Visible** / **Hidden** switch to choose what builders see: * **Visible**: builders can pick tiers and specific models. * **Hidden**: builders only see tiers. You need at least one tier first. Hiding specific models only changes the picker. Flows and agents that already use a specific model keep running. ## Related * [Providers and keys](/docs/admin-guide/guides/setup-ai-providers) * API reference: [list tiers](/docs/endpoints/ai-model-tiers/list), [create](/docs/endpoints/ai-model-tiers/create), [reorder](/docs/endpoints/ai-model-tiers/reorder), [update](/docs/endpoints/ai-model-tiers/update), [delete](/docs/endpoints/ai-model-tiers/delete). # Connections Source: https://www.activepieces.com/docs/admin-guide/guides/connections Connections are the individual accounts of third-party apps or integrations connected to your Activepieces platform. For example, when a user connects their Gmail account to Activepieces, that account is registered as one connection. If two users connect their individual Gmail accounts, Activepieces registers them as two separate connections, even though they both use the same Gmail piece. **Example:** Employee 1 Gmail **=** Connection 1 Employee 2 Gmail **=** Connection 2 ![Connections Tab](https://cdn.activepieces.com/assets/connections-tab.png "Connections Tab") The Connections page in Platform Admin gives administrators a detailed view of all app connections across every project on the platform. You can filter connections by **name, status, piece, project, and owner**. For each connection, you can see: * Its current status * The piece or app it belongs to * The project and owner associated with it * When the connection was created * The scope (whether it is available to specific projects or is a **Global Connection**) If it is a Global Connection, you can also see the different projects that have access to that connection. Learn more about [Connections vs Global Connections](https://app.mintlify.com/activepieces/activepieces/editor/ginika%2Fdraft-aug-31/~/766e454b-da15-4ea1-9e26-de1c537fc45b) As more teams build automations, the number of connected accounts can grow quickly. The Connections page gives platform admins a single place to see which accounts are connected, who owns them, where they are used, and whether they are still active. For example, if an employee leaves the company, an admin can use the **Owner** filter to identify connections associated with that user and understand which projects may depend on them. Regularly reviewing connections can also help identify outdated ones  ### **Navigating Connections Via API** Refer to [API reference](https://www.activepieces.com/docs/endpoints/connections/schema) # Embedding Source: https://www.activepieces.com/docs/admin-guide/guides/embedding Embedding lets you make Activepieces automation capabilities available inside your own product or website. The Embed Onboarding page helps platform admins configure the platform-level settings required before embedding Activepieces into an application. ### Set up Embedding The onboarding process has four steps: 1. **Enter the embed URL:** Enter the domain where you want to embed Activepieces. Use a subdomain that your organization controls, for example: flows.acme.com Click Save domain to continue. 2. **Verify the DNS records:** Configure the provided DNS records for your domain and complete the verification process. This connects the domain you entered to your Activepieces embedded environment. 3. **Add allowed domains:** Add the domains that are allowed to host your embedded Activepieces experience. This lets you control which applications or websites can use the embedded experience. 4. **Add signing keys:** Add the signing keys required for your embedded setup. These keys are used as part of the authentication process between your application and Activepieces. ### **Learn more about Embedding** This page covers the **platform-level setup** for Embedding. For the complete guide to embedding Activepieces in your application, including user provisioning, authentication, and the **Embed SDK**, see the [Embedding documentation](/docs/embedding/overview). # Event Streaming Source: https://www.activepieces.com/docs/admin-guide/guides/event-streaming Stream audit events to Datadog, PostHog, Grafana Loki, or any OpenTelemetry backend, or to a webhook as raw JSON ## Overview Event Streaming sends every platform [audit event](/docs/admin-guide/security/audit-logs/overview) to a destination of your choice, as it happens. Each destination has a **format**: * **OpenTelemetry (OTLP).** Each event is sent as an OpenTelemetry log record over OTLP/HTTP. This works with Datadog, PostHog, Grafana Loki, Grafana Cloud, New Relic, Honeycomb, Dynatrace, Elastic, SigNoz, Axiom, Better Stack, and any other backend that accepts OTLP logs. No collector or agent is needed in between. * **Raw JSON.** The audit event is posted as-is to any webhook URL. Point it at a flow inside Activepieces and route each event to Slack, Gmail, Microsoft Teams, custom HTTP, and so on. Use it to react to flow run failures, new sign-ins, project releases, or any other audit event with the tools you already use. ## Quick start Creating a destination is a three-step page: **Destination**, **Events**, and **Connection**. 1. Open **Platform Admin → Security → Audit Logs → Event Streaming** and click **New Destination**. 2. **Destination** — pick **Send to an OpenTelemetry tool** or **Send to a webhook**. This choice sets the format, and you cannot change it once the destination is created. 3. **Events** — select the events to send. 4. **Connection** — paste the endpoint URL and add any headers the endpoint needs, such as an API key. For an OpenTelemetry tool, also pick the encoding. For a webhook, you can click **Generate handler flow** instead of pasting a URL, and Activepieces builds a flow to handle the events (see below). Use **Send test event** to fire a sample of any selected event. 5. Click **Create destination**. ### Generate a handler flow Pick **Send to a webhook** on the Destination step, then click **Generate handler flow** on the Connection step. It builds a webhook-triggered flow with one router branch per event you selected, plus a nested branch for failed runs when you pick `flow.run.finished`. It fills the endpoint URL in for you. A webhook destination sends **Raw JSON**, which is the shape the generated flow routes on. ![Event destination handler flow](https://mintcdn.com/activepieces/SzLuaTKoM9EbhYdT/resources/screenshots/event-destination-flow.png?fit=max\&auto=format\&n=SzLuaTKoM9EbhYdT\&q=85\&s=3ddd28fcbd058d5d3a0b1dcb367b36eb) The flow lands in your personal project with sample data pre-baked, so you can hit Test right away. Add a router step under any event branch to check for specific project or flow ids, customize the branches with whatever pieces you like, then publish the flow and save the destination. ## Formats ### OpenTelemetry Each event becomes one OTLP log record inside an `ExportLogsServiceRequest`, posted to the endpoint URL. Pick an encoding: * **Protobuf** (recommended) — `Content-Type: application/x-protobuf`. This is the OTLP default and works with every backend listed below. Datadog, Dynatrace, and Elastic document only this encoding. * **JSON** — `Content-Type: application/json`, the OTLP/JSON encoding. Pick it only when your receiver accepts JSON and not protobuf. > [!WARNING] > > Paste the **full OTLP logs URL**, including its path — for example `https://otlp.datadoghq.com/v1/logs`. Activepieces posts to the URL exactly as you enter it and does not append `/v1/logs`. The path differs between vendors: Grafana Loki uses `/otlp/v1/logs` and PostHog uses `/i/v1/logs`. Every log record carries: | OTLP field | Value | | - | - | | `resource.attributes` | `service.name` = `activepieces` | | `scope.name` | `activepieces.event-streaming` | | `timeUnixNano` | when the event happened (the event's `created`) | | `eventName` | the event name, for example `flow.run.finished` | | `severityText` / `severityNumber` | `INFO` / `9` | | `body` | the full audit event as a JSON string — the same bytes the Raw JSON format sends | | `attributes` | `action`, `id`, `platformId`, `projectId`, `projectDisplayName`, `userId`, `userEmail`, `ip`, plus every field of `data` as a dotted key, for example `data.flowRun.status` | An attribute is left out when the event does not have that field. Lists inside `data` are sent as one JSON string. Because every field is an attribute, you can filter and alert on it in your backend without a parser — for example `data.flowRun.status:FAILED` in Datadog. Here is a `flow.run.finished` event in the OTLP/JSON encoding (the body string and some attributes are shortened): ```json theme={null} { "resourceLogs": [{ "resource": { "attributes": [{ "key": "service.name", "value": { "stringValue": "activepieces" } }] }, "scopeLogs": [{ "scope": { "name": "activepieces.event-streaming" }, "logRecords": [{ "timeUnixNano": "1790158542318000000", "severityNumber": 9, "severityText": "INFO", "eventName": "flow.run.finished", "body": { "stringValue": "{\"id\":\"Qz3vN8kLp2XwR7tY1mB4c\",\"action\":\"flow.run.finished\",\"data\":{...}}" }, "attributes": [ { "key": "action", "value": { "stringValue": "flow.run.finished" } }, { "key": "platformId", "value": { "stringValue": "Hd8sK2mWq9LxT4vB7nP1e" } }, { "key": "projectDisplayName", "value": { "stringValue": "Finance Ops" } }, { "key": "data.flowRun.duration", "value": { "intValue": "5214" } }, { "key": "data.flowRun.flowDisplayName", "value": { "stringValue": "Invoice sync" } }, { "key": "data.flowRun.status", "value": { "stringValue": "FAILED" } } ] }] }] }] } ``` ### OpenTelemetry endpoints | Backend | Logs endpoint | Authentication header | Encoding | | - | - | - | - | | Datadog | `https://otlp./v1/logs` — `` is `datadoghq.com`, `us3.datadoghq.com`, `us5.datadoghq.com`, `ap1.datadoghq.com`, `ap2.datadoghq.com`, `uk1.datadoghq.com`, `datadoghq.eu`, or `ddog-gov.com` | `dd-api-key: ` | Protobuf | | Datadog Agent (7.48+) | `http://:4318/v1/logs` — set `DD_OTLP_CONFIG_LOGS_ENABLED=true` on the Agent | none | Protobuf | | PostHog | `https://us.i.posthog.com/i/v1/logs` | `Authorization: Bearer ` | Protobuf or JSON | | Grafana Loki 3.x | `http:///otlp/v1/logs` — needs schema v13 with structured metadata | `X-Scope-OrgID: ` when multi-tenant | Protobuf or JSON | | Grafana Cloud | `https://otlp-gateway-prod-.grafana.net/otlp/v1/logs` — copy it from your stack's OpenTelemetry tile | `Authorization: Basic ` | Protobuf or JSON | | New Relic | `https://otlp.nr-data.net/v1/logs` (EU: `https://otlp.eu01.nr-data.net/v1/logs`) | `api-key: ` | Protobuf | | Honeycomb | `https://api.honeycomb.io/v1/logs` (EU: `https://api.eu1.honeycomb.io/v1/logs`) | `x-honeycomb-team: ` | Protobuf or JSON | | Dynatrace | `https://.live.dynatrace.com/api/v2/otlp/v1/logs` | `Authorization: Api-Token ` | Protobuf | | Elastic Cloud | the managed OTLP endpoint from the Cloud console, plus `/v1/logs` | `Authorization: ApiKey ` | Protobuf | | SigNoz Cloud | `https://ingest..signoz.cloud:443/v1/logs` | `signoz-ingestion-key: ` | Protobuf | | Axiom | `https:///v1/logs` | `Authorization: Bearer ` and `x-axiom-dataset: ` | Protobuf | | Better Stack | `https:///v1/logs` | `Authorization: Bearer ` | Protobuf | Where the table says Protobuf, pick **Protobuf**: the backend documents no JSON support. Splunk has no direct OTLP logs endpoint: run your own OpenTelemetry Collector with the Splunk HEC exporter and point the destination at the collector. ### Raw JSON The destination receives the audit event itself as the JSON body, with `Content-Type: application/json`. This is also what every destination created before formats existed keeps sending. * `action` — the event name (for example `flow.run.finished`). * `data` — event-specific payload, including details like the flow id, run id, status, or affected user. * `id`, `created`, `updated` — event identifiers and timestamps. * `platformId`, `projectId` — context fields present on every event. * `userId`, `userEmail`, `ip` — who did it and from where. These are filled in for events that come from a user request. The four `flow.run.*` events are emitted by a worker rather than a request, so they carry none of them. A handler flow on this instance gets the JSON of its destination's format: the raw event for Raw JSON, and the OTLP/JSON request for the OpenTelemetry JSON encoding. A flow webhook accepts only JSON, so a destination that points at one cannot use the Protobuf encoding: the setup page switches it to JSON (and back to Protobuf if you then enter a URL that is not a flow webhook, unless you picked JSON yourself), and the API rejects Protobuf for a flow webhook URL with a `400`. ## Headers Add any headers the endpoint requires — an `Authorization` bearer token, a `dd-api-key`, an `X-Scope-OrgID`, and so on. The delivery sets `Content-Type` from the format, and it also owns `Content-Length`, `Content-Encoding`, `Transfer-Encoding`, `Host`, and `Connection`, so none of these can be added as a custom header. A header name may appear only once, whatever its letter case. A handler flow on this instance receives the custom headers too, with lowercase names, exactly as an HTTP request to its webhook would. A Catch Webhook trigger that uses header or basic authentication can check them. Header values are **encrypted at rest and write-only**. When you reopen a destination, saved keys are listed with an empty value and the placeholder *Hidden — type to replace*: * Leave a value empty to keep the stored value. * Type a new value to replace it. * Delete the whole row to remove the header. Values are masked as you type; select the eye icon to show one. The API behaves the same way: `GET` returns each header key with a `null` value, and sending `null` for a key on update keeps whatever is stored. A stored value is bound to the URL it was saved against. **If you change the URL, you must re-enter every header value in the same save** — as soon as you change the URL, the form asks for a new value on each saved header you have not retyped, and the API answers `400` if an update changes the URL while keeping a stored value. This is what makes "write-only" true: without it, anyone who can edit a destination could point it at their own endpoint and have the next audit event deliver the secret for them. ## Test, enable, and disable **Send test event** on the Connection step builds a sample of the event you choose and delivers it in the selected format. It reports the HTTP status code, the round-trip time, and the body that was sent, so you can confirm the shape before you save. For the Protobuf encoding the body is shown in its OTLP/JSON form, since protobuf bytes are not readable. A test never reads a stored header value. It sends only the values typed into the form, so on a saved destination you must retype a secret to test with it. The button stays disabled, with a note, while any header value is blank or a header has an error. If the API refuses the test request itself, the card shows the reason. A result stays on screen only while the URL, headers, encoding, and event still match what was sent. Each destination has an **Enabled** switch on the listing page. A disabled destination keeps its configuration but receives nothing. The switch changes only that setting; if the change fails, it flips back and a message shows the reason. ## Available events You can subscribe a destination to any audit event — flow lifecycle, run status, folder/connection changes, user activity, and platform admin actions. See the [Audit Log Events catalog](/docs/admin-guide/security/audit-logs/overview#event-catalog) for the full list and per-event payload details. ## Requirements * **Enterprise Edition**: Event Streaming requires a plan with Event Streaming enabled. Without it, no events are delivered. * **Platform admin**: only platform admins can configure destinations. * **HTTPS endpoint**: use HTTPS for any external endpoint. Audit events carry user emails and IP addresses, and Activepieces does not reject an `http://` URL for you. * **Publicly accessible**: external endpoints must be reachable from your Activepieces server. Handler flows on this same instance are delivered internally, so they work even when the instance is not publicly reachable (for example, behind an internal load balancer). ## Troubleshooting * **Events not received**: check the destination is enabled. For external endpoints, verify they are reachable from your server and return 2xx status codes. For a handler flow on this instance, make sure the flow is published and enabled. * **`404` from an OpenTelemetry backend**: the URL is missing the logs path. Paste the full logs URL from the table above, not the base URL. * **`415` or a decode error from an OpenTelemetry backend**: the backend does not accept the selected encoding. Switch the encoding to **Protobuf**. * **Test fails**: check that your URL is valid and uses HTTPS. The test reports the status code returned by the endpoint, which usually names the problem. * **Missing events**: make sure the event type is selected in your destination configuration. * **A field is missing**: the field is not on that event. The four `flow.run.*` events carry no `userId`, `userEmail`, or `ip`, because a worker emits them rather than a user request. ## See also * [Audit Logs](/docs/admin-guide/security/audit-logs/overview) — view every event recorded on your platform # General Source: https://www.activepieces.com/docs/admin-guide/guides/general This is where you can change the basic appearance of your platform You can change the platform name, icon, logo, favicon, primary color, and the danger, warning and success colors. Each color sets its whole scale in light and dark mode, and **Reset** puts a status color back on the standard palette. You also have the **Danger Zone,** which is where you can delete your platform. **NB:** Once your platform is deleted, it cannot be recovered. Ensure you cancel your subscription before deleting your platform. ![General](https://cdn.activepieces.com/assets/general.png "General") # Global Connections Source: https://www.activepieces.com/docs/admin-guide/guides/global-connections Global Connections enable platform admins to create and manage connections to external apps that can be shared across multiple projects. Instead of every project or user creating a separate connection to the same account, an organization can create one connection and make it available to the projects that need it. For example, if several departments need to send emails from the same company Gmail account, an admin can create it as a Global Connection and give the appropriate projects access to it. ### **Viewing Global Connections** The **Global Connections** page gives platform admins an overview of the global connections configured on the platform. For each connection, you can see: * **Name**: The app or integration connected * **Status**: Whether the connection is currently active * **Connected At**: When the connection was created * **Projects**: How many projects have access to the connection You can also search for connections and filter them by status. ### **Create a Global Connection** You can create a new global connection using either  * **OAuth2**: Quickly connect using a preconfigured OAuth2 app. No setup required. * **Custom OAuth2 App (Advanced)**: Connect using your own OAuth2 credentials for more flexibility and control. * **Service Account (Advanced):** Connect using service account credentials for secure, non-user-based access to an external application. **OAuth2** **Step 1**: Go to **Platform Admin → Platform → Connections → Global Connections**. **Step 2**: Click **New Connection**. **Step 3**: Select the app you want to connect. **Step 4**: Select which projects the connection should be available for **Step 5**: Select if you want that connection to be included by default in new projects  **Step 6**: Select the permissions you want that connection to have **Step 7**: Click Connect and follow the authentication instructions **Step 8:** Click Save