# ScreenshotOne.com Full Documentation # How credits work in ScreenshotOne :::note Currently, everything costs 1 credit, be it a full-page screenshot, a scrolling screenshot, a PDF, or a video. It is done that way to keep the pricing simple and predictable. ::: Every plan on ScreenshotOne comes with a monthly credit allowance. Credits reset at the start of each billing cycle—regardless of whether you’re on a monthly or annual plan. - **Monthly plans**: Credits refresh on the same day you subscribed each month. - **Annual plans**: You pay once per year, but your credits still refresh monthly, giving you a predictable reset cadence. - **No rollover**: Unused credits expire at the end of the cycle. - **Overages**: If you go over your limit and [extra charging is enabled, extra screenshots are billed automatically based on your plan’s per-credit rate](https://screenshotone.com/docs/charging-extra/). This keeps your usage simple and helps you forecast your monthly screenshot volume, even if you prefer paying annually. ## Cancellation When you cancel a plan, you keep your current billing cycle until it ends. Your credit behavior depends on that cycle: ### You keep your credits until the cycle ends All remaining credits stay available and usable until the end of your current billing period. Nothing is removed immediately. ### No new credits after cancellation When your cycle ends, your plan won’t renew and you won’t receive the next month’s credit reset. You will be downgraded to the free plan or if the free plan is not available, you will lose access to the service. ### No refunds for unused credits Because credits are issued monthly and expire at the end of each cycle, any unused credits at the moment your billing period ends simply expire. ### Annual subscribers If you’re on an annual plan: - You continue to receive monthly credit resets until the end of your paid annual term. - Once the annual term ends, no new credits are issued. - Any remaining credits at that moment expire. ## Support If you have any questions or need help, please contact our support team at [support@screenshotone.com](mailto:support@screenshotone.com). # Errors import Alert from "@/components/Alert.astro"; There is [a detailed guide](/docs/guides/how-to-handle-api-errors/) on how to handle the ScreenshotOne API errors. The request might return an error due to an internal error, invalid options or when the limit is reached. Our screenshot API follows the HTTP status code semantic and returns JSON in case of an error: ``` GET https://api.screenshotone.com/?[options] Content-Type: application/json { "is_successful": false, "error_code": "an_error_code", "error_message": "An error message", "documentation_url": "..." } ``` The API will always return a human-readable error message, error code as a string key, and suitable HTTP status code. ## Codes with explanations | Error Code | HTTP Status | Explanation | | ---------------------------------------------------------------------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [access_key_required](/docs/errors/access-key-required/) | 400 | The "access_key" parameter is required. Please, check out [the access page](https://dash.screenshotone.com/access) to get the access key. | | [access_key_invalid](/docs/errors/access-key-invalid/) | 400 | The "access_key" parameter is given, but it is not correct. Please, check out [the access page](https://dash.screenshotone.com/access) to check the access key. | | [signature_is_required](/docs/errors/signature-is-required/) | 400 | The "signature" parameter is required. Because signing requests is required in [the access page](https://dash.screenshotone.com/access). Make sure you use [the correct signing algorithm](/docs/signed-requests/). | | [signature_is_not_valid](/docs/errors/signature-is-invalid/) | 400 | You provided the "signature" parameter, but it is not valid. Make sure you use [the correct signing algorithm](/docs/signed-requests/). | | [screenshots_limit_reached](/docs/errors/usage-quota-exceeded/) | 400 | The usage quota has been exceeded. Please, either upgrade to a plan with more quota or change the maximum allowed limit (if possible) in the ScreenshotOne dashboard. If it is a mistake, please, reach out at `support@screenshotone.com.` | | [concurrency_limit_reached](/docs/errors/concurrency-limit-reached/) | 400 | You reached the request concurrency limit, retry after a while. Or feel free to [upgrade you current plan](https://dash.screenshotone.com/subscription). | | [request_not_valid](/docs/errors/request-invalid/) | 400 | The request parameters are not valid. You can look at the `error_details` response field to get the details. | | [selector_not_found](/docs/errors/selector-not-found/) | 400 | If [selector](/docs/options#selector) is specified and `error_on_selector_not_found=true`, the error will be returned if the element by selector is not visible or it took more than `timeout` seconds to render it, but not more than 30 seconds. | | [name_not_resolved](/docs/errors/name-not-resolved/) | 400 | Usually, the error happens when the domain name of the requested URL is not resolved. If you are trying to take a screenshot of the new site, please, wait a bit until the DNS records are refreshed. | | [network_error](/docs/errors/network-error/) | 500 | The error happens when the API can't connect to the provided URL. It might mean that the site blocks the API or is temporarily unavailable. Generally, you can safely retry to take a screenshot. | | [invalid_storage_configuration](/docs/errors/invalid-storage-configuration/) | 400 | If you haven't created the bucket in the `us-east-1` AWS region, please, specify your bucket region through an endpoint in a format like `https://s3..amazonaws.com`. | | [script_triggers_redirect](/docs/errors/script-triggers-redirect/) | 400 | The specified "scripts" option might trigger a redirect, please, specify the "scripts_wait_until" option. If you think it is a mistake, please, reach out at `support@screenshotone.com`. | | [host_returned_error](/docs/errors/host-returned-error/) | 500 | If the host doesn't respond successfully within the range of 200-299 status codes, the API won't take a screenshot. You can force the API to take a screenshot of the error page by specifying [ignore_host_errors=true](/docs/options#ignore_host_errors). You can get the returned status code from the site by reading the `returned_status_code` field. | | [timeout_error](/docs/errors/timeout/) | 500 | The screenshot couldn't be taken within the specified timeout. Either the site doesn't respond quickly, or rendering takes longer than expected. Play with the `timeout` or the `navigation_timeout` options or reach the support for the investigation. | | [internal_application_error](/docs/errors/internal-application-error/) | 500 | The API failed to serve your request. You can safely replay the request. We are notified about it instantly and will try to fix it as soon as possible. If the error is repeated for a long time, feel free to reach out at support@screenshotone.com. | | [storage_access_denied](/docs/errors/storage-access-denied/) | 400 | Failed to upload the screenshot to the storage since access was denied. Check the API keys you specify when using the storage integration. | | [storage_returned_transient_error](/docs/errors/storage-returned-transient-error/) | 500 | The storage returned an HTTP status code between 500 and 599 and we exhausted retries. You can likely retry the request again. | | [request_aborted](/docs/errors/request-aborted/) | 500 | The request was aborted either by the user or the intermediate proxies and can't be fulfilled. If the error persists, please, reach out to support@screenshotone.com. | | [content_contains_specified_string](/docs/errors/content-contains-specified-string/) | 500 | The page content contains the specified string by the [fail_if_content_contains](/docs/options#fail_if_content_contains) option. If it seems to be a mistake or not what you expected, please, reach out to \`support@screenshotone.com\` as quickly as possible, and will assist and try to resolve your problem. | | [temporary_unavailable](/docs/errors/temporary-unavailable/) | 503 | The API is temporarily unavailable due to an error or overload. Please wait a bit and then safely retry your request. | | [invalid_cookie_parameter](/docs/errors/invalid-cookie-parameter/) | 400 | The `cookies` parameters you provided are invalid. Please, consider providing different values and adhere to the format specified in the ScreenshotOne documentation. | | [resulting_image_too_large](/docs/errors/resulting-image-too-large/) | 400 | The resulting image is too large for the specified format. Please, consider providing different values and adhere to the format specified in the ScreenshotOne documentation. | | [matched_failed_request](/docs/errors/matched-failed-request/) | 500 | The request matched by the specified pattern by the [fail_if_request_failed](/docs/options#fail_if_request_failed) option has been failed. If it seems to be a mistake or not what you expected, please, reach out to \`support@screenshotone.com\` as quickly as possible, and will assist and try to resolve your problem. | | [invalid_header_parameter](/docs/errors/invalid-header-parameter/) | 400 | The `headers` parameters you provided are invalid. Please, consider providing different values and adhere to the format specified in the ScreenshotOne documentation. | | [request_body_too_large](/docs/errors/request-body-too-large/) | 413 | The request body is too large. Please, reduce the size of the request body or reach out to \`support@screenshotone.com\` for assistance. | ## List of all errors 1. [Timeout error](/docs/errors/timeout/). 2. [Storage Access Denied](/docs/errors/storage-access-denied/). 3. [Script Trigger Redirect](/docs/errors/script-triggers-redirect/). 4. [Internal Application Error](/docs/errors/internal-application-error/). 5. [Usage Quota Exceeded](/docs/errors/usage-quota-exceeded/). 6. [Request Aborted](/docs/errors/request-aborted/). 7. [Access Key Required](/docs/errors/access-key-required/). 8. [Access Key Invalid](/docs/errors/access-key-invalid/). 9. [Signature Is Required](/docs/errors/signature-is-required/). 10. [Signature Is Not Valid](/docs/errors/signature-is-invalid/). 11. [Screenshots Limit Reached](/docs/errors/usage-quota-exceeded/). 12. [Concurrency Limit Reached](/docs/errors/concurrency-limit-reached/). 13. [Request Not Valid](/docs/errors/request-invalid/). 14. [Selector Not Found](/docs/errors/selector-not-found/). 15. [Name Not Resolved](/docs/errors/name-not-resolved/). 16. [Network Error](/docs/errors/network-error/). 17. [Invalid Storage Configuration](/docs/errors/invalid-storage-configuration/). 18. [Host Returned Error](/docs/errors/host-returned-error/). 19. [Storage Returned Transient Error](/docs/errors/storage-returned-transient-error/). 20. [Content Contains Specified String](/docs/errors/content-contains-specified-string/). 21. [Temporary Unavailable](/docs/errors/temporary-unavailable/). 22. [Invalid Cookie Parameter](/docs/errors/invalid-cookie-parameter/). 23. [Resulting Image Too Large](/docs/errors/resulting-image-too-large/). 24. [Matched Failed Request](/docs/errors/matched-failed-request/). 25. [Invalid Header Parameter](/docs/errors/invalid-header-parameter/). 26. [Request Body Too Large](/docs/errors/request-body-too-large/). # Bulk Screenshots import Alert from "@/components/Alert.astro"; :::tip Our bulk screenshots API endpoint is a simple wrapper endpoint around the regular screenshot API endpoints like (`/take`, `/animate`, and similar). But since it is a simple wrapper, you might find it much better to implement your own bulk screenshot solution. Check out our guide on [how to take screenshots of multiple URLs](/docs/guides/bulk-screenshots/) with ScreenshotOne API. ::: ## Request You can use a bulk screenshot-taking feature to take many screenshots in one request. Send a simple POST HTTP request to `/bulk` path with the list of URLs (HTML or Markdown): ``` POST https://api.screenshotone.com/bulk { "access_key": "" "execute": false, "optimize": false, "options": {"url": "https://example.com", "viewport_width": 1280, "viewport_height": 1024, "block_ads": true},     "requests": [ {"viewport_width": 360, "viewport_height": 640}, // a screenshot of example.com with a different viewport         {"url": "https://example.com"},         {"url": "https://finance.yahoo.com", "block_cookie_banners": true},         {"html": "

