Power Automate's HTTP action calls the ScreenshotRun API directly from a cloud flow. Pass a URL, get back a PNG, JPEG, or PDF. Save it to SharePoint, post it in Teams, attach it to an Outlook email. The whole capture runs in the cloud with no desktop machine, no browser extension, no Power Automate Desktop involved.
If you've tried the "Take screenshot of web page" action in Power Automate Desktop, you know the headaches. It needs a local Windows machine with a browser extension installed. It fails in unattended mode because there's no screen to capture ("The handle is invalid" is the error Microsoft's own docs acknowledge). It breaks when the desktop resolution changes or a UAC prompt interrupts the session. For a scheduled, hands-off workflow, Desktop flows are the wrong tool.
A cloud flow with an HTTP action solves this. One GET request to an external API, screenshot rendered on our servers, image returned to your flow. This guide walks through the Power Automate screenshot setup, five workflow patterns for the Microsoft ecosystem, plus the API parameters that matter most.
Configure the HTTP action in five minutes
You need a Power Automate Premium license (the HTTP action is a premium connector) and a ScreenshotRun API key from the dashboard (free plan, 200 captures per month, no credit card).
Create a new Automated cloud flow or Instant cloud flow. For testing, an Instant flow with a manual trigger works fine. You'll swap the trigger later depending on your use case.
Add a new step and search for "HTTP" (not "HTTP + Swagger" or "HTTP Webhook," just the plain HTTP action). Configure it:
- Method: GET
- URI:
https://api.screenshotrun.com/v1/screenshots/capture?url=https://example.com&format=png&width=1280&block_cookies=true - Headers: key
Authorization, valueBearer YOUR_API_KEY
Replace https://example.com with whatever URL you want to capture. Dynamic content works here too. If a previous step in your flow provides a URL (from a SharePoint list item, an Excel row, a form submission), drag that value right into the URI.
Click "Save" and then "Test" with the manual trigger. The HTTP action calls the API, waits a few seconds, then returns the screenshot as binary image data in the response body. You can see a preview in the run history.
That's the core. Every workflow below builds on this same HTTP action with different triggers and downstream steps.
Save screenshots to SharePoint automatically
SharePoint is the default file system in most Microsoft 365 organizations. Saving screenshots there means they're versioned, searchable, accessible to anyone with the right permissions.
After the HTTP action, add a "SharePoint - Create file" action. Set the Site Address to your SharePoint site, the Folder Path to a document library (like /Shared Documents/Screenshots), and the File Name to something dynamic: screenshot-@{utcNow('yyyy-MM-dd-HHmm')}.png. For the File Content, select the body output from the HTTP action. Power Automate passes the raw image bytes straight to SharePoint.
Pair this with a Recurrence trigger (daily at 9 AM, weekly on Mondays, every hour) and you've got scheduled website captures landing in SharePoint without anyone opening a browser. Compliance teams use this pattern for regulatory page archiving. Marketing teams track competitor landing pages. IT monitors internal portal status pages.
If you want the screenshot URL instead of raw bytes (to store a link rather than a file), add &response_type=json to your API URL. The response comes back as JSON with a screenshot_url field you can write to a SharePoint list column or log in Excel.
Post screenshots to Microsoft Teams channels
Teams is where enterprise conversations happen. Dropping a website screenshot into a channel beats pasting a URL that nobody clicks.
After the HTTP action captures the screenshot, add "Microsoft Teams - Post a message in a chat or channel." Select your team and channel. In the message body, switch to the code view (the </> icon) and insert an inline image using the base64-encoded body:
<img src="data:image/png;base64,@{base64(body('HTTP'))}" alt="Website screenshot" />
The screenshot appears inline in the Teams message. No file upload, no attachment link, just the image right there in the conversation.
For a cleaner approach, save the screenshot to SharePoint first (previous section), then post a Teams message with a link to the file. This keeps large images out of the chat stream and stores them where SharePoint permissions apply.
Trigger options: a Recurrence schedule for daily competitor snapshots, a "When an item is created" trigger from a SharePoint list for on-demand captures, or a Forms response trigger when someone submits a URL through Microsoft Forms.
Why a screenshot API beats Power Automate Desktop
Power Automate Desktop has a "Take screenshot of web page" action that opens a browser on your local machine and grabs the visible area. On paper it does the job. In practice it falls apart fast.
Unattended mode doesn't work reliably. Microsoft's own troubleshooting documentation says the screenshot action fails when no active desktop session exists. The underlying Windows API needs a screen buffer to capture, and headless or disconnected RDP sessions don't provide one. Forum threads on the Power Platform community are full of this: users setting up scheduled Desktop flows that produce blank or corrupted screenshots overnight.
Infrastructure costs add up quickly. You need a Windows machine (physical or VM) running 24/7, the Power Automate Desktop agent installed, browser extensions configured. The machine needs to be registered as a managed desktop too. For a single screenshot flow, that's a lot of moving parts. And if the machine reboots, the agent crashes, or Windows Update interrupts the session, your flow stops working until someone fixes it.
Feature gaps are real. Desktop screenshots capture whatever the browser shows at that moment. No full-page scrolling. No dark mode toggle. No mobile viewport emulation. No ad blocking or cookie banner removal. No geolocation for country-specific content. These are all query parameters in the ScreenshotRun API that you add to your HTTP action URI.
The cloud API approach is stateless. No machine, no browser, no session. Your flow sends a URL, our servers render the page, you get back an image. Runs the same at 3 PM or 3 AM, attended or unattended, from any Power Automate environment.
Five workflow patterns for Power Automate
These match real patterns we see from Power Automate users.
Weekly competitor report to Outlook
Recurrence trigger, every Monday at 8 AM. The flow captures five competitor homepages (five HTTP actions in sequence, each with a different URL). Then a "Send an email (V2)" action assembles them into one message with inline images. Your marketing team gets a visual competitive snapshot in their inbox every week. No browser tabs, no manual screenshots, no "can someone grab these before the meeting?"
SharePoint list item triggers a capture
Someone adds a URL to a SharePoint list (could be a site audit checklist, a vendor portal inventory, a list of pages to archive). The "When an item is created" trigger fires, the HTTP action captures that URL, and a "Create file" action saves the screenshot to a document library folder named after the list item. The list item gets updated with a link to the screenshot file. Self-service for anyone in the organization who has access to the SharePoint list.
Error page documentation for helpdesk
A separate monitoring flow checks a set of URLs (health endpoints, internal portals, customer-facing pages) on a schedule. When an HTTP response returns a non-200 status, the flow captures a screenshot of the error page and creates a ticket in ServiceNow, Jira, or whatever your ITSM tool is. The screenshot attaches to the ticket as visual evidence. Support engineers see exactly what the user would see without reproducing the issue.
Form submission captures the submitted URL
A Microsoft Forms questionnaire asks users to paste a URL (a bug report, a content review request, a vendor assessment). The "When a new response is submitted" trigger fires. The flow grabs the URL from the response, captures it, then saves the screenshot alongside the form data in SharePoint. The reviewer opens the submission and sees both the URL and a visual snapshot of what it looked like at submission time.
Daily portal snapshot to OneDrive
For personal archiving or small-team use. A Recurrence trigger at 6 PM captures your company's internal dashboard, customer portal, or status page. The screenshot saves to your OneDrive. Over weeks you build a visual changelog of the page. Did the dashboard layout change? Did someone update the pricing table? The evidence is in your screenshot folder, timestamped.
API parameters for Power Automate flows
Every parameter goes into the URI query string. Power Automate's HTTP action handles them the same way a browser handles URL parameters.
| Parameter | Type | Default | What it does in your flow |
|---|---|---|---|
url | string | required | The page to capture (accepts dynamic content from previous steps) |
format | string | png | png, jpeg, webp, or pdf |
width | integer | 1280 | Browser viewport width in pixels |
full_page | boolean | false | Scroll and capture the entire page, not just the visible area |
device | string | desktop | Switch to mobile (390px) or tablet viewport |
dark_mode | boolean | false | Trigger the site's dark theme |
block_cookies | boolean | false | Dismiss GDPR consent overlays before capture |
block_ads | boolean | false | Strip display ads and tracking scripts |
delay | integer | 0 | Wait N seconds after load before capturing (helps with SPAs) |
stealth | boolean | false | Bypass bot detection on protected sites |
selector | string | Crop to a specific CSS element | |
certified | boolean | false | Add SHA-256 hash and timestamp for legal evidence |
response_type | string | image | Set to json for a URL response instead of raw bytes |
The API documentation covers additional parameters (geolocation, CSS/JS injection, PDF margins, resize dimensions) if your flow needs them.
Handle errors and timeouts
Power Automate's HTTP action has a default timeout of 120 seconds. Most screenshots finish in 3-8 seconds, so this buffer is plenty. Heavy single-page apps (React dashboards with live data, pages behind Cloudflare challenges) can take longer. For those, add &delay=5 to let the page settle, or use &stealth=true if bot detection is the holdup.
If the API returns a 4xx or 5xx error, Power Automate marks the action as failed. You can configure retry policies on the HTTP action (Settings > Retry Policy). The default exponential retry with 4 attempts works well for transient errors. For 429 (rate limit) responses, the retry delay gives the rate window time to reset.
One thing that catches people: if you're using response_type=json and then try to save the body as an image file in SharePoint, you'll get a JSON text file instead of a PNG. The default response type returns raw image bytes. Use that for file storage. Use JSON when you only need the screenshot URL.
Power Automate vs Zapier vs Make.com
All three platforms call the same ScreenshotRun API endpoint. The difference is in the ecosystem and pricing around it.
| Power Automate | Zapier | Make.com | |
|---|---|---|---|
| HTTP action | Premium ($15/user/mo) | Webhooks (paid plans) | HTTP module (all plans) |
| Best for | Microsoft 365 organizations | SaaS-to-SaaS workflows | Complex branching flows |
| Native integrations | SharePoint, Teams, Outlook, OneDrive | 5,000+ apps | 1,500+ apps |
| Screenshot storage | SharePoint, OneDrive | Google Drive, Dropbox | Google Drive, Dropbox |
| Enterprise fit | Strong (M365 ecosystem) | Moderate | Moderate |
If your organization lives in Microsoft 365 and already pays for Power Automate Premium, adding screenshot automation through the HTTP action is the path of least resistance. You stay inside the tenant, use existing SharePoint libraries. IT doesn't need to approve another third-party platform.
For teams outside the Microsoft ecosystem, Zapier or Make.com often make more sense. Same API, different wiring.
Troubleshooting
The HTTP action returns 401 Unauthorized. Your API key is wrong or the Authorization header is misconfigured. It should be exactly: key Authorization, value Bearer YOUR_API_KEY (with a space between "Bearer" and the key). Check for trailing spaces or line breaks that sometimes sneak in when pasting from the dashboard.
Screenshots are blank or show a loading state. Add &delay=3 to your URI. Pages with heavy JavaScript (React, Angular, Vue apps) need time to render after the initial HTML loads. If delay alone doesn't help, try &wait_for_selector=.main-content to wait for a specific element before capturing.
The flow saves a 0-byte file to SharePoint. The HTTP action timed out or returned an error, but the flow continued because "Configure run after" is set to run on failure. Add a condition after the HTTP action: check that the status code equals 200 before saving the file.
Screenshots show cookie consent banners covering the page. Add &block_cookies=true to your URI. The API dismisses most GDPR consent dialogs automatically. For stubborn ones, &hide_selectors[]=#cookie-banner removes a specific element by CSS selector.
You need the screenshot as a URL, not as raw bytes. Add &response_type=json to your URI. The response body becomes a JSON object with a screenshot_url field. Parse it with "Parse JSON" action in Power Automate and reference the URL in downstream steps.