updates updates

Ruby SDK v2 released - Integration with ActiveStorage and more




We have released a new major version update of the Ruby SDK (v2.0.1) to bring it up to speed with all the new features that have been released in ImageKit to date.

Here is what's new in this release:

  1. Integration with ActiveStorage in addition to CarrierWave for file uploads to ImageKit's media library.
  2. Helper functions for all the media management APIs, including Media Library extensions and custom metadata.
  3. Three new getting started guides. For Rails applications using CarrierWave, ActiveStorage, and plain Ruby.

The API design in version 2.x has been improved and follows Ruby's best practices. If you use an older version of the SDK, you will find the section about upgrading to version 2.x useful.

If you face any issues while using this SDK or have a question or suggestion, please reach out to us at

Improved Media List and Search API with AI tags and metadata search options




Over the past few months, we have added quite a few features to the Media Library that allow you to organize your assets better. You can now

  1. Use AI-powered extensions to tag images basis their content automatically
  2. Read and store the embedded metadata of an asset like its Location, Lens information, Copyright, etc.
  3. Create custom metadata fields to use your own vocabulary and taxonomy to organize your assets.

We have now updated the Media List and Search API to search assets using the information provided by the three features above. The update is seamless and doesn't break any existing integration of the API.

To search using the new parameters, you just need to pass them along with all the other existing search parameters in the field searchQuery.

Using the new search parameters

  1. The AI-generated tags can be passed in the tags parameter of the search query string. For example, if you have used an AI extension like Google Cloud Vision or AWS Rekognition to tag your images, you can search for these assets as shown below.
curl -X GET '' \
-G --data-urlencode "searchQuery=\"tags\" IN [\"football\", \"stadium\"]" \
-u your_private_api_key:
  1. ImageKit now allows you to search only on the following embedded metadata fields -
  • LocationTaken
  • Keywords
  • DateTimeOriginal

For example, you can search for assets originally created in the last year using the DateTimeOriginal field of the asset's embedded metadata, as shown below.

curl -X GET '' \
-G --data-urlencode \
"searchQuery=\"embeddedMetadata.DateTimeOriginal\" > \"1y\"" \
-u your_private_api_key:

You can find more details about values for other embedded metadata fields in our documentation. More embedded metadata fields for search will be made available in the future.

  1. Custom metadata fields of different types have their method of writing the query string. You can find the details about querying each field type in our documentation. For example, to query on a multi-select field like 'brands', that associates a clothing company's brand with the asset, the search query will be as shown below -
curl -X GET '' \
-G --data-urlencode \
"searchQuery=\"customMetadata.brands\" IN [\"nike\", \"adidas\"]" \
-u your_private_api_key:

Our Media List and search API documentation gives more examples and information about each of the new search parameters.

If you face any issues while using this feature or have a question or suggestion, please reach out to us at

Note: The new search parameters are available only via the API as of now. This additional functionality will soon be made available in the Media Library in the Imagekit dashboard UI.

Custom metadata fields for better digital asset organization in the Media Library




With many digital assets produced by every organization, it isn't easy to manage and search for assets just by their names. The need to have a better organization system with a controlled vocabulary is essential.

For example, you would want to associate the festival or sale with the banners you have created for your store - "Halloween", "Thanksgiving", or "Christmas". Or if you sell sports apparel on your online store, then each image could be associated with a specific brand like "Nike", "Adidas", "Puma", and so on. Or the product category associated with it "Shoe", "T-shirt", "Jogger", and so on.

Each of the above examples enforces a set of choices, the controlled vocabulary, on the data associated with a file.

ImageKit's new feature, Custom metadata fields, allows you to set up your own vocabulary and taxonomy to organize digital assets basis your organization's requirements. Instead of trying to fit these values in a file's name or folder structure, you can instead define your metadata fields, define the values they can hold, associate them with your assets as additional information, and search for them using this information.