Hello, world!

", "block_ads": false},         {"markdown": "**Yes!**"}     ] } ``` The options property contains default options that will be applied to every request. And for every request, you can specify options to override the default values. You can specify all [the regular options you use to take a single screenshot](/docs/options). You can specify the access key as a query parameter `access_key=`, an HTTP header `X-Access-Key: `, or in the request's body. ## Response The response contains an array of screenshot URLs you can use to download the screenshots: ```json { "responses": [ {"url": "https://api.screenshotone.com/take?url=http://example.com&viewport_width=1280&viewport_height=1024&block_ads=true"}, {"url": "https://api.screenshotone.com/take?url=https://finance.yahoo.com&viewport_width=1280&viewport_height=1024&block_ads=true&block_cookie_banners=true"}, {"url": "https://api.screenshotone.com/take?html=

Hello, world!

&viewport_width=1280&viewport_height=1024&block_ads=false&block_cookie_banners=true"} ] } ``` But if you requested to [execute requests](#execute-requests), the result will also contain a summary execution response for each request: ``` [ { "url": "https://api.screenshotone.com/take?url=http://example.com&viewport_width=1280&viewport_height=1024&block_ads=true", "response": { "is_successful": true, "status": 200, "statusText": "OK" } }, { "url": "https://api.screenshotone.com/take?url=https://finance.yahoo.com&viewport_width=1280&viewport_height=1024&block_ads=true&block_cookie_banners=true", "response": { "is_successful": true, "status": 200, "statusText": "OK" } }, { "url": "https://api.screenshotone.com/take?html=

