Pricing plans
Detailed pricing plans are not available yet for this tool.
Detailed overview
Image processing infrastructure for modern apps
Upload, transform, and deliver images through a global CDN. One SDK, signed URLs,
real-time processing.
Get Started
View Docs
// Resize + watermark
await client.images.url(
'photo.jpg',
[{ resize: { width: 800 } },
{ text: {
text: '© immagin',
position: 'bottom-right'
} }]
)
© immagin
Everything you need for images
A complete image pipeline from upload to delivery, built for developers who want to ship
fast.
Global CDN Automatic WebP conversion, immutable cache headers, and edge delivery worldwide. Images load fast everywhere. Real-time Transforms Resize, crop, and add text overlays on the fly. Transformations are encoded in the URL and processed at request time. Zero-dependency SDK Isomorphic TypeScript client with typed API responses. Works in Node.js, Edge runtimes, and the browser. Direct Uploads Generate signed upload URLs and upload directly from the client. No server proxy needed, no file size limits on your backend.
How it works
One image in. Every variant out.
2.4 MB · 4000 × 3000LunaResize200×150 · 8 KBWebP800×600 · 42 KBBlurLQIP · 1.2 KB© ImmaginTextWatermarkedresize.tsimport { Immagin } from '@immagin/client'
const client = new Immagin({ apiKey: 'imk_...' })
const url = await client.images.url('hero.jpg', [{
resize: { width: 200, height: 150 }
}])2.4 MB · 4000 × 3000LunaResize200×150 · 8 KBresize.tsimport { Immagin } from '@immagin/client'
const client = new Immagin({ apiKey: 'imk_...' })
const url = await client.images.url('hero.jpg', [{
resize: { width: 200, height: 150 }
}])WebP800×600 · 42 KBBlurLQIP · 1.2 KB© ImmaginTextWatermarked
Built for developers
A TypeScript-first SDK that works everywhere your code runs.
TypeScript-first with full type inference Works in Node.js, Edge runtimes, and browsers Server-side URL signing for secure access Zero dependencies — just npm install @immagin/client server.ts import { Immagin } from '@immagin/client'
const client = new Immagin({
apiKey: process.env.IMMAGIN_API_KEY
})
const url = await client.images.url('photos/avatar.jpg', [
{ resize: { width: 400, height: 400 } },
{ text: { text: '@username', position: 'bottom-right' } }
])
// https://my-project.immag.in/eyJr...?sig=a1b2c3d4
Simple, usage-based pricing
Pay only for unique image transformations. Cached CDN deliveries are always free.
Free $0 forever
Perfect for side projects and experimentation.
1 project 25,000 transforms/month Auto-generated subdomain Free CDN delivery
Get Started
Pay as you go Usage based
For production apps. Graduated metered billing via Stripe.
Unlimited projects Unlimited transforms Custom subdomains Free CDN delivery
Start Free, Upgrade Anytime
Monthly Unique Transforms Per 1,000 0 – 25,000 Free 25,001 – 100,000 $0.20 100,001 – 200,000 $0.15 200,001 – 500,000 $0.09 500,001+ $0.07 Estimate your monthly cost
300,000 transforms — ~$24.00/mo
How we compare Service 100k 500k 1M Immagin $15 $57 $92 Cloudinary $89 $224 Enterprise Uploadcare $79 $79–199 $199+ ImageKit $0 $89 ~$100 Cloudflare Images $3–49 $28–253 $58–508
Prices based on publicly available pricing pages as of Feb 2026.
Start building with Immagin
Set up your image pipeline in minutes. Free to start, no credit card required.
Get Started Free
---
Documentation
Everything you need to integrate Immagin into your application.
Quick Start
Install the SDK from npm. It has zero dependencies and works in Node.js, Edge
runtimes, and the browser.
Terminal $ npm install @immagin/client
Initialize the client with your API key. You can find your key in the
Console.
app.ts import { Immagin } from '@immagin/client'
const client = new Immagin({
apiKey: 'imk_your_api_key',
}) Config options apiKey (required) — Your API key with imk_ prefix
Authentication
All API requests are authenticated with an API key passed as a Bearer token. Keys are
created in the Console and use the imk_ prefix. Only the hash of the key
is stored — the full key is shown once at creation time.
HTTP Authorization: Bearer imk_your_api_key
The SDK handles this automatically — just pass your key to the constructor.
Uploading Images
Images are uploaded directly using presigned URLs. The file never touches the
API server — your client uploads straight to storage.
Simple upload
The upload() method handles the full flow: gets a presigned URL, then
uploads the file directly. Accepts Blob, Buffer, or ReadableStream.
upload.ts const result = await client.images.upload(file, 'hero.jpg')
// result.key → 'hero.jpg' Browser upload flow
For browser uploads, use signUrl() on your server to get a presigned URL,
then pass it to the browser. This way your API key is never exposed to the client.
server.ts // 1. Server: get a presigned upload URL
const { uploadUrl, key } = await client.images.signUrl('avatar.jpg')
// 2. Return uploadUrl to browser browser.ts // 3. Browser: upload directly
await fetch(uploadUrl, {
method: 'PUT',
body: file
})
Presigned URLs expire after 5 minutes. Generate them on demand, not in advance.
Transformations
Single Edit Chained Edits
Image transformations are applied at request time by Luna, the processing engine.
Edits are encoded in the image URL and processed on the fly — originals are never
modified. All URLs generated by images.url() are automatically signed — the signature
locks transformation parameters so they can't be tampered with.
Resizing
Pass a resize object with width and optional
height. Omitting height scales proportionally. Control crop behavior with
fit, position, and background.
Defaults: fit: 'cover', withoutEnlargement: true.
resize.ts // Width only (proportional height)
await client.images.url('photo.jpg', { resize: { width: 800 } })
// Exact dimensions (cover fit, crops to fill)
await client.images.url('photo.jpg', { resize: { width: 400, height: 400 } })
// Contain fit with background color
await client.images.url('photo.jpg', { resize: {
width: 800,
height: 600,
fit: 'contain',
background: '#000000'
} }) // Width only (proportional height)
await client.images.url('photo.jpg', [
{ resize: { width: 800 } }
])
// Exact dimensions (cover fit, crops to fill)
await client.images.url('photo.jpg', [
{ resize: { width: 400, height: 400 } }
])
// Contain fit with background color
await client.images.url('photo.jpg', [
{ resize: {
width: 800,
height: 600,
fit: 'contain',
background: '#000000'
} }
]) Resize options width (required) — Target width in pixels height — Target height in pixels (scales proportionally if omitted) fit — How to fit: 'cover' 'contain' 'fill' 'inside' 'outside' (default: 'cover') position — Where to crop from: 'top' 'right' 'bottom' 'left' 'center' 'entropy' 'attention'. Use 'attention' to automatically focus on the most interesting part of the image background — Background color for 'contain' fit (CSS color string) upscale — Allow making small images larger (default: false) downscale — Allow making large images smaller (default: true) Rotate & Flip
Rotate images by angle or mirror them vertically/horizontally.
rotate.ts // Rotate 90 degrees
await client.images.url('photo.jpg', { rotate: { angle: 90 } })
// Rotate with background fill
await client.images.url('photo.jpg', { rotate: { angle: 45, background: '#000000' } })
// Flip vertically / flop horizontally
await client.images.url('photo.jpg', { flip: true })
await client.images.url('photo.jpg', { flop: true }) // Rotate 90 degrees
await client.images.url('photo.jpg', [
{ rotate: { angle: 90 } }
])
// Resize, rotate, and flip in one pipeline
await client.images.url('photo.jpg', [
{ resize: { width: 800 } },
{ rotate: { angle: 45, background: '#000000' } },
{ flip: true }
]) Rotate options angle (required) — Rotation angle in degrees background — Fill color for uncovered area (CSS color string) Auto-orient
All images are automatically oriented based on their EXIF orientation tag before any edits are applied. This ensures photos taken on mobile devices display correctly regardless of how the camera was held. To disable this behavior, pass { autoOrient: false } in your edits array.
Crop & Extend
Extract a region from the image or add padding/borders around it.
crop.ts // Crop a 400x300 region starting at (100, 50)
await client.images.url('photo.jpg', { crop: {
left: 100, top: 50, width: 400, height: 300
} })
// Add 20px red border on all sides
await client.images.url('photo.jpg', { extend: {
top: 20, bottom: 20, left: 20, right: 20,
background: '#ff0000'
} })
// Auto-trim borders
await client.images.url('photo.jpg', { trim: { threshold: 10 } }) // Crop a region then add border
await client.images.url('photo.jpg', [
{ crop: { left: 100, top: 50, width: 400, height: 300 } },
{ extend: {
top: 20, bottom: 20, left: 20, right: 20,
background: '#ff0000'
} }
])
// Auto-trim then resize
await client.images.url('photo.jpg', [
{ trim: { threshold: 10 } },
{ resize: { width: 800 } }
]) Crop options left, top (required) — Top-left corner of the crop region width, height (required) — Dimensions of the crop region Extend options top, bottom, left, right — Padding in pixels per side background — Fill color (CSS color string) Trim options background — Color to trim (defaults to top-left pixel) threshold — Tolerance for color matching (default: 10) Adjustments
Apply color and sharpness adjustments — blur, sharpen, grayscale, brightness, tint, and more.
adjustments.ts // Gaussian blur
await client.images.url('photo.jpg', { blur: 5 })
// Sharpen
await client.images.url('photo.jpg', { sharpen: 2 })
// Grayscale
await client.images.url('photo.jpg', { grayscale: true })
// Adjust brightness and saturation
await client.images.url('photo.jpg', { modulate: {
brightness: 1.2, saturation: 0.8
} })
// Tint with a color
await client.images.url('photo.jpg', { tint: { r: 255, g: 200, b: 0 } })
// Invert colors (negate)
await client.images.url('photo.jpg', { invert: true })
// Normalize (auto-contrast)
await client.images.url('photo.jpg', { normalize: { lower: 2, upper: 98 } })
// Flatten alpha channel with white background
await client.images.url('logo.png', { flatten: { background: '#ffffff' } }) // Resize, sharpen, and boost contrast
await client.images.url('photo.jpg', [
{ resize: { width: 800 } },
{ sharpen: 2 },
{ normalize: { lower: 2, upper: 98 } }
])
// Grayscale thumbnail with blur
await client.images.url('photo.jpg', [
{ resize: { width: 400 } },
{ grayscale: true },
{ blur: 3 }
])
// Flatten PNG alpha, tint, and adjust brightness
await client.images.url('logo.png', [
{ flatten: { background: '#ffffff' } },
{ tint: { r: 255, g: 200, b: 0 } },
{ modulate: { brightness: 1.2 } }
]) Adjustment operations blur — Gaussian blur intensity (0.3–1000). Low values like 1–3 give a subtle softening, 5–10 a noticeable blur, and 20+ a heavy frosted-glass effect sharpen — Sharpen intensity. 1–2 for subtle sharpening, 3–5 for aggressive detail enhancement grayscale — Convert to grayscale (true, no options) modulate — brightness (multiplier), saturation (multiplier), hue (degrees), lightness (additive) tint — Tint with RGB color: r, g, b (0–255) invert — Invert all colors (true / false) normalize — Auto-contrast stretch. lower/upper percentiles (default 1/99) flatten — Merge alpha with background color Output format
By default, Luna outputs WebP at quality 90. You can request a specific format by
passing an output object as the third argument to url().
Responses include immutable cache headers for edge caching.
output.ts // Force JPEG at quality 85
await client.images.url(
'photo.jpg',
[{ resize: { width: 800 } }],
{ format: 'jpeg', quality: 85 }
)
// Lossless WebP
await client.images.url(
'photo.png',
[{ resize: { width: 1200 } }],
{ format: 'webp', lossless: true }
) Output options format — 'webp' 'jpeg' 'png' 'avif' 'gif' 'jp2' 'tiff' 'heif' (default: 'webp') quality — 1–100 (default: 90) progressive — Progressive loading for JPEG and PNG lossless — Lossless compression for WebP and AVIF
Composition
Single Edit Chained Edits
Composite layers onto images at request time. Layers are applied after any
transformations (resize, format conversion) in the pipeline.
Watermark
Add text watermarks or captions with configurable font size, color, position, and
opacity.
watermark.ts await client.images.url('photo.jpg', {
text: {
text: '© Acme Inc',
position: 'bottom-right',
fontSize: 24,
color: '#ffffff',
opacity: 0.8
}
}) await client.images.url('photo.jpg', [
{ resize: { width: 1200, height: 630 } },
{ text: {
text: '© Acme Inc',
position: 'bottom-right',
fontSize: 24,
color: '#ffffff',
opacity: 0.8
} }
]) Watermark options text — The text string to render fontSize — Font size in pixels color — Hex color, e.g. '#ffffff' opacity — Float from 0 to 1 position — One of 'top-left' 'top-center' 'top-right' 'center-left' 'center' 'center-right' 'bottom-left' 'bottom-center' 'bottom-right' padding — Padding around text in pixels
Listing & Deleting
List images
Paginate through your images with optional limit.
list.ts const { images, nextCursor } = await client.images.list({
limit: 50
})
// images → [{ key, size, lastModified }]
// Next page
if (nextCursor) {
const page2 = await client.images.list({ cursor: nextCursor })
} Delete an image delete.ts await client.images.delete('old-avatar.jpg')
Metadata
Inspect image properties without downloading the full image. The request goes
through Luna, which extracts metadata and returns JSON.
metadata.ts const meta = await client.images.metadata('photo.jpg')
// meta.width → 1920
// meta.height → 1080
// meta.format → 'jpeg'
// meta.hasAlpha → false
// meta.size → 204800 (bytes) Metadata fields width / height — Dimensions in pixels format — Source format ('jpeg', 'png', 'webp', etc.) space — Color space ('srgb', 'cmyk', etc.) channels — Number of color channels (3 for RGB, 4 for RGBA) hasAlpha — Whether the image has an alpha channel orientation — EXIF orientation (1–8) density — DPI (dots per inch) isProgressive — Whether the image is progressively encoded pages — Number of pages (for multi-page formats like GIF, TIFF) size — File size in bytes metadata() uses node:crypto for signing and is intended for server-side use only.
API Keys
Manage API keys programmatically. Keys use the imk_ prefix and are only
shown in full once at creation time.
keys.ts // Create a new key
const { key, prefix, name } = await client.keys.create({
name: 'Production'
})
// key → 'imk_aBcDeFgHiJkLmNoPqRsTuV'
// prefix → 'imk_aBcD'
// List all keys
const keys = await client.keys.list()
// Revoke a key
await client.keys.revoke(keyId)
Error Handling
All API errors throw an ImmaginError with the HTTP status code and
response body.
errors.ts import { Immagin, ImmaginError } from '@immagin/client'
try {
await client.images.delete('missing.jpg')
} catch (err) {
if (err instanceof ImmaginError) {
console.log(err.status) // 404
console.log(err.message) // 'Not Found'
console.log(err.body) // response body
}
}
URL Format
Luna image URLs encode the request as a signed payload. Understanding the
format isn't required — the SDK handles it — but here's the structure:
URL structure https://{tenantId}.immag.in/{payload}?sig={signature} payload Encoded JSON containing the image key and any edits: { "key": "hero.jpg", "edits": [{ "resize": { "width": 800, "height": 600 } }] } signature A cryptographic signature derived from your project's secret. Prevents unauthorized URL tampering. Project secret Generated when you create a project — available in the Console. The SDK uses it automatically to sign URLs.
Examples
Common real-world patterns for integrating Immagin into your app.
Responsive images
Generate multiple sizes for srcset and let the browser pick the best one.
responsive.tsx const widths = [400, 800, 1200, 1600]
const srcset = await Promise.all(
widths.map(async (w) => {
const url = await client.images.url('hero.jpg', [
{ resize: { width: w } }
])
return `${url} ${w}w`
})
)
//
OG image
Generate unique Open Graph images on the fly for every blog post. Luna resizes the post's cover image to 1200×630 and overlays the title — no build step, no pre-rendering, no image editing tools needed.
og-image.ts function getOgImage(post: Post) {
return client.images.url(post.coverImage, [
{ resize: { width: 1200, height: 630, fit: 'cover' } },
{ text: {
text: post.title,
fontSize: 48,
position: 'bottom-left',
color: 'white',
padding: 40
} }
])
}
// In your page's
const ogUrl = await getOgImage(post)
// User avatar
Square crop with attention-based positioning to keep faces centered.
avatar.ts const avatar = await client.images.url('users/profile.jpg', [
{ resize: {
width: 256,
height: 256,
fit: 'cover',
position: 'attention'
} }
])
//
Photo gallery
Consistent thumbnails with uniform dimensions, sharpened for crisp display.
gallery.ts const { images } = await client.images.list({ prefix: 'gallery/' })
const thumbs = await Promise.all(
images.map((img) =>
client.images.url(img.key, [
{ resize: { width: 300, height: 300 } },
{ sharpen: 1 }
])
)
) Blur placeholder (LQIP)
Generate a tiny blurred preview to show while the full image loads. The small size
(20px wide) keeps the inline data URL under 1 KB.
Replay placeholder.ts // Tiny blurred thumbnail for inline placeholder
const placeholder = await client.images.url('photos/hero.jpg', [
{ resize: { width: 20 } },
{ blur: 10 }
])
// Full-size image
const full = await client.images.url('photos/hero.jpg', [
{ resize: { width: 1200 } }
]) Product image
Clean product shots on a white background — trim extra whitespace, normalize
contrast, then resize to a consistent dimension.
product.ts const product = await client.images.url('products/shoe.jpg', [
{ trim: { threshold: 15 } },
{ normalize: { lower: 1, upper: 99 } },
{ resize: {
width: 600,
height: 600,
fit: 'contain',
background: '#ffffff'
} },
{ sharpen: 1 }
])
Need help? Contact support
---
Privacy Policy Last updated: February 23, 2026 Introduction
Exivar Ltd ("we", "us", "our") operates Immagin, an image processing
platform accessible at immag.in and its subdomains. This Privacy Policy
explains what personal data we collect, how we use it, and the choices you
have regarding your information. By using Immagin, you agree to the
collection and use of information in accordance with this policy.
Information We Collect Account Information
When you create an account, we collect your name and email address. Your
password is never stored in plain text — we store only a cryptographic hash
derived using PBKDF2-SHA512 with a unique per-user salt.
Image Data
Images you upload through the Immagin API are stored in our cloud
infrastructure. We do not access, analyse, or use your images for any
purpose other than providing the service you have requested (storage,
transformation, and delivery).
Usage and Log Data
We automatically collect information about how you interact with the
service, including:
API requests and response metadata Image transformation parameters Cache status (hit or miss) and response times Edge location that served the request Response size and content type Country derived from your IP address
This data is used for usage-based billing, performance monitoring, and
service improvement.
Payment Information
Payment processing is handled entirely by Stripe. We do not receive, store,
or have access to your full credit card number. We retain only the Stripe
customer identifier associated with your account for billing purposes.
Cookies
We use a single httpOnly session cookie (immagin_session) to
authenticate you when you are signed in to the console. This cookie is
essential for the service to function and cannot be disabled while using the
console. We do not use advertising or tracking cookies.
How We Use Your Information We use the information we collect to: Provide, operate, and maintain the Immagin platform Process and deliver image transformations you request
Track usage for billing purposes, specifically counting unique image
transforms per month per project
Communicate with you about your account, including email verification,
billing notifications, and service announcements
Enforce our acceptable use policies and prevent abuse, fraud, or
unauthorised access to the service
Improve and optimise the performance of our infrastructure Third-Party Services
We share data with the following third-party service providers, solely to
the extent necessary to operate Immagin:
Stripe — processes payments and manages subscriptions.
Subject to
Stripe's Privacy Policy.
Infrastructure providers — we use trusted third-party
cloud providers for application hosting, image storage, content delivery,
and database services. Each provider is contractually bound to process
data only as instructed and in accordance with applicable data protection
laws.
We do not sell, rent, or trade your personal information to any third party
for marketing or advertising purposes.
Data Retention Account data is retained for as long as your account
remains active. If you close your account, we will delete your personal
information within 30 days, except where we are required to retain it for
legal or billing purposes.
Images are retained until you delete them through the API
or console, or until your account is terminated. Upon account termination,
all images associated with your projects are permanently deleted.
Usage logs are retained for billing reconciliation and
analytics purposes. Aggregated usage data may be retained indefinitely in
anonymised form.
You may request deletion of your account and all associated data at any time
by contacting us at
hello@immag.in.
Data Security
We take the security of your data seriously and implement the following
measures:
Passwords are hashed using PBKDF2-SHA512 with 100,000 iterations and a
unique per-user salt, making them computationally infeasible to reverse.
API keys are cryptographically hashed before storage. The full key is
shown to you only once at the time of creation and is never stored or
recoverable.
Image URLs are signed using per-tenant cryptographic secrets, preventing
unauthorised access to your images.
All traffic between your applications and our services is encrypted using
HTTPS/TLS.
Session tokens are sealed using authenticated encryption and stored in
httpOnly cookies, preventing client-side script access.
While no system is perfectly secure, we continuously review and improve our
security practices to protect your data.
Your Rights European Economic Area (GDPR)
If you are located in the European Economic Area, you have the following
rights under the General Data Protection Regulation:
Access — request a copy of the personal data we hold
about you.
Rectification — request correction of inaccurate or
incomplete personal data.
Erasure — request deletion of your personal data where
there is no compelling reason for its continued processing.
Portability — request a machine-readable copy of your
data to transfer to another service.
Restriction of processing — request that we limit how we
use your data in certain circumstances.
California (CCPA)
If you are a California resident, the California Consumer Privacy Act
provides you with the following rights:
Right to know — request disclosure of the categories and
specific pieces of personal information we have collected about you.
Right to delete — request deletion of your personal
information, subject to certain exceptions.
Right to opt-out of sale — we do not sell your personal
information, so this right does not apply.
Right to non-discrimination — we will not discriminate
against you for exercising any of your privacy rights.
To exercise any of these rights, please contact us at
hello@immag.in. We will respond to
your request within 30 days.
Children's Privacy
Immagin is not directed at children under the age of 16. We do not
knowingly collect personal information from children under 16. If you
believe that a child under 16 has provided us with personal data, please
contact us at
hello@immag.in and we will take steps
to delete the information promptly.
Changes to This Policy
We may update this Privacy Policy from time to time to reflect changes in
our practices, technology, or legal requirements. If we make material
changes, we will notify you by email or through a notice in the Immagin
console dashboard prior to the changes taking effect. We encourage you to
review this page periodically for the latest information on our privacy
practices.
Contact Us
If you have any questions or concerns about this Privacy Policy or our data
practices, please contact us at
hello@immag.in.
Exivar Ltd
Canada
---
Terms and Conditions Last updated: February 23, 2026 Acceptance of Terms
These Terms and Conditions ("Terms") constitute a legally binding agreement
between you ("you", "your") and Exivar Ltd ("Exivar", "we", "us", "our"),
governing your access to and use of the Immagin image processing platform,
including all associated APIs, SDKs, documentation, and related services
(collectively, the "Service"). By creating an account, accessing, or using
the Service in any way, you acknowledge that you have read, understood, and
agree to be bound by these Terms. If you do not agree to these Terms, you
must not access or use the Service.
If you are using the Service on behalf of an organisation, you represent and
warrant that you have the authority to bind that organisation to these Terms,
and "you" refers to both you individually and the organisation.
Service Description
Immagin is a cloud-based image processing platform that provides image
upload, storage, on-the-fly transformation, and delivery through a global
content delivery network (CDN). The Service is accessed programmatically via
API keys and a client SDK (@immagin/client), and managed
through a web-based console at
console.immag.in.
The Service processes images by applying transformations such as resizing,
format conversion, and text overlays. Transformed images are cached at the
edge for high-performance delivery. Each unique combination of image and
transformation parameters constitutes a unique transform for billing
purposes.
Account Registration
To use the Service, you must create an account and provide accurate,
complete, and current information during the registration process. You agree
to update your account information promptly if it changes.
Email verification — You must verify your email address
to access all features of the Service, including project creation and
billing management.
Account security — You are responsible for maintaining
the confidentiality of your account credentials, including your password
and all API keys associated with your projects.
API key safeguarding — API keys grant programmatic access
to your project resources. You must store them securely, never commit them
to public repositories, and never share them with unauthorised parties.
Your full API key is displayed only once at the time of creation and
cannot be recovered.
Account responsibility — You are responsible for all
activity that occurs under your account and API keys, whether or not you
authorised such activity. You must notify us immediately at
hello@immag.in if you suspect any
unauthorised use of your account or API keys.
Acceptable Use
You agree to use the Service only for lawful purposes and in accordance with
these Terms. You agree NOT to:
Upload, store, or distribute any content that is illegal, infringing,
defamatory, obscene, or otherwise harmful or objectionable.
Use the Service to distribute malware, viruses, or any other malicious
code or software.
Attempt to reverse-engineer, decompile, disassemble, or otherwise derive
the source code of the Service or its underlying infrastructure.
Interfere with, disrupt, or attempt to gain unauthorised access to the
Service, its servers, or connected networks.
Exceed rate limits, abuse the API, or engage in any activity designed to
degrade the performance or availability of the Service for other users.
Share, publish, or expose API keys to unauthorised parties, including
embedding them in client-side code or public repositories.
Use the Service in violation of any applicable local, national, or
international law or regulation.
We reserve the right to investigate and take appropriate action against any
violation of these restrictions, including suspending or terminating your
account without prior notice.
Image Content and Intellectual Property
You retain full ownership of all images and content you upload to the
Service ("Your Content"). Immagin does not claim any ownership rights over
Your Content.
By uploading content to the Service, you grant Exivar Ltd a limited,
non-exclusive, royalty-free, worldwide licence to store, process, transform,
cache, and deliver Your Content solely as necessary to provide the Service
to you. This includes creating derivative versions of your images through
transformations you request (such as resizing, format conversion, and text
overlays) and caching those transformed versions at edge locations for
delivery.
This licence terminates automatically when you delete your images through
the API or console, or when your account is terminated. Cached copies at
CDN edge locations may persist for a short period after deletion until cache
entries expire.
You represent and warrant that you have all necessary rights, licences, and
permissions to upload and use the content you submit to the Service, and
that your use of the Service does not infringe upon or violate the
intellectual property rights, privacy rights, or any other rights of any
third party.
Usage Limits and Billing Free Tier
Free accounts are limited to 1 project and 25,000 unique transforms per
month. A unique transform is counted each time an image is processed with a
combination of parameters that has not been previously cached (a cache
miss). Subsequent requests for the same image with the same parameters are
served from cache and do not count toward your usage.
Paid Tier
Paid accounts are billed monthly based on usage. Usage-based pricing follows
a graduated model, with per-transform costs decreasing at higher volume
tiers. Full pricing details are available on our
pricing page. You are responsible for all charges incurred
under your account, including charges generated by any API keys associated
with your projects.
Outstanding Balances
If your account has an outstanding bill, we may suspend your ability to
upload new images until the balance is resolved. Existing images will
continue to be served during this period. Prolonged non-payment may result
in account suspension or termination.
Service Availability
We strive to maintain high availability for the Service, but we do not
guarantee that the Service will be uninterrupted, error-free, or available
at all times. The Service may be subject to limitations, delays, and other
issues inherent in the use of the internet and electronic communications.
We may perform scheduled or emergency maintenance that temporarily affects
the availability of the Service. Where practicable, we will provide advance
notice of scheduled maintenance. We are not liable for any loss or damage
arising from downtime, service interruptions, or degraded performance,
regardless of the cause.
Limitation of Liability
TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SERVICE IS PROVIDED
ON AN "AS IS" AND "AS AVAILABLE" BASIS WITHOUT WARRANTIES OF ANY KIND,
WHETHER EXPRESS, IMPLIED, OR STATUTORY, INCLUDING BUT NOT LIMITED TO
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
NON-INFRINGEMENT, AND ACCURACY.
IN NO EVENT SHALL EXIVAR LTD, ITS DIRECTORS, EMPLOYEES, PARTNERS, AGENTS,
OR AFFILIATES BE LIABLE FOR ANY INDIRECT, INCIDENTAL, SPECIAL,
CONSEQUENTIAL, OR PUNITIVE DAMAGES, INCLUDING BUT NOT LIMITED TO LOSS OF
PROFITS, DATA, GOODWILL, OR OTHER INTANGIBLE LOSSES, ARISING OUT OF OR IN
CONNECTION WITH YOUR USE OF OR INABILITY TO USE THE SERVICE, EVEN IF WE
HAVE BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
OUR TOTAL AGGREGATE LIABILITY ARISING OUT OF OR RELATING TO THESE TERMS OR
THE SERVICE SHALL NOT EXCEED THE TOTAL AMOUNT YOU HAVE PAID TO US IN THE
TWELVE (12) MONTHS IMMEDIATELY PRECEDING THE EVENT GIVING RISE TO THE
CLAIM. IF YOU HAVE NOT MADE ANY PAYMENTS, OUR TOTAL LIABILITY SHALL NOT
EXCEED FIFTY CANADIAN DOLLARS (CAD $50.00).
Termination
You may terminate your account at any time by contacting us at
hello@immag.in or through the console
dashboard. Upon termination, your right to access and use the Service will
cease immediately.
We may suspend or terminate your account, without prior notice or liability,
if we reasonably believe that you have violated these Terms, engaged in
fraudulent or abusive activity, or if your account has been inactive for an
extended period. We may also terminate or suspend the Service (in whole or
in part) at any time for any reason.
Upon termination of your account, all images and data associated with your
projects will be permanently deleted within 30 days. Any outstanding
balances remain due and payable. Provisions of these Terms that by their
nature should survive termination will continue to apply, including but not
limited to sections on intellectual property, limitation of liability, and
governing law.
Governing Law
These Terms shall be governed by and construed in accordance with the laws
of the Province of Ontario, Canada, without regard to its conflict of law
provisions. Any disputes arising out of or relating to these Terms or the
Service shall be subject to the exclusive jurisdiction of the courts located
in the Province of Ontario, Canada. You irrevocably consent to the
jurisdiction and venue of such courts.
Changes to These Terms
We reserve the right to modify or replace these Terms at any time at our
sole discretion. If we make material changes, we will notify you by email or
through a notice in the Immagin console dashboard at least 14 days before
the changes take effect. Your continued use of the Service after the revised
Terms become effective constitutes your acceptance of the updated Terms. If
you do not agree to the new Terms, you must stop using the Service and
terminate your account.
Contact Us
If you have any questions, concerns, or feedback about these Terms and
Conditions, please contact us at
hello@immag.in.
Exivar Ltd
Canada
Same category tools