Currently, this feature is available only via ImageKit's APIs. Through the APIs, you can -

  1. Create a custom metadata field or update or delete it in your account. You can define the field type (Text, Textarea, Number, Date, Boolean, Single-select, or Multi-select), choose if the field is mandatory or not, its range of values, and more.
    "name": "brand",
    "schema": {
        "type": "SingleSelect",
        "selectOptions": ["Nike", "Adidas", "Puma", "Reebok", "Asics", "Others"],
        "isValueRequired": true,
        "defaultValue": "Others"
  1. Provide custom metadata field values associated with an asset at the time of file upload or file update.
curl -X POST "" \
-u 'your_private_api_key:' \
-F 'file=your_file' \
-F 'fileName=red_shoe_123.jpg' \
-F 'customMetadata={"brand":"Nike", "Color":"red"}'
  1. And most importantly, search for assets using the associated custom metadata values.
curl -X GET '' \
-G --data-urlencode \
"searchQuery=\"customMetadata.brand\" IN [\"Nike\", \"Adidas\"]" \
-u your_private_api_key:

If you face any issues while using this feature or have a question or suggestion, please reach out to us at

Note: Very soon, custom metadata fields will be available in ImageKit's dashboard. Here is a sneak peek into how custom metadata fields would look in your ImageKit dashboard!


Media Library Extensions for powerful Digital Asset Management workflows




Very often, you would need to use third-party services to edit or manage your images before you could get them into the ImageKit Media Library.

With the latest update, ImageKit now offers native integrations with best-in-class third-party services, called Media Library Extensions, that will help you simplify your image editing and digital asset management workflows while remaining inside ImageKit.

The first three integrations that we have added are with Google Cloud Vision, AWS Rekognition, and You would be able to utilize the functionality offered by these third-party services when uploading a new image or updating an existing image in the ImageKit Media Library.

You can use Google Cloud Vision and AWS Rekognition extensions to tag images by analyzing the image's content automatically. For example, Cloud Vision generates the following tags for the image shown below.


These tags get stored along with your image in the media library, allowing for better, AI-powered image organization.

The extension is a blessing for all online businesses who need to edit an image's background before putting it on the website. Now, when you upload an image to the Media Library, you can leverage the advanced AI capabilities of's service, and automatically remove or replace the image's existing background. For example, we used this extension on the bottle's image below and replaced it with a grey background.


This would help you deliver a consistent visual experience on your website in a fraction of the time and costs needed for manual image editing.

You can learn more about how these extensions can help you and how they will be billed here and can find the detailed documentation about using these extensions here.

Magento 2 extension 🚀





Product images are the first thing shoppers want when they visit your store, and a pixel-perfect first impression is crucial to driving conversions.

We are thrilled to launch the ImageKit extension for Magento 2 that will help you showcase products using high-quality images that load fast. The extension also provides native integration with ImageKit's Digital Assets Management software.

You can download and install the extension from the Magento marketplace or install it via composer as mentioned in the documentation.

ImageKit Magento Extension features

With ImageKit, you can add and deliver images. The ImageKit Dashboard has multiple options to change the behavior of the ImageKit extension when serving images. These are

  1. Custom domain name - Ability to use the custom domain name to deliver media assets, e.g.,
  2. Automatic Image Format Optimization - Automatically deliver images converted to modern image formats based on viewing device and browser
  3. Image Quality - Adjust the quality of generated images to balance between visual quality and file size minimization
  4. Image Transforms - Leverage ImageKit Media Library to create or modify assets depending on requirements. Learn more here.
  5. ImageKit Media Library - ImageKit Extension integrates the ImageKit Media Library right into the CMS‌

If you face any issues or have a question, please reach out to us at

Consolidated embedded metadata in upload API response





We have improved upload API to return consolidated embedded metadata which includes exif, iptc, and xmp data.

You can request this new embedded metadata by setting embeddedMetadata in responseFields parameter in the upload API request.

// Sample using ImageKit Node.js SDK
var response = await imagekit.upload({
    file : <url|base_64|binary>, //required
    fileName : "my_file_name.jpg",   //required
    responseFields: "embeddedMetadata"

👉 Soon, we will update the search API so that you can search assets based on selected embedded metadata fields.

Embedded metadata fields

Below is the embedded metadata stored in this sample image provided by

    ExifVersion: '0232',
    ImageDescription: 'The description aka caption (ref2019.1)',
    XResolution: 72,
    YResolution: 72,
    ResolutionUnit: 'inches',
    Artist: 'Creator1 (ref2019.1)',
    Copyright: 'Copyright (Notice) 2019.1 IPTC -  (ref2019.1)',
    DateTimeOriginal: new Date('2019-10-16T19:01:03.000Z'),
    OffsetTimeOriginal: '+00:00',
    ComponentsConfiguration: 'Y,Cb,Cr,-',
    FlashpixVersion: '0100',
    ColorSpace: 'Uncalibrated',
    ObjectAttributeReference: 'A Genre (ref2019.1)',
    ObjectName: 'The Title (ref2019.1)',
    SubjectReference: ['IPTC:1ref2019.1', 'IPTC:2ref2019.1', 'IPTC:3ref2019.1'],
    Keywords: ['Keyword1ref2019.1', 'Keyword2ref2019.1', 'Keyword3ref2019.1'],
    SpecialInstructions: 'An Instruction (ref2019.1)',
    TimeCreated: '19:01:03+00:00',
    Byline: 'Creator1 (ref2019.1)',
    BylineTitle: "Creator's Job Title  (ref2019.1)",
    Sublocation: 'Sublocation (Core) (ref2019.1)',
    ProvinceState: 'Province/State(Core)(ref2019.1)',
    CountryPrimaryLocationCode: 'R19',
    CountryPrimaryLocationName: 'Country (Core) (ref2019.1)',
    OriginalTransmissionReference: 'Job Id (ref2019.1)',
    CopyrightNotice: 'Copyright (Notice) 2019.1 IPTC -  (ref2019.1)',
    CaptionAbstract: 'The description aka caption (ref2019.1)',
    WriterEditor: 'Description Writer (ref2019.1)',
    ApplicationRecordVersion: 4,
    CountryCode: 'R19',
    CreatorCity: "Creator's CI: City (ref2019.1)",
    CreatorCountry: "Creator's CI: Country (ref2019.1)",
    CreatorAddress: "Creator's CI: Address, line 1 (ref2019.1)",
    CreatorPostalCode: "Creator's CI: Postcode (ref2019.1)",
    CreatorRegion: "Creator's CI: State/Province (ref2019.1)",
    CreatorWorkEmail: "Creator's CI: Email@1, Email@2 (ref2019.1)",
    CreatorWorkTelephone: "Creator's CI: Phone # 1, Phone # 2 (ref2019.1)",
    CreatorWorkURL: 'http://www.Creators.CI/WebAddress/ref2019.1',
    IntellectualGenre: 'A Genre (ref2019.1)',
    Location: 'Sublocation (Core) (ref2019.1)',
    Scene: ['IPTC-Scene-Code1 (ref2019.1)', 'IPTC-Scene-Code2 (ref2019.1)'],
    SubjectCode: ['IPTC:1ref2019.1', 'IPTC:2ref2019.1', 'IPTC:3ref2019.1'],
    AboutCvTermCvId: '',
    AboutCvTermId: '',
    AboutCvTermName: 'CV-Term Name 1 (ref2019.1)',
    AboutCvTermRefinedAbout: '',
    AdditionalModelInformation: 'Additional Model Info (ref2019.1)',
    ArtworkCircaDateCreated: 'AO Circa Date: between 1550 and 1600 (ref2019.1)',
    ArtworkContentDescription: 'AO Content Description 1 (ref2019.1)',
    ArtworkContributionDescription: 'AO Contribution Description 1 (ref2019.1)',
    ArtworkCopyrightNotice: 'AO Copyright Notice 1 (ref2019.1)',
    ArtworkCreator: [
      'AO Creator Name 1a (ref2019.1)',
      'AO Creator Name 1b (ref2019.1)'
    ArtworkCreatorID: ['AO Creator Id 1a (ref2019.1)', 'AO Creator Id 1b (ref2019.1)'],
    ArtworkCopyrightOwnerID: 'AO Current Copyright Owner ID 1 (ref2019.1)',
    ArtworkCopyrightOwnerName: 'AO Current Copyright Owner Name 1 (ref2019.1)',
    ArtworkLicensorID: 'AO Current Licensor ID 1 (ref2019.1)',
    ArtworkLicensorName: 'AO Current Licensor Name 1 (ref2019.1)',
    ArtworkDateCreated: new Date('1919-10-16T19:01:00.000Z'),
    ArtworkPhysicalDescription: 'AO Physical Description 1 (ref2019.1)',
    ArtworkSource: 'AO Source 1 (ref2019.1)',
    ArtworkSourceInventoryNo: 'AO Source Inventory No 1 (ref2019.1)',
    ArtworkSourceInvURL: 'AO Source Inventory URL (ref2019.1)',
    ArtworkStylePeriod: [
      'AO Style Baroque (ref2019.1)',
      'AO Style Italian Baroque (ref2019.1)'
    ArtworkTitle: 'AO Title 1 (ref2019.1)',
    DigitalImageGUID: '',
    DigitalSourceType: '',
    EmbeddedEncodedRightsExpr: 'The Encoded Rights Expression (ref2019.1)',
    EmbeddedEncodedRightsExprType: 'IANA Media Type of ERE (ref2019.1)',
    EmbeddedEncodedRightsExprLangID: '',
    Event: 'An Event (ref2019.1)',
    GenreCvId: '',
    GenreCvTermId: '',
    GenreCvTermName: 'Genre CV-Term Name 1 (ref2019.1)',
    GenreCvTermRefinedAbout: '',
    ImageRegionName: ['Listener 1', 'Listener 2', 'Speaker 1'],
    ImageRegionOrganisationInImageName: [
      'Organisation name no 1 in region persltr2 (ref2019.1)',
      'Organisation name no 1 in region persltr2 (ref2019.1)',
      'Organisation name no 1 in region persltr3 (ref2019.1)'
    ImageRegionPersonInImage: [
      'Person name no 1 in region persltr2 (ref2019.1)',
      'Person name no 1 in region persltr3 (ref2019.1)',
      'Person name no 1 in region persltr1 (ref2019.1)'
    ImageRegionBoundaryH: [0.385],
    ImageRegionBoundaryShape: ['rectangle', 'circle', 'polygon'],
    ImageRegionBoundaryUnit: ['relative', 'relative', 'relative'],
    ImageRegionBoundaryW: [0.127],
    ImageRegionBoundaryX: [0.31, 0.59],
    ImageRegionBoundaryY: [0.18, 0.426],
    ImageRegionCtypeName: [
      'Region Boundary Content Type Name (ref2019.1)',
      'Region Boundary Content Type Name (ref2019.1)',
      'Region Boundary Content Type Name (ref2019.1)'
    ImageRegionCtypeIdentifier: [
    ImageRegionID: ['persltr2', 'persltr3', 'persltr1'],
    ImageRegionRoleName: [
      'Region Boundary Content Role Name (ref2019.1)',
      'Region Boundary Content Role Name (ref2019.1)',
      'Region Boundary Content Role Name (ref2019.1)'
    ImageRegionRoleIdentifier: [
    ImageRegionBoundaryRx: [0.068],
    ImageRegionBoundaryVerticesX: [0.05, 0.148, 0.375],
    ImageRegionBoundaryVerticesY: [0.713, 0.041, 0.863],
    LinkedEncodedRightsExpr: '',
    LinkedEncodedRightsExprType: 'IANA Media Type of ERE (ref2019.1)',
    LinkedEncodedRightsExprLangID: '',
    LocationCreatedCity: 'City (Location created1) (ref2019.1)',
    LocationCreatedCountryCode: 'R17',
    LocationCreatedCountryName: 'CountryName (Location created1) (ref2019.1)',
    LocationCreatedLocationId: 'Location Id (Location created1) (ref2019.1)',
    LocationCreatedLocationName: 'Location Name (Location created1) (ref2019.1)',
    LocationCreatedProvinceState: 'Province/State (Location created1) (ref2019.1)',
    LocationCreatedSublocation: 'Sublocation (Location created1) (ref2019.1)',
    LocationCreatedWorldRegion: 'Worldregion (Location created1) (ref2019.1)',
    LocationCreatedGPSAltitude: '480 m',
    LocationCreatedGPSLatitude: '48,16.5N',
    LocationCreatedGPSLongitude: '16,20.28E',
    LocationShownCity: [
      'City (Location shown1) (ref2019.1)',
      'City (Location shown2) (ref2019.1)'
    LocationShownCountryCode: ['R17', 'R17'],
    LocationShownCountryName: [
      'CountryName (Location shown1) (ref2019.1)',
      'CountryName (Location shown2) (ref2019.1)'
    LocationShownLocationId: [
      'Location Id 1a(Location shown1) (ref2019.1)',
      'Location Id 1b(Location shown1) (ref2019.1)',
      'Location Id 2a(Location shown2) (ref2019.1)',
      'Location Id 2b(Location shown2) (ref2019.1)'
    LocationShownLocationName: [
      'Location Name (Location shown1) (ref2019.1)',
      'Location Name (Location shown2) (ref2019.1)'
    LocationShownProvinceState: [
      'Province/State (Location shown1) (ref2019.1)',
      'Province/State (Location shown2) (ref2019.1)'
    LocationShownSublocation: [
      'Sublocation (Location shown1) (ref2019.1)',
      'Sublocation (Location shown2) (ref2019.1)'
    LocationShownWorldRegion: [
      'Worldregion (Location shown1) (ref2019.1)',
      'Worldregion (Location shown2) (ref2019.1)'
    LocationShownGPSAltitude: ['140 m', '120 m'],
    LocationShownGPSLatitude: ['48,8.82N', '47,57.12N'],
    LocationShownGPSLongitude: ['17,5.88E', '16,49.8E'],
    MaxAvailHeight: 20,
    MaxAvailWidth: 19,
    ModelAge: [25, 27, 30],
    OrganisationInImageCode: [
      'Organisation Code 1 (ref2019.1)',
      'Organisation Code 2 (ref2019.1)',
      'Organisation Code 3 (ref2019.1)'
    OrganisationInImageName: [
      'Organisation Name 1 (ref2019.1)',
      'Organisation Name 2 (ref2019.1)',
      'Organisation Name 3 (ref2019.1)'
    PersonInImage: ['Person Shown 1 (ref2019.1)', 'Person Shown 2 (ref2019.1)'],
    PersonInImageCvTermCvId: [''],
    PersonInImageCvTermId: [''],
    PersonInImageCvTermName: ['Person Characteristic Name 1 (ref2019.1)'],
    PersonInImageCvTermRefinedAbout: [''],
    PersonInImageDescription: ['Person Description 1 (ref2019.1)'],
    PersonInImageId: [
    PersonInImageName: ['Person Name 1 (ref2019.1)'],
    ProductInImageDescription: ['Product Description 1 (ref2019.1)'],
    ProductInImageGTIN: [123456782019.1],
    ProductInImageName: ['Product Name 1 (ref2019.1)'],
    RegistryEntryRole: [
      'Registry Entry Role ID 1 (ref2019.1)',
      'Registry Entry Role ID 2 (ref2019.1)'
    RegistryItemID: [
      'Registry Image ID 1 (ref2019.1)',
      'Registry Image ID 2 (ref2019.1)'
    RegistryOrganisationID: [
      'Registry Organisation ID 1 (ref2019.1)',
      'Registry Organisation ID 2 (ref2019.1)'
    Creator: 'Creator1 (ref2019.1)',
    Description: 'The description aka caption (ref2019.1)',
    Rights: 'Copyright (Notice) 2019.1 IPTC -  (ref2019.1)',
    Subject: ['Keyword1ref2019.1', 'Keyword2ref2019.1', 'Keyword3ref2019.1'],
    Title: 'The Title (ref2019.1)',
    AuthorsPosition: 'Creator&#39;s Job Title  (ref2019.1)',
    CaptionWriter: 'Description Writer (ref2019.1)',
    City: 'City (Core) (ref2019.1)',
    Country: 'Country (Core) (ref2019.1)',
    Credit: 'Credit Line (ref2019.1)',
    DateCreated: new Date('2019-10-16T19:01:03.000Z'),
    Headline: 'The Headline (ref2019.1)',
    Instructions: 'An Instruction (ref2019.1)',
    Source: 'Source (ref2019.1)',
    State: 'Province/State(Core)(ref2019.1)',
    TransmissionReference: 'Job Id (ref2019.1)',
    CopyrightOwnerID: [
      'Copyright Owner Id 1 (ref2019.1)',
      'Copyright Owner Id 2 (ref2019.1)'
    CopyrightOwnerName: [
      'Copyright Owner Name 1 (ref2019.1)',
      'Copyright Owner Name 2 (ref2019.1)'
    ImageCreatorID: 'Image Creator Id 1 (ref2019.1)',
    ImageCreatorName: 'Image Creator Name 1 (ref2019.1)',
    ImageCreatorImageID: 'Image Creator Image ID (ref2019.1)',
    ImageSupplierID: 'Image Supplier Id (ref2019.1)',
    ImageSupplierName: 'Image Supplier Name (ref2019.1)',
    ImageSupplierImageID: 'Image Supplier Image ID (ref2019.1)',
    LicensorCity: ['Licensor City 1 (ref2019.1)', 'Licensor City 2 (ref2019.1)'],
    LicensorCountry: [
      'Licensor Country 1 (ref2019.1)',
      'Licensor Country 2 (ref2019.1)'
    LicensorEmail: ['Licensor Email 1 (ref2019.1)', 'Licensor Email 2 (ref2019.1)'],
    LicensorExtendedAddress: [
      'Licensor Ext Addr 1 (ref2019.1)',
      'Licensor Ext Addr 2 (ref2019.1)'
    LicensorID: ['Licensor ID 1 (ref2019.1)', 'Licensor ID 2 (ref2019.1)'],
    LicensorName: ['Licensor Name 1 (ref2019.1)', 'Licensor Name 2 (ref2019.1)'],
    LicensorPostalCode: [
      'Licensor Postcode 1 (ref2019.1)',
      'Licensor Postcode 2 (ref2019.1)'
    LicensorRegion: ['Licensor Region 1 (ref2019.1)', 'Licensor Region 2 (ref2019.1)'],
    LicensorStreetAddress: [
      'Licensor Street Addr 1 (ref2019.1)',
      'Licensor Street Addr 2 (ref2019.1)'
    LicensorTelephone1: ['Licensor Phone1 1 (ref2019.1)', 'Licensor Phone1 2 (ref2019.1)'],
    LicensorTelephone2: ['Licensor Phone2 1 (ref2019.1)', 'Licensor Phone2 2 (ref2019.1)'],
    LicensorURL: ['Licensor URL 1 (ref2019.1)', 'Licensor URL 2 (ref2019.1)'],
    ModelReleaseID: [
      'Model Release ID 1 (ref2019.1)',
      'Model Release ID 2 (ref2019.1)'
    PropertyReleaseID: [
      'Property Release ID 1 (ref2019.1)',
      'Property Release ID 2 (ref2019.1)'
    Rating: 1,
    UsageTerms: 'Rights Usage Terms (ref2019.1)',
    WebStatement: '',
    DateTimeCreated: new Date('2019-10-16T19:01:03.000Z'),
    Caption: 'The description aka caption (ref2019.1)',
    Writer: 'Description Writer (ref2019.1)'

Folder upload with directory structure preserved





Now you can upload an entire folder while preserving the directory structure of nested files and folders.

Screenshot 2021-08-26 at 1.05.14 PM.png

You can also drag the whole folder on the media library page.

See the list of all files in nested folders

You can see all the added files. Click on edit to change the file name or add tag or set coordinates for a custom focus area.


Check the nested folder path

In edit mode, you can also check the folder path in which the file will be uploaded. ImageKit will create all nested subfolders if they are not already present in your media library.


HEIF (HEIC) image format support





ImageKit now supports decoding HEIF and HEIC images to web-safe image formats - JPG, PNG, and WebP. ImageKit will automatically determine the formats supported on the requesting device and convert the image to the appropriate format. You can carry out all ImageKit transformations on these images.

Learn more from the docs.

AVIF speed improvement





There have been massive speed improvements in the encoding AVIF image. We have updated our systems to leverage these improvements.

Reach out to to enable AVIF format on your account.

✅ Backup media library assets





You can now backup all media library assets in your S3 bucket by setting up an active backup.

Go to Settings ➡ Backup bucket -


Learn more from the documentation.