Free tools Windows power users keep installed

One-click scans. No signup required.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Some links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.

For a new macOS app, use Apple’s ScreenCaptureKit: call SCScreenshotManager.captureImage(contentFilter:configuration:) for one still image, or use SCStream when you need continuing frames. ScreenCaptureKit lets you target a display, app, or window, but the person using your app must grant screen-recording access.

Choose the macOS capture API for the job

“Mac screenshot API” can mean capturing the Mac’s display from a macOS app, or capturing a website from a service. For the first task, Apple’s ScreenCaptureKit is the modern framework to start with. It represents shareable displays, running apps, and windows, then uses a content filter to define what to capture. The ScreenCaptureKit overview also recommends its system picker when people should choose a source themselves.

Need Use Output
One still image of chosen content SCScreenshotManager.captureImage(contentFilter:configuration:) A CGImage
A continuing sequence of frames SCStream, configured with a content filter and stream configuration Video sample buffers delivered to a stream output delegate; audio can also be captured if configured
Let the user choose a screen, app, or window SCContentSharingPicker A system-provided selection experience

For one screenshot, do not build a stream and extract a frame unless your app also needs streaming. Apple documents a single-image method with both completion-handler and async throwing forms in the SCScreenshotManager captureImage reference.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

How to capture a display in Swift

The capture sequence is: request available shareable content, choose a source, make an SCContentFilter, configure dimensions, and call the screenshot manager. The example below captures the first available display and writes a PNG. Put it in a macOS app target that imports AppKit and ScreenCaptureKit, then call captureFirstDisplay(to:) from an asynchronous task after the user initiates capture.

#1 Best Overall
Sale
Apple 2025 MacBook Pro Laptop with Apple M5 chip with 10‑core CPU and 10‑core GPU: Built for AI, 14.2-inch Liquid Retina XDR Display, 16GB Unified Memory, 1TB SSD Storage; Space Black
  • SUPERCHARGED BY M5 — The 14-inch MacBook Pro with M5 brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. Featuring all-day battery life and a breathtaking Liquid Retina XDR display with up to 1600 nits peak brightness, it’s pro in every way.*
  • HAPPILY EVER FASTER — Along with its faster CPU and unified memory, M5 features a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance. So you can blaze through demanding workloads at mind-bending speeds.
  • BUILT FOR APPLE INTELLIGENCE — Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.*
  • ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.
  • APPS FLY WITH APPLE SILICON — All your favorites, including Microsoft 365 and Adobe Creative Cloud, run lightning fast in macOS.*
import AppKit
import ScreenCaptureKit

private enum CaptureError: Error {
    case noDisplay
    case pngEncodingFailed
}

func captureFirstDisplay(to url: URL) async throws {
    let content = try await SCShareableContent.excludingDesktopWindows(
        false,
        onScreenWindowsOnly: true
    )
    guard let display = content.displays.first else {
        throw CaptureError.noDisplay
    }

    let filter = SCContentFilter(
        display: display,
        excludingApplications: [],
        exceptingWindows: []
    )
    let configuration = SCStreamConfiguration()
    configuration.width = display.width
    configuration.height = display.height

    let image = try await SCScreenshotManager.captureImage(
        contentFilter: filter,
        configuration: configuration
    )
    let bitmap = NSBitmapImageRep(cgImage: image)
    guard let png = bitmap.representation(using: .png, properties: [:]) else {
        throw CaptureError.pngEncodingFailed
    }
    try png.write(to: url, options: .atomic)
}

// Example call from a macOS app:
Task {
    do {
        let output = FileManager.default.temporaryDirectory
            .appendingPathComponent("mac-screenshot.png")
        try await captureFirstDisplay(to: output)
        print("Saved screenshot to (output.path)")
    } catch {
        print("Screenshot failed: (error)")
    }
}

The example chooses the first display returned, which is a simple default rather than a user-facing choice. If your app has multiple monitors or should capture a specific window, choose that source deliberately. Set the configuration to the output dimensions you want; the CGImage is the captured image, and encoding it as PNG is a separate step shown above.

Capture one window instead

Use a window from content.windows and construct the filter with that window rather than the display filter. Check that the desired window exists before using it: the list can be empty if no eligible window is available.

guard let window = content.windows.first(where: { $0.title == "My Document" }) else {
    throw CaptureError.noDisplay // Replace with an app-specific missing-window error.
}
let filter = SCContentFilter(desktopIndependentWindow: window)

