Connectors Reference
A field guide to Power Automate & Power Apps connectors — what a connector actually is, triggers vs actions, standard vs premium (and what that costs you in licensing), polling vs webhook triggers and their wake-up intervals, connections and connection references for ALM, custom and on-premises connectors, plus the limits that bite in production: Power Platform request allocations, connector throttling and 429s, message size, timeouts, recurrence and concurrency limits.
What a connector is
A connector is a proxy that wraps a service’s REST API behind a designer-friendly set of triggers and actions. You never call the API directly — you pick an operation, fill in typed inputs, and the platform handles the HTTP, auth token, paging and response shaping. There are 1,400+ connectors across Power Automate, Power Apps and Logic Apps, plus custom ones you build yourself.
| Concept | What it is |
|---|---|
| Connector | The catalog entry for a service (e.g. SharePoint, Outlook, Dataverse) — defines its triggers + actions |
| Operation | A single trigger or action exposed by the connector |
| Connection | An authenticated, runtime instance of a connector (a signed-in account / credential set) |
| Connection reference | A solution component that points at a connection — the ALM-friendly indirection so flows move between environments without rebinding |
- A trigger starts a flow (and most flows have exactly one). An action does work inside a run.
- A connection is separate from the flow — many flows can share one connection, and you rebind connections per environment via connection references.
- The same connector behaves slightly differently across products (Power Automate vs Power Apps vs Logic Apps); availability is shown on each connector’s reference page.
Prefer a first-party connector over raw HTTP
If a connector exists for the service, use it — it handles auth, paging and throttling for you and is DLP-classifiable. Reach for the HTTP action only when no connector covers the endpoint. See the HTTP Requests & APIs guide.
Connector tiers: standard, premium, custom
Every connector carries a tier that decides whether it needs a premium licence. The tier shows under the connector name in the picker (a *PREMIUM* badge) and on its reference page. This is the single most common source of "works for me, fails for them" surprises, because the licence is enforced per user who runs the flow, not just the maker.
| Tier | Examples | Licence to run |
|---|---|---|
| Standard | Office 365 Outlook, SharePoint, Teams, OneDrive, Planner, Approvals, RSS, Excel Online | Seeded — included with Microsoft 365 |
| Premium | HTTP, Dataverse, SQL Server, Azure (Blob, Key Vault, Service Bus), Salesforce, ServiceNow | Power Automate Premium (per user) or Process (per flow) |
| Custom | Any OpenAPI you wrap yourself | Premium (or trial) licence required |
| On-premises | Anything routed through the on-premises data gateway (SQL, file share, SharePoint Server) | Premium licence required |
Dataverse and SQL are premium
The Microsoft Dataverse and SQL Server connectors are premium even though they feel like core platform. A flow that touches Dataverse, SQL, HTTP, a custom connector, or anything via the gateway requires every runner to hold a Power Automate Premium or Process licence.
- There is no "half premium" flow: a single premium operation makes the whole flow premium.
- The built-in operations (Control, Variables, Data Operations, Schedule/Recurrence, the *Request* trigger) are not connectors and carry no premium flag.
- Trigger or action — it does not matter: a premium trigger (e.g. SQL "When an item is created") makes the flow premium just as a premium action does.
- Browse the live tier lists on the connector reference: Standard · Premium.
Triggers: polling, webhook, instant & scheduled
A trigger is the entry point of a flow. Connectors expose triggers in a few flavours, and the flavour controls latency, cost and how the flow behaves when you switch it off and on again.
| Kind | How it fires | Typical names |
|---|---|---|
| Polling (automated) | Platform wakes on an interval and asks the service "anything new?" | When a new email arrives, When an item is created |
| Webhook (push) | Service calls the platform when the event happens — near real-time | When a file is created (push), When a row is added (Dataverse) |
| Instant / manual | A person or app invokes it on demand | Manually trigger a flow, For a selected item, PowerApps (V2) |
| Scheduled | Fires on a recurrence you define (built-in, no connector) | Recurrence |
| HTTP request | An inbound HTTP POST starts the flow (built-in) | When an HTTP request is received |
Polling vs webhook — the behaviour difference that catches people
| Trigger type | On turn-back-on |
|---|---|
| Polling | Resumes where it left off and processes ALL pending/unprocessed events that piled up while it was off |
| Webhook | Only processes events that occur from that point forward — anything during the downtime is lost |
Polling wake-up interval depends on the licence
A polling trigger only checks as often as your plan allows: roughly 15 minutes on the Free plan, 5 minutes on the seeded Office 365 / Dynamics 365 plans, and as frequently as 1 minute on standalone Premium plans. So a "new email" flow on a seeded plan may lag up to 5 minutes. Prefer a webhook/push trigger when latency matters.
A trigger run costs a request even when nothing happens
Each polling check is a Power Platform request whether or not it fires the flow. A flow that polls every minute burns ~1,440 trigger requests a day before it does any work — see request limits.
Trigger tuning: conditions, concurrency & debatching
Trigger conditions
A trigger condition is a boolean expression evaluated before the flow starts. If it returns false the run is skipped — it does not even count as a started run. Use it to stop a flow firing on every change and filtering after the fact (which wastes runs and requests).
@equals(triggerOutputs()?['body/Status/Value'], 'Approved')
// Multiple conditions are ANDed. Reference trigger output with
// triggerBody() / triggerOutputs(), and use ?[ ] for safe navigation.Trigger expressions are evaluated at save time, not per run
A value like utcNow() placed in a trigger input is calculated when you save the flow and baked in as a constant — it is not re-evaluated on each trigger. Compute time-relative values in an action instead.
Trigger concurrency control
By default a trigger runs as many instances in parallel as its conditions allow. Turning on Concurrency control caps the degree of parallelism (1–100). Set it to 1 to force strictly sequential processing — useful to avoid *dirty reads* (acting on a record another run already changed).
Concurrency control is irreversible
Once you enable trigger concurrency on a flow you cannot turn it off — you would have to rebuild the flow. Apply it deliberately, ideally on a small child flow. Note that enabling it also drops the Split On limit to 100 items.
Split On (debatching)
When a trigger returns an array, Split On debatches it — one flow run per array item — instead of looping inside a single run. The designer adds it automatically when the trigger’s schema is an array. It is great for fan-out, but it cannot be combined with a synchronous Response (the flow returns 202 Accepted immediately).
| Setting | Limit |
|---|---|
| Split On items (no trigger concurrency) | 5,000 (Low profile) / 100,000 (all others) |
| Split On items (with trigger concurrency) | 100 |
| Apply to each concurrency | Default 1, max 50 |
| Until iterations | Default 60, max 5,000 |
| Paginated items | 5,000 (Low) / 100,000 (all others) |
Actions: inputs, outputs & settings
An action performs one operation against the connector’s service inside a run. It takes typed inputs, returns a typed body you reference as dynamic content, and exposes per-action Settings that control retries, timeout, paging and security.
| Setting | What it does | Default |
|---|---|---|
| Retry Policy | How failed calls (408/429/5xx) are retried | Exponential, up to 4 retries |
| Pagination | Auto-follow the service’s next-link up to a threshold | Off |
| Timeout (action) | Max wait for a single async action, ISO 8601 (e.g. PT2M) | Connector default |
| Secure Inputs / Outputs | Hide inputs/outputs from run history + logs | Off |
| Concurrency control | Parallelism inside Apply to each | 1 |
Reference an action’s output
body('Get_item')?['Title']
outputs('HTTP')?['statusCode']
first(body('List_rows')?['value'])?['name']Turn on Pagination instead of building Do-Until loops
Many list actions (SharePoint Get items, Dataverse List rows) return one page. Switch on Settings → Pagination and set a threshold so the platform follows the next-link for you — cleaner than a manual loop and it respects the paginated-items cap.
Secure Outputs hides data from the next action too
Enabling Secure Outputs removes the values from run history — but downstream actions can still consume them. It does not encrypt; it only stops the values appearing in logs and the designer. Turn it on for tokens, secrets and PII.
Connections, auth & connection references (ALM)
A connection is the credential the connector uses at runtime. Connectors authenticate in different ways — most Microsoft ones use OAuth (you sign in once), others take an API key, basic username/password, or a service principal. Connections are owned by a user (or an application user) and can be shared.
| Auth | Used by | Notes |
|---|---|---|
| OAuth 2.0 | Office 365, SharePoint, Dataverse, Teams | Delegated — runs as the signed-in user; tokens refresh automatically |
| Service principal (app) | Dataverse, SQL, Azure | App-only; no interactive user — ideal for unattended/owned-by-app flows |
| API key | Many third-party + custom connectors | Single secret in a header; store in an environment variable |
| Basic | Legacy endpoints | Username + password; least preferred |
| Windows / gateway | On-premises sources | Routed through the on-premises data gateway |
Connection references — the ALM piece
A connection reference is a solution component that sits between a flow and an actual connection. The flow binds to the *reference*; the reference is bound to a *connection* per environment. That indirection is what lets a solution move Dev → Test → Prod and be wired to the right credentials in each environment without editing the flow.
- Always build flows inside a solution so they use connection references, not hard-coded connections.
- Set connection-reference values per environment via deployment settings / pipeline variables, not by hand-editing in Prod.
- For unattended flows, bind the reference to a service principal (application user) connection so it does not break when a person leaves.
- See the Naming & ALM guide for the conventions and pipeline wiring.
One reference, many flows
Multiple flows in a solution can share a single connection reference. Bind once per environment and every flow that uses it is wired up — far less re-authentication after a deployment.
Power Platform request limits
A Power Platform request (PPR) is counted for every trigger and action a flow runs — connector actions, HTTP, and built-ins like Initialize variable or Compose. Both successful and failed actions count; skipped ones do not. Retries and extra requests from pagination count too. A simple one-trigger / one-action flow burns two requests per run.
| Licence | Requests / 24h |
|---|---|
| Power Automate Premium (per user) | 40,000 per user |
| Power Automate Process / per-flow (legacy) | 250,000 per flow |
| Power Apps Premium / per-user | 40,000 per user |
| Dynamics 365 Enterprise & Professional | 40,000 per user |
| Power Automate Free / Office 365 seeded | 6,000 per user |
| Power Apps per app / pay-as-you-go / Microsoft 365 | 6,000 per user |
| Dynamics 365 Team Member | 6,000 per user |
| Power Pages / Portals login | 200 per login |
- There is also a license-independent 5-minute ceiling of 100,000 requests — a Process flow can do 250k/day but never more than 100k in any 5 minutes.
- The window is per user / per flow and cannot be pooled across an environment or tenant.
- Stack Process licences on a solution-aware flow to add 250,000 requests each for genuinely high-volume automation.
- Desktop (PAD) flow executions do not consume Power Platform requests.
- Exceed the limit and your flows are slowed, not failed; sustained breaches for 14 days can turn a flow off.
Cut requests, not just runs
Filter at the trigger (trigger conditions) and at the source (OData $filter/$select) so you fetch fewer rows; replace per-row connector calls with a single batched call; and avoid needless Compose/variable actions inside loops — each is a request × the loop count.
Connector throttling & 429s
Connector throttling is different from the PPR allocation above. Each connector publishes its own rate limits (usually per connection, per time window) on its reference page, and these are frequently hit *before* the platform request limits. When you exceed one, the service replies 429 Too Many Requests with a Retry-After header.
| Limit | Scope | Symptom |
|---|---|---|
| Power Platform requests (PPR) | Per user / per flow, 24h + 5-min window | Flows slowed across your whole account |
| Connector throttling | Per connection, connector-defined window | HTTP 429 on a specific action |
- Leave the action’s Default retry policy on — it already honours
Retry-Afteron 408/429/5xx. - Cap Apply to each concurrency when the loop hits a rate-limited API; high parallelism multiplies your 429s.
- Spread work across more flows, or batch requests where the API supports it (e.g. Graph
$batch, Dataverse batch) so one call does many. - Cache lookups in a variable instead of re-calling the connector per row.
- Each connector’s exact numbers live on its page under the connector reference — always confirm there, they change.
Throttling examples (illustrative — verify on the connector page)
Per-connection windows vary widely: e.g. Office 365 Outlook historically ~300 calls / 120 s, SharePoint ~600 calls / 60 s, and Dataverse enforces service-protection limits per server. Treat these as orders of magnitude, not contracts — the connector’s own reference page is the source of truth.
Full retry/timeout mechanics
For retry policy types, secure-inputs handling and the Scope-based Try/Catch around throttled calls, see the HTTP Requests guide and the Best Practices guide.
Service limits cheat sheet
The hard ceilings on a single call, a single run, and a flow definition. These are platform limits — connectors may be stricter.
| Limit | Value | Notes |
|---|---|---|
| Outbound synchronous request timeout | 120 s (2 min) | Use async polling / Until for longer work |
| Outbound asynchronous request | Up to 30 days | Configurable; webhook/async pattern |
| Inbound request timeout | 120 s (2 min) | HTTP-request trigger / instant flows |
| Message size | 100 MB | Whole payload, not just the file |
| Message size with chunking | 1 GB | Only actions that support chunking |
| Expression evaluation limit | 131,072 chars | concat() / base64() / string() |
| Request URL character limit | 16,384 chars | n/a |
| Limit | Value | Notes |
|---|---|---|
| Run duration (max) | 30 days | Includes pending approvals; then steps time out |
| Run retention in storage | 30 days | Run history kept from start time |
| Minimum recurrence interval | 60 seconds | Recurrence trigger floor |
| Maximum recurrence interval | 500 days | n/a |
| Retry attempts (max) | 90 | Default policy: ~2 (Low) / ~12 (Med/High) |
| Retry delay range | 5 s – 1 day | Min / max configurable interval |
| Flows turned off — continuous errors | 14 days | Trigger/actions failing continuously |
| Flows turned off — no trigger activity | 90 days | Premium / capacity-licensed flows exempt |
Long-running ≠ supported by waiting
You cannot hold a synchronous call open past 120 s. For long jobs, submit then poll a status endpoint (Until loop, honouring Retry-After) or use an async/webhook callback — never a long Delay inside one action.
Custom connectors
When no connector covers an API, wrap it as a custom connector: describe the API with an OpenAPI (Swagger) 2.0 definition (or import a Postman collection), define auth, and the operations show up in the designer like any other connector. Custom connectors are premium — running any flow that uses one needs a premium or trial licence.
- Define the auth once (API key, OAuth 2.0, basic, or generic OAuth) — makers then just create a connection.
- Add policy templates to transform requests/responses (set a header, route, convert) without changing the backend.
- Build polling or webhook triggers so your API can start flows, not just receive actions.
- Package the custom connector in a solution with a connection reference so it deploys across environments via ALM.
- Submit for certification if you want it published to all tenants; otherwise it stays in your org.
| Limit | Value |
|---|---|
| Custom connectors per user | 50 |
| Requests per minute per connection | 500 |
| Definition format | OpenAPI 2.0 / Postman collection |
On-premises sources go through the gateway
To reach a server behind the firewall (SQL Server, a file share, SharePoint Server), install the on-premises data gateway and create a gateway-bound connection. These connections are premium and have their own payload-size considerations for write operations.
DLP & governance
Admins control which connectors can be used together with Data Loss Prevention (DLP) policies. Every connector is sorted into one of three groups, and a flow may not combine a connector from the Business group with one from the Non-Business group in the same flow — that is how the platform stops, say, SharePoint data flowing to a personal Twitter/X connection.
| Group | Meaning |
|---|---|
| Business | Approved for organizational data; can only share data with other Business connectors |
| Non-Business | Personal / general connectors; isolated from Business connectors |
| Blocked | Cannot be used at all in scope of the policy |
- A flow that mixes a Business and a Non-Business connector is blocked from saving/running by the policy.
- The HTTP and custom connectors are common candidates to block or tightly scope, since they can reach arbitrary endpoints.
- DLP policies apply per environment (and tenant-wide default); Managed Environments add maker controls, sharing limits and analytics on top.
- Endpoint filtering can further restrict *which URLs/hosts* a connector may call.
Check DLP before you design
A flow can pass every test in your maker environment and still be blocked by DLP in Prod. Confirm the connectors you plan to combine are in compatible DLP groups for the target environment early — re-architecting around a blocked combination late is expensive.
Choosing & using connectors well
- Pick the lowest tier that works. A standard connector avoids premium licensing for every runner — only go premium when the capability genuinely requires it.
- Push, don’t poll. Prefer a webhook/push trigger over a polling one for latency and to avoid burning trigger requests on empty checks.
- Filter early. Use trigger conditions and OData
$filter/$selectso you fetch the fewest rows and columns — fewer requests, less throttling. - Batch and cache. Replace per-row connector calls with a batched call or a cached lookup; each loop iteration is its own request.
- Design for at-least-once. The platform can deliver a trigger more than once — make flows idempotent (check-before-create, Dataverse alternate keys).
- Build in solutions with connection references so connectors deploy cleanly across environments — see Naming & ALM.
- Know both limits. Watch the per-user PPR allocation *and* the per-connection throttle; the connector usually throttles first.
Related references
Raw HTTP, OAuth and OData live in HTTP Requests & APIs. Error handling and the Try/Catch pattern are in Best Practices. Connection-reference naming and pipelines are in Naming & ALM.