immag.inAI tool

Immagin

immag.in
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