Getting started

Integration & migration

Image & video API

DAM user guide

API overview


Integrate AWS S3 with

Connect AWS S3 as an external storage with ImageKit to get real-time image and video optimization and transformation capabilities in minutes.

You can add your existing Amazon S3 bucket as an origin in This allows you to use's real-time optimization, transformation, and streaming features on all existing images and videos stored in the bucket. With this integration, you will also be able to deliver non-media files like JS, CSS, and more.

Before continuing, understand how external storage integration works, what is URL endpoint, and how to troubleshoot 404 errors.

Amazon S3 buckets in regions launched after 2019-03-20, such as South Africa (Cape Town), Middle East (Bahrain), and Asia Pacific (Hong Kong), must be added to ImageKit as S3-compatible external storages with the endpoint of that region (e.g. Read more about how to add S3-compatible external storages to ImageKit.

Step 1: Configure origin

  1. Go to the external storage section in your dashboard, and under the External Storage section, click on the "Add new" button.
  2. Choose Amazon S3 from the origin type dropdown.
  3. Give your origin a name. It will appear in the list of origins you have added. For example - Product images bucket.
  4. Fill out the S3 bucket name.
  5. Specify the S3 bucket folder in which your files are present. If you must access files at the root (i.e., present directly in the bucket and not inside a folder), enter /.
  6. Fill out the S3 access and secret keys. These keys should provide read-only access to, as explained below.
  7. Leave the advanced options as it is for now.
  8. Click on the Submit button.

Read-only permission required needs read-only access to your S3 bucket. You can provide this using the AWS Identity and Access Management (AIM) policy for your S3 bucket. Ideally, you should create a separate user for this purpose and assign the IAM policy for that particular user and the required buckets only.

Note that you need to provide permission for the operation s3::GetObject on the objects in your bucket. The minimal permission policy should look like the one below. Please change the bucket name to that of your bucket.

    "Version": "2012-10-17",
    "Statement": [
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": [

If you are not sure about how to create this policy in the AWS console and need a step-by-step guide with screenshots, check out this blog post.

Step 2: Access the file through URL endpoint

When you add your first external source (origin) in the dashboard, the origin is, by default, made accessible through the default URL endpoint of your account. For subsequent origins, you can either create a separate URL endpoint or edit the existing URL endpoint (including default) and make this newly added origin accessible by editing the origin preference list.

So when you request, internally accesses the object at path rest-of-the-path.jpg in your bucket.

            URL endpoint                transformation      file path

Let's look at a few examples to fetch an image file. The same would work for other file types as well.

If you get a "Not found" error while accessing the file, check out this troubleshooting guide.

You can also use a custom domain like

Step 3: Integrate and Go live

Start using URLs in your application to deliver perfect images and videos.

Handling special characters in filename or object key

If you’ve configured an S3 bucket as an origin and the bucket has objects with special characters, ImageKit might not be able to fetch files with such names and return a 404 Not Found response. For example, if the key in S3 is image%2Bexample.jpg, it may not work with ImageKit.

To overcome this, add your S3 bucket as a Web Server origin with the Base URL as the S3 bucket URL(usually Map this origin to the same endpoint where you've already added the S3 bucket as an origin after the S3 bucket.

After doing this, your endpoint mapping should contain the S3 bucket (with native integration to S3) followed by the S3 bucket added as a Web Server.

Include canonical response header

When enabled, the response contains a Link header with the appropriate URL and rel=canonical. You will have to specify the base URL for the canonical header.

For example, if you set as the base URL for the canonical header, then the response for URL will have a Link header like this:

Link: <>; rel="canonical"