In production code, identify the intended window using properties meaningful to your app rather than assuming titles are unique or stable. Apple’s sample demonstrates both a single-window filter and a display filter, including excluding the capturing app from display capture; see Capturing screen content in macOS.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
Rank #2
Sale
Apple 2026 MacBook Pro Laptop with Apple M5 Pro chip with 18-core CPU and 20-core GPU: Built for AI, 16.2-inch Liquid Retina XDR Display, 24GB Unified Memory, 1TB SSD, Wi-Fi 7; Space Black
  • FAST RUNS IN THE FAMILY — The 16-inch MacBook Pro with the M5 Pro or M5 Max chip brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. With all-day battery life, double the starting storage,* and a breathtaking Liquid Retina XDR display, it’s pro in every way.*
  • BUCKLE UP — Along with a next-generation CPU, faster unified memory, and up to 2x faster SSD storage,* M5 Pro and M5 Max feature a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance and on-device training capabilities. So you can blaze through demanding workloads at mind-bending speeds.
  • BUILT FOR AI — Apple silicon, and every major component that powers it, is designed to run demanding on-device AI workloads like LLM inference and training. And Apple Intelligence helps you write, express yourself, and get things done effortlessly with groundbreaking privacy protections at every step.*
  • ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.*
  • MACOS RUNS APPS FAST — All your go-to apps run lightning fast in macOS, including built-in apps like FaceTime and Messages. Plus, built-in virus protection and free software updates help keep your Mac running smoothly and securely.

Ask for permission and explain the capture

Screen capture is privacy-sensitive. Apple’s framework guidance says: “Request screen recording permission from the person before capturing content.” Add the NSScreenCaptureUsageDescription key to the Xcode target’s Info settings and provide a clear sentence explaining why the app needs access. For example: “Allow screen recording so you can capture the selected window.” Do not request access without connecting it to an understandable user action.

Permission is controlled by macOS rather than granted by the API call itself. If capture is unavailable, direct the user to the Screen Recording controls in System Settings and have them check whether your app is enabled. Exact UI wording and permission behavior can vary by macOS version. Apple’s sample project says its first run prompts for Screen Recording access and that the sample should be restarted after access is granted; that is a detail of the sample, not a universal rule for every app.

The Apple sample page lists macOS 15 or later and Xcode 16 or later as requirements for that sample project. Those are the sample’s requirements, not a minimum-version statement for every ScreenCaptureKit symbol. Check the SDK availability annotations for the specific API calls and deployment target you use.

Rank #3
Sale
Apple 2026 MacBook Pro Laptop with Apple M5 Pro chip with 18-core CPU and 20-core GPU: Built for AI, 16.2-inch Liquid Retina XDR Display, 48GB Unified Memory, 1TB SSD, Wi-Fi 7; Space Black
  • FAST RUNS IN THE FAMILY — The 16-inch MacBook Pro with the M5 Pro or M5 Max chip brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. With all-day battery life, double the starting storage,* and a breathtaking Liquid Retina XDR display, it’s pro in every way.*
  • BUCKLE UP — Along with a next-generation CPU, faster unified memory, and up to 2x faster SSD storage,* M5 Pro and M5 Max feature a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance and on-device training capabilities. So you can blaze through demanding workloads at mind-bending speeds.
  • BUILT FOR AI — Apple silicon, and every major component that powers it, is designed to run demanding on-device AI workloads like LLM inference and training. And Apple Intelligence helps you write, express yourself, and get things done effortlessly with groundbreaking privacy protections at every step.*
  • ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.*
  • MACOS RUNS APPS FAST — All your go-to apps run lightning fast in macOS, including built-in apps like FaceTime and Messages. Plus, built-in virus protection and free software updates help keep your Mac running smoothly and securely.

Let the user select what to share

Hard-coding the first display is suitable for a minimal example, but a real capture tool often needs user selection. Apple recommends SCContentSharingPicker for letting people choose content sources and manage active streams. Use that system interface when user choice is central; use app-created filters when the source is known programmatically and that fits the user’s expectation.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

A display capture can include content beyond your app’s own window. Apple’s sample illustrates excluding the capturing app from a display capture, which can be important for avoiding recursive previews or controls in the image. Decide explicitly whether your app should appear in the result instead of treating inclusion or exclusion as incidental.

When a screenshot becomes a stream

Choose SCStream when the task is ongoing capture—for example, processing successive frames—not merely to save one image. Configure a stream with an SCStreamConfiguration, set its content filter, and attach a stream output delegate to receive sample buffers. Apple’s sample also demonstrates audio capture; audio is an additional capability, not a requirement for a still screenshot.

Rank #4
Sale
Apple 2025 MacBook Pro Laptop with Apple M5 chip with 10‑core CPU and 10‑core GPU: Built for AI, 14.2-inch Liquid Retina XDR Display, 24GB Unified Memory, 1TB SSD Storage; Space Black
  • SUPERCHARGED BY M5 — The 14-inch MacBook Pro with M5 brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. Featuring all-day battery life and a breathtaking Liquid Retina XDR display with up to 1600 nits peak brightness, it’s pro in every way.*
  • HAPPILY EVER FASTER — Along with its faster CPU and unified memory, M5 features a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance. So you can blaze through demanding workloads at mind-bending speeds.
  • BUILT FOR APPLE INTELLIGENCE — Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.*
  • ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.
  • APPS FLY WITH APPLE SILICON — All your favorites, including Microsoft 365 and Adobe Creative Cloud, run lightning fast in macOS.*

For either route, configuration and filtering solve different problems: the filter selects what content is included or excluded, while the configuration sets capture properties. If the stream will run while your app is in the background, Apple notes that the appropriate background execution modes may need to be configured. Do not assume a stream can continue in the background without that app setup.

Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Why not use CGWindowListCreateImage?

