Power Automate Screenshot API — Capture Websites in Cloud Flows

Take website screenshots in Power Automate cloud flows with ScreenshotRun API. HTTP action setup, save to SharePoint, post to Teams. No desktop flow needed. 200 free captures/month.

Vitalii Holben Updated

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, value Bearer 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.

ParameterTypeDefaultWhat it does in your flow
urlstringrequiredThe page to capture (accepts dynamic content from previous steps)
formatstringpngpng, jpeg, webp, or pdf
widthinteger1280Browser viewport width in pixels
full_pagebooleanfalseScroll and capture the entire page, not just the visible area
devicestringdesktopSwitch to mobile (390px) or tablet viewport
dark_modebooleanfalseTrigger the site's dark theme
block_cookiesbooleanfalseDismiss GDPR consent overlays before capture
block_adsbooleanfalseStrip display ads and tracking scripts
delayinteger0Wait N seconds after load before capturing (helps with SPAs)
stealthbooleanfalseBypass bot detection on protected sites
selectorstringCrop to a specific CSS element
certifiedbooleanfalseAdd SHA-256 hash and timestamp for legal evidence
response_typestringimageSet 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 AutomateZapierMake.com
HTTP actionPremium ($15/user/mo)Webhooks (paid plans)HTTP module (all plans)
Best forMicrosoft 365 organizationsSaaS-to-SaaS workflowsComplex branching flows
Native integrationsSharePoint, Teams, Outlook, OneDrive5,000+ apps1,500+ apps
Screenshot storageSharePoint, OneDriveGoogle Drive, DropboxGoogle Drive, Dropbox
Enterprise fitStrong (M365 ecosystem)ModerateModerate

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.

Written by

Vitalii Holben

Co-founder and CEO of ScreenshotRun. Full-stack developer building screenshot API tools that help developers capture, automate, and monitor web pages at scale. Based in Europe, shipping code since 201...

Screenshot API in a few clicks

Free plan includes 200 screenshots every month. No credit card required.

Sign up → copy your key → make your first call