Hello, world!

&viewport_width=1280&viewport_height=1024&block_ads=false&block_cookie_banners=true", "response": { "is_successful": true, "status": 200, "statusText": "OK" } }, { "url": "https://api.screenshotone.com/take?markdown=**Yes!**&viewport_width=1280&viewport_height=1024&block_ads=false&block_cookie_banners=true", "response": { "is_successful": true, "status": 200, "statusText": "OK" } } ] ``` As you noticed, images are not returned, but in case of an error, the `is_successful` property will be `false`, and you can expect the `body` property to explore the error: ``` [ { "url": "https://api.screenshotone.com/take?url=http://example.com&viewport_width=1280&viewport_height=1024&block_ads=true", "response": { "is_successful": false, "status": 400, "statusText": "Bad request", body: { "error_code": "concurrency_limit_reached" "error_message": "Concurrency limit is reached" } } } ] ``` ## Execute requests Bulk screenshots are implemented in a lazy loading way. It means that the screenshot is literally taken when you tried to download it, not when you sent a bulk request. If you want to execute each request before you get a response, set the parameter `execute` to `true`: ``` POST https://api.screenshotone.com/bulk { "access_key": "" "execute": true, // ... } ``` But make sure to wait enough time until all the screenshots are done. ## Optimizations To take bulk screenshots faster, you can use the optimization feature if you want to take bulk screenshots for the same URLs (HTML or Markdown) but with a different set of parameters: ``` POST https://api.screenshotone.com/bulk { "access_key": "" "execute": true, "optimize": true, "options": {"url": "https://example.com", "viewport_width": 1280, "viewport_height": 1024},     "requests": [ {"viewport_width": 360, "viewport_height": 640}, // a screenshot of example.com with a different viewport {"viewport_width": 736, "viewport_height": 414}     ] } ``` The feature only works when `execute` is set to `true`. The optimization is not guaranteed since many sites can reload and take the same time to render in case the viewport is changed. And some options, like blocking and not blocking ads, do require a page reload, which takes the same time as not using optimization at all. The best approach is to test if it works for your use case. ## Use cases ### Upload bulk screenshots to S3-compatible storage In the example, I want to take screenshots for one site but for different devices and upload them to [S3-compatible storage](https://screenshotone.com/docs/options/#storing): ``` POST https://api.screenshotone.com/bulk { "access_key": "" "execute": true, "options": {"url": "https://example.com", "store": true, "response_type": "empty"},     "requests": [ {"viewport_device": "pixel_4a_5g_landscape", "storage_path": "pixel_4a_5g_landscape"}, {"viewport_device": "iphone_13_pro", "storage_path": "iphone_13_pro"}, {"viewport_device": "iphone_13", "storage_path": "iphone_13"}     ] } ``` In this example, I upload screenshots taken from different devices and save the files with the names of the devices. ## Limitations Currently, only up to 20 requests are supported in the one bulk request. # ScreenshotOne IP Ranges In case you need to allow access from the ScreenshotOne API to your servers or your proxy provider allow list, you can configure your firewall to allow the following IP addresses: 1. IPs for the `east-4` region [from public Google Cloud IP ranges](https://www.gstatic.com/ipranges/cloud.json). 2. Hetzner GPU rendering IP (if applicable for your use case)—`95.216.67.59`. 3. IP range for New York from [DigitalOcean Public IPs](https://digitalocean.com/geo/google.csv). If that doesn't work for you, please, reach out at `support@screenshotone.com` with any questions you have and we will try to get back to you as soon as possible. # Async and Webhooks import Alert from "@/components/Alert.astro"; ScreenshotOne supports asynchronous screenshot rendering and webhooks. The document describes both of them in one place since usually they are used together. The main current supported use case is to render screenshots asynchronously, [upload them to S3](/docs/upload-to-s3/) and return the file location to the specified webhook. That's what customers asked to implement first. ## Async You can literally execute any request asynchronously by setting the `async` option to `true.` But not every request makes sense to execute asynchronously. Once you set `async=true,` the API checks your access key and limits and returns the response immediately but continues to execute the request. One of the top use cases for which it was requested is uploading files to S3 asynchronously without waiting for screenshots to be rendered. An example of such a request could be: ``` https://api.screenshotone.com/take?access_key=0MpjJxw8Vk7ZAw&url=https://example.com&store=true&storage_path=example.com&response_type=json&async=true ``` You request rendering but don't wait for the response. What if you want to get the result of uploading? You can do it by using webhooks. ## Webhooks Using webhooks with ScreenshotOne allows you to deliver the results of the request execution to your URL as a POST body. Currently, caching is not supported for webhooks since it doesn't make much sense. If you need its support for other use cases, please, send a chat message or email to `support@screenshotone.com`. You can use webhooks with both synchronous and asynchronous requests. But usually, it is used in combination with asynchronous requests. An example of an asynchronous request that uploads rendered screenshot to S3 and sends a webhook might look like this: ``` https://api.screenshotone.com/take?access_key= &url=https://example.com &store=true &storage_path=example.com &response_type=json &async=true &webhook_url= &storage_return_location=true ``` Not that, to get the location, you must specify the `storage_return_location` parameter as `true`. An example of the webhook request body you will receive: ``` { "screenshot_url": "...", // ... "store": { // ... "location": "..." }, } ``` You also receive the `X-ScreenshotOne-Signature` (`x-screenshotone-signature`) header that you should use to validate the webhook request body and make sure that ScreenshotOne sent the request. If you do not upload the screenshot to any S3-compatible storage, you will receive [the `screenshot_url`](/docs/screenshot-url/) in the response body if you set `response_type=json`: ```json { // ... "screenshot_url": "..." } ``` If you don't specify the `response_type` parameter as `json`, you will receive the screenshot in the binary format in the response body. ``` ``` ### Verifying Signature To ensure that ScreenshotOne sent the request, you should get the signature from the `X-ScreenshotOne-Signature` header and verify it with your secret key from [the access page](https://dash.screenshotone.com/access) by applying the HMAC SHA-256 algorithm. Never share your secret key with any party. In case it is leaked, you can quickly regenerate it on [the access page](https://dash.screenshotone.com/access). A pseudo-code on TypeScript (Node.js) of how you can do it: ```javascript import * as crypto from "crypto"; const receivedSignature = request.headers.get("x-screenshotone-signature"); const requestBody = await request.rawText(); const calculatedSignature = crypto .createHmac("sha256", yourSecretKey) .update(requestBody, "utf-8") .digest("hex"); if (calculatedSignature !== receivedSignature) { // the signature is not valid // you should not process this request and reject it immediately throw new Error("..."); } // it is safe to process the request // you can do something with the webhook request body ``` ### Disable Signing Singing webhook request body takes time. If you are sure that your webhooks are unique and secret, you might want to disable signing to improve performance by using `webhook_sign=false`. ### Debugging and support headers There are a few headers that are not part of the body and are not participating in the signing. They must not be used for any logic; it is just for debugging and support purposes: - `x-screenshotone-rendering-seconds`—screenshot rendering time in seconds with fractions, e.g. `2.56`; - `x-screenshotone-size-bytes`—screenshot size if available (not streaming), e.g. `30033`; - `x-screenshotone-trace-id`—unique request trace id when reaching out to the ScreenshotOne support; - `x-screenshotone-reference`—screenshot or video id (if available) that can be seen in the history or used when reaching out to the ScreenshotOne support. ### External identifier You can set `external_identifier` parameter to any alphanumeric value. It will be included in the webhook request headers: - `x-screenshotone-external-identifier`—external identifier. It is helpful for error tracking and successful request tracking. ### Webhook errors We currently don't support a separate endpoint to send webhook errors. But you can still get them in the webhook request body or headers. By default, errors are not sent to the webhook URL, at all. But if you want to get them, you can set `webhook_errors=true` parameter. And you will get error details in the webhook request body if the JSON response type is used: ```javascript { // ... "error_code": "...", "error_message": "...", "documentation_url": "..." } ``` Or always in the headers: - `x-screenshotone-error-code`—error code; - `x-screenshotone-error-message`—error message; - `x-screenshotone-documentation-url`—documentation URL about the error. Check out all possible error codes in the [API error reference](/docs/errors/). ### Testing webhook errors You can test it with an URL like this `https://example.com/404`. It will trigger an error. In general, it is enough to check for the error code presence or absence of the screenshot URL/binary data to determine if the request was successful or not. In the worst case scenario, you might assume if you haven't been notified about any errors or successful requests, likely the request has been failed. ## Summary That's it. In case you have any questions or problems, feel free to write to `support@screenshotone.com`. # Organizations and Roles Organizations are the core unit for managing your ScreenshotOne account. Every user belongs to one organization, and all billing, API access, and resources are scoped to the organization level. ## Roles There are three roles in an organization: ### Owner The owner has full control over the organization: - Full access to billing, invoices, and subscription management - Can invite and remove members - Can change member roles - Can transfer ownership to another member - Can delete the organization - Can configure notifications Every organization has exactly one owner. When you sign up, you automatically become the owner of your organization. ### Admin Admins are trusted team members who can help manage the organization: - Can view and manage billing information - Can invite and remove members - Can change member roles (promote/demote between admin and developer) - Can edit organization settings - Can configure notifications - **Cannot** transfer ownership - **Cannot** delete the organization Use the admin role for team leads, managers, or anyone who needs to manage the team without having full control. ### Developer Developers have access to everything needed to integrate with ScreenshotOne: - Can view and manage API keys - Can view request logs and screenshot history - Can access the playground - Can configure S3 storage - Can view organization members (read-only) - **Cannot** manage members or invites - **Cannot** view billing or payment information - **Cannot** change organization settings Use the developer role for engineers and team members who need to work with the API but don't need administrative access. ## Managing Your Team ### Inviting Members 1. Go to the **Organization** page 2. Click **Invite new member** 3. Enter the email address 4. Select a role (Developer or Admin) 5. Click **Invite** The invited user will receive an email with instructions to join. They can sign in (or sign up if new to ScreenshotOne) to accept the invitation. **Note:** You cannot invite users who already have an active subscription or are owners of another organization with members. ### Changing Roles 1. Go to the **Organization** page 2. Find the member in the list 3. Click **Change role** 4. Select the new role (Developer or Admin) 5. Click **Change Role** Only owners and admins can change roles. You cannot change the owner's role or your own role. ### Removing Members 1. Go to the **Organization** page 2. Find the member in the list 3. Click **Remove member** 4. Confirm the removal When a member is removed, they are moved to their own organization with fresh API keys. **Important:** They may still have copies of your API keys. Consider regenerating your keys after removing a member. ### Transferring Ownership If you need to transfer ownership to another member: 1. Go to the **Organization** page 2. Find the member who will become the new owner 3. Click **Transfer ownership** 4. Confirm the transfer After transfer, you will become a developer in the organization. Only the owner can transfer ownership, and only if no members have active legacy subscriptions. ## Common Use Cases ### Small Team - **Owner**: Founder or team lead (handles billing) - **Developers**: Engineers working on the integration ### Medium Team - **Owner**: Finance or operations (manages billing) - **Admins**: Team leads (manage their developers) - **Developers**: Engineers ### Enterprise - **Owner**: Account administrator - **Admins**: Department heads or project managers - **Developers**: Development teams ## FAQ **Can I have multiple owners?** No, each organization has exactly one owner. Use the admin role for additional people who need management access. **What happens to removed members?** They get their own organization with a free plan and new API keys. They lose access to your organization's resources immediately. **Can developers see billing information?** No, only owners and admins can view billing, invoices, and subscription details. **Can admins change the subscription?** Yes, admins have full access to billing and can change plans, update payment methods, and manage the subscription. **What if I need help?** Contact us at support@screenshotone.com or use the support chat. We're happy to help with any organization-related questions. # Animated Screenshots import Alert from "@/components/Alert.astro"; import Video from "@/components/Video.astro"; In case you need a custom scenario or have propositions, feel free to reach out at `support@screenshotone.com`. You can rely on ScreenshotOne API to generate animated screenshots and handle image and video streaming infrastructure. ScreenshotOne supports animated (including scrollable) screenshots of different types, caching based on the world’s fastest and most potent CDN (Cloudflare), blocking ads, cookie banners, and chats. In just one API request, you can quickly generate animated screenshots. And if you need more, various scenarios with many options are covered. Grasp how simple it is: ``` https://api.screenshotone.com/animate?url=https://tailwindcss.com&scenario=scroll&access_key= ``` The result might differ a bit in case default options are changed, but as for now, it is similar to what I have shown in the video: