In brief
From this page’s summary fields, verified 2026-11-10. Sources in each section.- Authentication (details in section Authentication)
- Basic auth, API key, JWT, OAuth 2.0 (PKCE)
- Rate limit (details in section Limits & quirks)
- Burst + sustained per endpoint, HTTP 429; ~40 reads/s, 5-20 writes/s advised; Upload API unlimited
- Webhooks (details in section Events & webhooks)
- Dashboard or API, 15 event types, Standard Webhooks HMAC-SHA256, max 3 endpoints
- Pagination (details in section At a glance)
- offset (skip/limit, max 1,000) on file listing; cursor on tag listing
- API spec (details in section Stored API specs)
- OpenAPI 3.1.0 (1 file, 60 operations), Apache-2.0
Scope: the REST APIs behind ImageKit's Media Library (DAM) and account: Upload, file and folder management, custom metadata fields, saved extensions, cache purge, metadata extraction, account management (usage, origins, URL endpoints, named transformations, webhooks). Also covered: webhooks, SDKs and the hosted MCP servers. The URL-based delivery and transformation API (https://ik.imagekit.io/{imagekit_id}/…) is summarised only where it touches DAM integration. All facts come from public documentation and the public OpenAPI file. No authenticated call was made; marks unauthenticated probes.
At a glance
https://api.imagekit.io/v1/… S26. Upload: https://upload.imagekit.io/api/v1/files/upload (V1) and https://upload.imagekit.io/api/v2/files/upload (V2, beta) S26. Delivery: https://ik.imagekit.io/{imagekit_id}/{path}, or a custom domain on Pro and above S1 S3. Hosted MCP: https://imagekit.io/mcp/dam, https://imagekit.io/mcp/admin, https://devtools-mcp.imagekit.io/mcp S25. The API host is the same for every processing region; the region is a per-account setting S26 S64/v1/…; upload v1 and v2). The spec's own version is 1.0.0; it changes through dated commits rather than version numbers S26. Upload V2 (JWT) is labelled beta S26. Deprecated: the local npm MCP package @imagekit/api-mcp and its hosted endpoint https://api-mcp.imagekit.io/mcp, replaced by the DAM and Admin servers S25 S32. Webhooks: the legacy x-ik-signature header is still sent alongside the Standard Webhooks headers S24. Legacy npm package imagekit deprecated in favour of @imagekit/nodejs S31token, expire and an HMAC-SHA1 signature computed server-side with the private key, plus the public key S26. Client-side upload V2: a server-generated JWT (HS256, kid = public key) that signs all upload parameters S90. MCP (DAM, Admin): OAuth 2.0 authorization code with PKCE (S256), dynamic client registration, refresh tokens S35 S25. OAuth is used only by the MCP servers; the REST API documents API keys only S22 S26None / Read only / Read and write per resource group (media management, account management) S23. MCP OAuth scopes follow the pattern mcp_{resource}:{read|write|update|delete}. Resources: media_library, custom_metadata_fields, cache (DAM server); origins, url_endpoints, webhooks, usage:read, billing:read (Admin server). Plus openid and offline_access S35 S36. MCP actions are further limited by the user's role and DAM sharing permissions S25imagekit-developer/openapi (Apache-2.0), generated with Stainless; 40 public paths / 60 operations, plus one internal SDK-test endpoint S26. Archived on DAM Wiki: API spec downloads. Unverified The API overview page still links an older copy in imagekit-developer/sdk-generation (openapi/v1.0.0.yaml, last changed 2026-07-14, no licence). It lacks later additions such as webhook CRUD and tag listing S22 S28. A Postman collection is linked from the API overview S22X-RateLimit-Limit, X-RateLimit-Reset (ms to wait), X-RateLimit-Interval S22. Published guidance: about 40 req/s average for reads (bursts up to 100/s), 5-20 req/s for writes. Bulk tag add/remove and custom-metadata-field CRUD are capped at 5 req/s S22. Exact per-endpoint figures: Not public. Higher limits via support S22. Cache purge requests are also metered per month by plan (500 Free, 1,000 Lite/Pro) S3/v1/accounts/webhooks, up to 3 endpoints per account) S24 S26. 15 event types: video transformation (accepted/ready/error), upload pre-/post-transform (success/error), file.created/updated/deleted, file-version.created/deleted, folder.created/updated/deleted S26 S39. Signed per Standard Webhooks (HMAC-SHA256, webhook-id / webhook-timestamp / webhook-signature, secret prefixed whsec_) S24. Per-upload webhookUrl for extension results S26. Retry policy: Not public@imagekit/nodejs 7.14.0), Python (imagekitio 5.12.0), Go (v2), Java, Ruby, .NET, all Apache-2.0 S26 S30 S31 S33 S88. PHP (MIT; Packagist release 4.0.2 dated 2024-09-05) S88. Front-end: JavaScript core plus React, Vue.js, Angular, Next.js, Astro, React Native. Mobile: iOS, Android S29Authentication
- Get keys: an account administrator opens Developer options → API keys in the dashboard. Each account has a public key (
public_…, safe for client code, used only for client-side uploads) and a private key (private_…, server-only) S23. Revealing a private key requires the user's password; SSO and magic-link users must first set a password S23. - Server-side calls: send
Authorization: Basic base64("{private_key}:")(note the trailing colon) over HTTPS. A request without a key returns 401; an expired key, a disabled account or an exhausted storage quota returns 403 S22. An unauthenticated GEThttps://api.imagekit.io/v1/filesreturned 401 with the message that the request "does not contain private API key" S38. - Restricted keys: create a key with per-resource access (
None,Read only,Read and write) for media management and account management. Account-management APIs (origins, URL endpoints, usage analytics, named transformations, webhooks) require a restricted key with that access; standard keys cannot call them S23. - Client-side uploads: the browser or app asks your backend for credentials S26 S90:
- V1: the backend returns
token(unique, never reused),expire(Unix time less than 1 h ahead) andsignature= HMAC-SHA1(token + expire, private key). - V2 (beta): the backend returns a JWT signed with HS256 using the private key, with
kid= public key; its payload includes every upload parameter, so tampering is detected;exp - iat ≤ 3600.
- V1: the backend returns
- MCP OAuth (DAM and Admin servers): the MCP client discovers
https://imagekit.io/.well-known/oauth-protected-resource/mcp/{dam|admin}, registers dynamically (/oauth/register), and runs authorization code + PKCE againsthttps://imagekit.io/oauth/authorizeand/oauth/token. The user signs in and picks permissions on a consent screen. Grants can be revoked from the user profile S35 S36 S25. A token granted for DAM cannot call Admin tools, and vice versa S13.
Core resources
Derived from the archived OpenAPI file (commit d9244ba, 2026-11-02). Methods and paths are relative to https://api.imagekit.io unless noted S26.
| Resource | Endpoints | Notes |
|---|---|---|
| Upload | POSThttps://upload.imagekit.io/api/v1/files/upload · POSThttps://upload.imagekit.io/api/v2/files/upload | Binary, public URL or Base64. Parameters: fileName, folder, tags, customMetadata, isPrivateFile, isPublished, extensions, transformation (pre/post), checks, webhookUrl, overwrite flags, description. Not rate-limited |
| Assets (files) | GET/v1/files (list & search) · GET/PATCH/v1/files/{fileId}/details · DELETE/v1/files/{fileId} · POST/v1/files/batch/deleteByFileIds · POST/v1/files/copy · POST/v1/files/move · PUT/v1/files/rename | PATCHdetails updates tags, AI-tag removal, custom metadata, description, custom coordinates, extensions (with webhookUrl) and publish status |
| Versions | GET/v1/files/{fileId}/versions · GET/DELETE/v1/files/{fileId}/versions/{versionId} · PUT/v1/files/{fileId}/versions/{versionId}/restore | Max 100 versions per file |
| Tags | POST/v1/files/addTags · POST/v1/files/removeTags · POST/v1/files/removeAITags · GET/v1/tags | Bulk tag operations (5 req/s). GET/v1/tags (added 2026-11-02) lists distinct tags with asset counts, cursor-paginated |
| Metadata schema | GET/POST/v1/customMetadataFields · PATCH/DELETE/v1/customMetadataFields/{id} | Field types: Text, Textarea, Number, Date, Boolean, SingleSelect, MultiSelect S42 |
| Embedded metadata | GET/v1/files/{fileId}/metadata · GET/v1/metadata?url=… | EXIF and image properties of an uploaded file or a remote URL |
| Folders | POST/v1/folder · DELETE/v1/folder · POST/v1/bulkJobs/copyFolder · POST/v1/bulkJobs/moveFolder · POST/v1/bulkJobs/renameFolder · GET/v1/bulkJobs/{jobId} | Copy/move/rename of folders run as asynchronous bulk jobs |
| Saved extensions | GET/POST/v1/saved-extensions · GET/PATCH/DELETE/v1/saved-extensions/{id} | Reusable AI/processing presets (auto-tagging, background removal, AI tasks…) applied at upload or later |
| Cache | POST/v1/files/purge · GET/v1/files/purge/{requestId} | Purges the CDN cache and ImageKit's internal cache for a URL; asynchronous |
| Renditions / transformations | GET/POST/v1/named-transformations · GET/PATCH/DELETE/v1/named-transformations/{id} | Named transformations (API added 2026-08-15). Renditions themselves are generated on the fly through delivery URLs, not stored as separate API objects |
| Account: usage & contract | GET/v1/accounts/usage · GET/v1/accounts/usage-analytics (beta) · GET/v1/accounts/contract | Usage between two dates (max 90-day window for analytics); contract consumption (added 2026-10-30) |
| Account: delivery setup | GET/POST/v1/accounts/origins · GET/PUT/DELETE/v1/accounts/origins/{id} · GET/POST/v1/accounts/url-endpoints · GET/PUT/DELETE/v1/accounts/url-endpoints/{id} | External storage origins and URL endpoints |
| Webhooks | GET/POST/v1/accounts/webhooks · GET/PATCH/DELETE/v1/accounts/webhooks/{id} | Added 2026-10-19; returns the signing secret |
| Collections, public links, path policies, access control, comments | Not in the public REST API | Available in the dashboard and, for collections, public links, access control and path policies, through DAM MCP tools S25 |
| Users, groups, roles | Not in the public REST API | Managed in the dashboard or by SSO JIT provisioning S46 S47 |
| Workflows / rights | N/A | No approval-workflow or rights-management objects in the API. Drafts (isPublished) and path policies are the governance levers |
Data model
- File: identified by
fileId. Main attributes:name,filePath,url,thumbnail,type,fileType,mime,width/height,size,hasAlpha, video/audio properties (duration,bitRate, codecs),tags,AITags,description,customMetadata(object keyed by field name),embeddedMetadata,customCoordinates,isPrivateFile,isPublished,versionInfo,createdAt,updatedAtS26. - Version: each re-upload to the same path creates a version with its own
versionId. All versions count toward storage S26 S52. - Folder: path-based (
/campaigns/summer/). Folders appear in listings withtype=folderS26. - Custom metadata field:
id,name(immutable API key),label,schema(type, default, required, min/max, select options). The reserved field_internal_original_created_datetimepreserves original creation dates of migrated assets S26 S42. - Renditions: not stored objects. Any variant is a delivery URL with transformation parameters (
tr:path segment or query). Named transformations are aliases, and post-transformations at upload pre-generate variants S1 S40. - Taxonomy: flat tags (user tags and AI tags kept separately) plus typed custom metadata. Controlled vocabularies are SingleSelect/MultiSelect options (CSV import over 100 options) S42 S44.
Search & querying
- Endpoint: GET
/v1/fileswithsearchQueryin a Lucene-like syntax; when present,searchQueryoverrides the simpletags,typeandnamefilters S26 S89. - Operators:
=,:(begins with),IN,NOT =,NOT IN,<,>,<=,>=,EXISTS,NOT EXISTS,HAS(case-insensitive word-token full-text),AND,ORand parentheses S89. - Fields:
id,name,path,type,format,size,width,height,videoDuration,tags,private,published,transparency,createdAt,updatedAt,createdBy,embeddedMetadata.DateTimeOriginal,embeddedMetadata.Keywords,embeddedMetadata.LocationTaken, andcustomMetadata.{field}for every custom field type S89. Dates accept ISO 8601 or relative units (7d,2w,2m,1y) S89. - Sorting: name, created, updated, height, width, size, relevance, duration and original creation date, each ascending or descending S26.
- Filters:
type(file, file-version, folder, all),fileType(all, image, non-image),path(single folder; subfolders throughpathinsearchQuery) S26. - Facets / aggregations: none in the API. GET
/v1/tagsgives tag counts S26. - Visual / natural-language search: dashboard-only and Enterprise-only; no public REST endpoint S41.
- Page size: max 1,000 per request S26.
Uploads & binaries
- Single request: one multipart POST per file. The
filefield accepts binary data, a public URL (ImageKit must receive the response headers within 8 s) or Base64 S26. No chunked or resumable upload is documented (Unknown). - Size limits (per file): images, audio and raw files 25 MB (Free), 40 MB (Lite), 50 MB (Pro); video 100 MB / 300 MB / 2 GB; higher on Enterprise S26 S3.
- Upload-time processing:
extensions(remove-bg,google-auto-tagging,aws-auto-tagging,ai-tasks,ai-auto-description), pre-transformation (one, applied before storage) and up to five post-transformations (pre-generated variants), with optionalchecks(server-side validation) S26 S40. - Bulk migration: Rclone integration, migration guides and the Upload API from-URL mode S77 S40.
- Downloads / renditions: every file has a delivery
url. Private files need signed URLs (signature from the private key, optional expiry). Named transformations can be applied to private assets without signing S68 S40. ZIP downloads (up to 2,000 files and folders) are available in the dashboard and through DAM MCP tools S55 S25.
Events & webhooks
| Aspect | Detail |
|---|---|
| Configuration | Dashboard (Developer options → Webhooks) or Webhooks API; each endpoint subscribes to a list of events and can be enabled or disabled; max 3 per account S24 S26 |
| Events | video.transformation.accepted/ready/error, upload.pre-transform.success/error, upload.post-transform.success/error, file.created, file.updated, file.deleted, file-version.created, file-version.deleted, folder.created, folder.updated, folder.deleted S26 |
| Payload | JSON with type, id (unique, usable as a nonce), created_at (ISO 8601) and data S24 |
| Signature | Standard Webhooks: webhook-id, webhook-timestamp, webhook-signature (HMAC-SHA256, secret whsec_…). Legacy x-ik-signature (timestamp in ms prefixed t=, HMAC prefixed v1=) is still sent. SDKs expose webhooks.unwrap() for verification S24 |
| Replay protection | Check the timestamp against a tolerance window and/or use the event id as a nonce S24 |
| Retries / timeout | Not public |
Limits & quirks
- Account-management APIs need a restricted key: a standard key gets no access to origins, URL endpoints, usage analytics, named transformations or webhooks S23.
- Name search is case-sensitive with
=and:; useHASfor case-insensitive matching S89. - Tag counts are eventually consistent: GET
/v1/tagsusually reflects changes within about a minute S26. - Usage analytics responses are cached for 5 minutes per account and date range S26.
- Draft uploads: the API reference says uploading in draft state requires a custom Enterprise plan. Unverified The pricing table instead lists draft assets for Pro S3 S26.
- Upload tokens are single-use: reusing a
tokenor JWT, even after a failed request, returns a validation error S26. - Free-plan downgrade: the "empty media library" helper does not work above 50,000 files or folders; use bulk delete in batches S85.
- Two spec locations: the docs link the older
sdk-generationfile while the SDKs are generated from theopenapirepository Unverified S22 S26 S28. - Legacy MCP endpoint still answers: on 2026-11-10
https://api-mcp.imagekit.io/mcpstill returned a 401 Bearer challenge, although the vendor asks users to move to the DAM and Admin servers S38 S25.
SDKs, tools & code samples
| Kind | Item | Notes |
|---|---|---|
| Back-end SDKs | imagekit-nodejs (@imagekit/nodejs), imagekit-python (imagekitio), imagekit-go, imagekit-java (io.imagekit:image-kit-java), imagekit-ruby (imagekitio gem), imagekit-dotnet (Imagekit on NuGet) | Generated from the OpenAPI file; Apache-2.0; all pushed 2026-11-02/03 S26 S30 S88 |
| Back-end SDK (hand-written) | imagekit-php (imagekit/imagekit) | MIT; last Packagist release 2024-09-05 S88 |
| Front-end | @imagekit/javascript (core), imagekit-react, imagekit-vuejs, imagekit-angular, imagekit-next, imagekit-astro, React Native guide | All front-end SDKs build on the JavaScript SDK S29 S30 |
| Mobile | imagekit-android, imagekit-ios | The vendor notes the iOS SDK lags behind Android S29 |
| Widgets | Embeddable Media Library widget; Uppy upload plugin; Video Player (Video.js-based, beta) | S59 S40 S66 |
| AI tooling | Hosted MCP servers (DAM, Admin, DevTools); agent skills and Claude Code plugin (imagekit-developer/skills, MIT); llms.txt and llms-full.txt | S25 S83 |
| Low-code | n8n community node @imagekit/n8n-nodes-imagekit | S75 |
| Testing | Postman collection (Run in Postman button) | S22 |
Changelog of the API
Dated from commits to the public OpenAPI repository (latest first) and vendor announcements S26.
| Date | Change |
|---|---|
| 2026-11-02 | GET/v1/tags added (distinct tags with counts, cursor pagination) |
| 2026-10-30 | GET/v1/accounts/contract (contract consumption) added |
| 2026-10-19 | Webhooks CRUD API (/v1/accounts/webhooks) added |
| 2026-10-07 | Hosted MCP servers (DAM, Admin, DevTools) announced; api-mcp.imagekit.io/mcp and the npm @imagekit/api-mcp package superseded S13 S25 |
| 2026-10-05 | SDK fix: empty 204 responses of copy, move and delete no longer parsed |
| 2026-10-01 | Reserved original-creation-date custom metadata field documented |
| 2026-09-16 | Search API: density parameter and new sort options |
| 2026-09-15 | ImageKit DAM, Admin and DevTools servers published in the official MCP Registry S34 |
| 2026-08-15 | Named Transformations API added |
| 2026-08-13 | description field in the custom metadata field API |
| 2026-08-05 | Public imagekit-developer/openapi repository created |
| 2025-10-06 | First release of the local MCP package @imagekit/api-mcp S32 |