CGWindowListCreateImage is a legacy Core Graphics capture function, not the recommended starting point for new code. Apple marks it deprecated in the API reference. Apple’s macOS Sequoia 15 release notes warn that applications using deprecated capture APIs such as CGDisplayStream and CGWindowListCreateImage “can trigger system alerts indicating they might be able to collect detailed information about the user.” The same release notes direct developers toward ScreenCaptureKit and SCContentSharingPicker: macOS Sequoia 15 Release Notes.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

If you are maintaining an older app, treat the deprecation as a migration reason: move capture selection and capture work to ScreenCaptureKit, and test the permission experience on the macOS versions you support. Do not promise users that behavior or alerts are identical across all releases; Apple’s cited warning is specifically in the macOS 15 release notes.

Best Value
Apple 2025 MacBook Pro Laptop with Apple M5 chip with 10‑core CPU and 10‑core GPU: Built for AI, 14.2-inch Liquid Retina XDR Display, 16GB Unified Memory, 1TB SSD Storage; Silver
  • SUPERCHARGED BY M5 — The 14-inch MacBook Pro with M5 brings next-generation speed and powerful on-device AI to personal, professional, and creative tasks. Featuring all-day battery life and a breathtaking Liquid Retina XDR display with up to 1600 nits peak brightness, it’s pro in every way.*
  • HAPPILY EVER FASTER — Along with its faster CPU and unified memory, M5 features a more powerful GPU with a Neural Accelerator built into each core, delivering faster AI performance. So you can blaze through demanding workloads at mind-bending speeds.
  • BUILT FOR APPLE INTELLIGENCE — Apple Intelligence is the personal intelligence system that helps you write, express yourself, and get things done effortlessly. With groundbreaking privacy protections, it gives you peace of mind that no one else can access your data — not even Apple.*
  • ALL-DAY BATTERY LIFE — MacBook Pro delivers the same exceptional performance whether it’s running on battery or plugged in.
  • APPS FLY WITH APPLE SILICON — All your favorites, including Microsoft 365 and Adobe Creative Cloud, run lightning fast in macOS.*

Performance, reliability, and cost considerations

Apple’s documentation cited here does not provide a benchmark that establishes capture latency, frame rate, or memory use for a particular Mac. Measure on the hardware and macOS versions relevant to your app, especially if capturing full displays or processing a continuous stream. A single still-image request is the narrower path when continuous frame delivery is unnecessary.

  • Check that the chosen display or window exists before creating a filter.
  • Handle thrown errors and image encoding or file-write failures separately from permission guidance.
  • For streams, plan for sample-buffer processing and lifecycle management rather than retaining every frame indefinitely.
  • Validate capture behavior on your deployment targets; the cited sample requirements do not define availability for every individual API symbol.

There is no per-capture API fee specified for Apple’s local ScreenCaptureKit framework in the cited documentation. Your app still owns the engineering costs of permission UX, processing, storage, and support.

Troubleshooting common capture failures

  • No display or window is available: the source query returned no eligible item. Handle an empty result and let the user try again or select another source.
  • Permission is missing or denied: confirm that your target includes NSScreenCaptureUsageDescription, explain the feature to the user, and point them to the macOS Screen Recording controls to review access.
  • The first run still cannot capture: Apple’s sample requires a restart after granting permission. Try that for the sample, but do not encode it as an unconditional rule for all macOS apps.
  • The screenshot includes your app’s controls: revise the filter to exclude the capturing app where appropriate; Apple’s sample shows this pattern for display capture.
  • The image is blank or not the expected size: verify the selected content and stream configuration, then test on the target display setup. The cited Apple material does not establish one universal cause for blank captures.
  • A deprecated-API alert appears: locate legacy calls such as CGWindowListCreateImage and migrate capture to ScreenCaptureKit, following the macOS-version context in Apple’s Sequoia 15 release notes.

Or skip the browser setup

ScreenCaptureKit captures content on the Mac running your app. If what you need is a screenshot of a website from a server, build pipeline, or AI agent, that is a different job: ScreenshotNeo is a website screenshot API and MCP server, not a way to capture a user’s local Mac display. One GET request can return PNG, JPEG, WebP, or PDF. Here is the cURL form; see the ScreenshotNeo API documentation for parameters and response details.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl -G "https://api.screenshotneo.com/v1/shot" 
  -d access_key=YOUR_API_KEY 
  --data-urlencode url=https://stripe.com 
  -o shot.webp
  • It accepts cookie or consent banners before capture and removes 60+ known consent platforms, newsletter popups, and chat widgets; each step can be turned off.
  • Bot checks or CAPTCHAs, blank pages, timeouts, failed loads, and cache hits cost nothing; the response identifies the page verdict and billing status in headers.
  • Its MCP server provides take_screenshot, get_page_info, and capture_pdf tools for Claude, Cursor, and other MCP clients.
  • The Free plan includes 1,000 shots a month with no card; paid plans start at $5 for 3,000 shots. Every feature is on every plan.

Sign up free for 1,000 screenshots a month with no card.

Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.