# Banatie API - Image Generation (v1) All endpoints require Project Key authentication via `X-API-Key` header and are rate-limited to 100 requests/hour. --- ## Generations ### POST /api/v1/generations Create new image generation with optional reference images, aliases, and auto-enhancement. **Authentication:** Project Key required **Parameters:** - `prompt` - Text description for image (required) - `referenceImages` - Array of image references (aliases or image IDs) - `aspectRatio` - Image aspect ratio (e.g., "16:9", "1:1", "3:2", "9:16", default: "1:1") - `flowId` - Associate generation with a flow (UUID) - `alias` - Assign project-scoped alias to output image (@custom-name) - `flowAlias` - Assign flow-scoped alias to output image (requires flowId) - `autoEnhance` - Enable prompt enhancement (boolean, default: true) - `enhancementOptions` - Enhancement configuration (object, optional) - `template` - Enhancement template: "photorealistic", "illustration", "minimalist", "sticker", "product", "comic", "general" - `meta` - Custom metadata (JSON object) **Purpose:** Generate AI images with reference support and automatic alias assignment **Response:** 201 Created with generation details, status, and output image --- ### GET /api/v1/generations List generations with filtering and pagination. **Authentication:** Project Key required **Query Parameters:** - `flowId` - Filter by flow (UUID) - `status` - Filter by status (pending|processing|success|failed) - `limit` - Results per page (default: 20, max: 100) - `offset` - Pagination offset (default: 0) - `includeDeleted` - Include soft-deleted records (boolean, default: false) **Purpose:** Browse generation history with optional filters --- ### GET /api/v1/generations/:id Get single generation with full details. **Authentication:** Project Key required **Parameters:** - `id` - Generation UUID (path parameter) **Purpose:** View complete generation details including output image, reference images, flow association, and timestamps --- ### PUT /api/v1/generations/:id Update generation parameters with automatic regeneration. **Authentication:** Project Key required **Parameters:** - `id` - Generation UUID (path parameter) - `prompt` - New prompt (triggers regeneration) - `aspectRatio` - New aspect ratio (triggers regeneration) - `flowId` - Change flow association (null to detach, no regeneration) - `meta` - Update custom metadata (no regeneration) **Purpose:** Update generation settings with intelligent regeneration behavior **Notes:** - Changing `prompt` or `aspectRatio` triggers automatic regeneration - Changing `flowId` or `meta` updates metadata only (no regeneration) - Regeneration replaces existing output image (preserves ID and URLs) --- ### POST /api/v1/generations/:id/regenerate Regenerate existing generation with exact same parameters. **Authentication:** Project Key required **Parameters:** - `id` - Generation UUID (path parameter) **Purpose:** Recreate image using original parameters (prompt, aspect ratio, references) **Notes:** - Uses exact same parameters as original generation - Works regardless of current status (success, failed, pending) - Replaces existing output image (preserves ID and URLs) - No parameter modifications allowed (use PUT for changes) - Useful for refreshing stale images or recovering from failures --- ### POST /api/v1/generations/:id/retry **DEPRECATED:** Use POST /api/v1/generations/:id/regenerate instead Legacy endpoint maintained for backward compatibility. Delegates to /regenerate endpoint. --- ### DELETE /api/v1/generations/:id Delete generation and its output image. **Authentication:** Project Key required **Parameters:** - `id` - Generation UUID (path parameter) **Purpose:** Remove generation record and associated output image **Notes:** - Soft delete generation record (sets deletedAt timestamp) - Hard delete output image if no project/flow aliases exist - Soft delete output image if aliases exist (preserves for CDN access) - Cascades to remove generation-image relationships --- ## Flows Flows organize related generations into chains and support flow-scoped aliases. Flows are created automatically when generations or uploads specify a flowId. ### GET /api/v1/flows List all flows with pagination. **Authentication:** Project Key required **Query Parameters:** - `limit` - Results per page (default: 20, max: 100) - `offset` - Pagination offset (default: 0) **Purpose:** Browse all flows with computed generation and image counts **Notes:** - Flows are created automatically when: - A generation/upload specifies a flowId - A generation/upload provides a flowAlias (eager creation) --- ### GET /api/v1/flows/:id Get single flow with details. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) **Purpose:** View flow metadata, aliases, and computed counts (generationCount, imageCount) --- ### GET /api/v1/flows/:id/generations List all generations in a flow. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) **Query Parameters:** - `limit` - Results per page (default: 20, max: 100) - `offset` - Pagination offset (default: 0) **Purpose:** View all generations associated with this flow, ordered by creation date (newest first) --- ### GET /api/v1/flows/:id/images List all images in a flow. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) **Query Parameters:** - `limit` - Results per page (default: 20, max: 100) - `offset` - Pagination offset (default: 0) **Purpose:** View all images (generated and uploaded) associated with this flow, ordered by creation date (newest first) --- ### PUT /api/v1/flows/:id/aliases Update flow aliases. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) - `aliases` - Object mapping alias names to image IDs (request body) **Purpose:** Add or update flow-scoped aliases for image referencing **Notes:** - Merges with existing aliases (does not replace all) - Aliases must map to valid image IDs - Aliases are stored in JSONB field for efficient lookups --- ### DELETE /api/v1/flows/:id/aliases/:alias Remove specific flow alias. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) - `alias` - Alias name to remove (path parameter, e.g., "@hero") **Purpose:** Delete a single alias from flow's alias map, other aliases remain unchanged --- ### POST /api/v1/flows/:id/regenerate Regenerate the most recent generation in a flow. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) **Purpose:** Regenerate the latest generation in the flow **Notes:** - Identifies the most recent generation (ordered by creation date) - Uses exact same parameters from original generation - Returns error if flow has no generations - Replaces existing output image (preserves ID and URLs) --- ### DELETE /api/v1/flows/:id Delete flow. **Authentication:** Project Key required **Parameters:** - `id` - Flow UUID (path parameter) **Purpose:** Remove flow (hard delete) **Notes:** - Flow record is hard deleted (no soft delete) - Generations remain intact (not cascaded) - Images remain intact (not cascaded) - Flow-scoped aliases are removed with flow - Generations and images lose their flow association but remain accessible --- ## Images Database-tracked image management with upload, listing, metadata updates, and deletion. ### POST /api/v1/images/upload Upload image file with database tracking. **Authentication:** Project Key required **Form Parameters (multipart/form-data):** - `file` - Image file (required, max 5MB, PNG/JPEG/WebP) - `alias` - Project-scoped alias (optional, e.g., "@logo") - `flowId` - Associate with flow (UUID, optional) - `flowAlias` - Flow-scoped alias (optional, requires flowId, triggers eager creation) - `meta` - Custom metadata (JSON string, optional) **Purpose:** Upload image with automatic database record creation and storage **FlowId Behavior:** - `undefined` (not provided) → generates new UUID for automatic flow creation - `null` (explicitly null) → no flow association - `string` (specific value) → uses provided flow ID **Notes:** - Creates both MinIO storage file and database entry - Supports PNG, JPEG, JPG, WebP formats - Maximum file size: 5MB - Eager flow creation when flowAlias is provided --- ### GET /api/v1/images List images with filtering and pagination. **Authentication:** Project Key required **Query Parameters:** - `flowId` - Filter by flow (UUID) - `source` - Filter by source (generated|uploaded) - `alias` - Filter by project alias (exact match) - `limit` - Results per page (default: 20, max: 100) - `offset` - Pagination offset (default: 0) - `includeDeleted` - Include soft-deleted records (boolean, default: false) **Purpose:** Browse image library with optional filters --- ### GET /api/v1/images/resolve/:alias Resolve alias to image using 3-tier precedence. **Authentication:** Project Key required **Parameters:** - `alias` - Alias to resolve (path parameter, e.g., "@hero", "@last") **Query Parameters:** - `flowId` - Flow context for resolution (UUID, optional) **Purpose:** Lookup image by alias with technical → flow → project precedence **Resolution Order:** 1. Technical aliases (if matches @last, @first, @upload) - computed on-the-fly 2. Flow aliases (if flowId provided) - looked up in flow's JSONB aliases field 3. Project aliases (global) - looked up in images.alias column **Returns:** Image record with resolution metadata (imageId, scope, flowId, image details) --- ### GET /api/v1/images/:id Get single image by ID. **Authentication:** Project Key required **Parameters:** - `id` - Image UUID (path parameter) **Purpose:** View complete image metadata including storage URLs, project/flow associations, alias, source, file metadata, focal point, and custom metadata --- ### PUT /api/v1/images/:id Update image metadata. **Authentication:** Project Key required **Parameters:** - `id` - Image UUID (path parameter) - `focalPoint` - Update focal point coordinates (object: {x: 0.0-1.0, y: 0.0-1.0}, optional) - `meta` - Update custom metadata (JSON object, optional) **Purpose:** Modify non-generative image properties **Notes:** - Alias assignment moved to separate endpoint PUT /images/:id/alias - Focal point used for image cropping --- ### PUT /api/v1/images/:id/alias Assign or update project-scoped alias. **Authentication:** Project Key required **Parameters:** - `id` - Image UUID (path parameter) - `alias` - Alias name (string, required in request body, e.g., "@hero-bg") **Purpose:** Set project-level alias for image referencing **Notes:** - Alias must start with @ symbol - Must be unique within the project - Validates alias format and reserved names - Checks for conflicts with existing aliases - Replaces existing alias if image already has one --- ### DELETE /api/v1/images/:id Delete image with storage cleanup. **Authentication:** Project Key required **Parameters:** - `id` - Image UUID (path parameter) **Purpose:** Permanently remove image and its storage file **Notes:** - Hard delete of image record (no soft delete) - Removes file from MinIO storage permanently - Cascades to delete generation-image relationships - Removes image from flow aliases (if present) - Cannot be undone - use with caution --- ## CDN Endpoints Public endpoints for serving images and live URL generation without authentication. ### GET /cdn/:orgSlug/:projectSlug/img/:filenameOrAlias Serve images by filename or project-scoped alias via public CDN. **Authentication:** None - Public endpoint **Parameters:** - `orgSlug` - Organization slug (path parameter) - `projectSlug` - Project slug (path parameter) - `filenameOrAlias` - Filename or @alias (path parameter) **Purpose:** Public image serving for websites and applications **Response Format:** Raw image bytes (not JSON) **Response Headers:** - `Content-Type` - image/jpeg (or appropriate MIME type) - `Content-Length` - Actual byte length - `Cache-Control` - public, max-age=31536000 (1 year) - `X-Image-Id` - Image database UUID **Access Methods:** - Filename: `GET /cdn/acme/website/img/hero-background.jpg` - Alias: `GET /cdn/acme/website/img/@hero` --- ### GET /cdn/:orgSlug/:projectSlug/live/:scope Live URL generation with automatic caching and scope management. **Authentication:** None - Public endpoint **Rate Limit:** 10 new generations per hour per IP (cache hits excluded) **Parameters:** - `orgSlug` - Organization slug (path parameter) - `projectSlug` - Project slug (path parameter) - `scope` - Scope identifier (path parameter, alphanumeric + hyphens + underscores) **Query Parameters:** - `prompt` - Image description (required) - `aspectRatio` - Image aspect ratio (optional, default: "1:1") - `autoEnhance` - Enable prompt enhancement (boolean, optional) - `template` - Enhancement template (optional): photorealistic, illustration, minimalist, sticker, product, comic, general **Purpose:** On-demand image generation via URL parameters for dynamic content **Response Format:** Raw image bytes (not JSON) **Response Headers (Cache HIT):** - `Content-Type` - image/jpeg - `Content-Length` - Actual byte length - `Cache-Control` - public, max-age=31536000 - `X-Cache-Status` - HIT - `X-Scope` - Scope identifier - `X-Image-Id` - Image UUID **Response Headers (Cache MISS):** - `Content-Type` - image/jpeg - `Content-Length` - Actual byte length - `Cache-Control` - public, max-age=31536000 - `X-Cache-Status` - MISS - `X-Scope` - Scope identifier - `X-Generation-Id` - Generation UUID - `X-Image-Id` - Image UUID - `X-RateLimit-Limit` - 10 - `X-RateLimit-Remaining` - Remaining requests - `X-RateLimit-Reset` - Seconds until reset **Caching Behavior:** - **Cache HIT:** Returns existing image instantly, no rate limit check - **Cache MISS:** Generates new image, counts toward IP rate limit - Cache key computed from: prompt + aspectRatio + autoEnhance + template - Cached images stored with meta.isLiveUrl = true **Scope Management:** - Scopes separate generation budgets (e.g., "hero-section", "gallery") - Auto-created on first use if allowNewLiveScopes = true - Generation limits per scope (default: 30) - Scope stats tracked (currentGenerations, lastGeneratedAt) **IP Rate Limiting:** - 10 new generations per hour per IP address - Separate from API key rate limits - Cache hits do NOT count toward limit - Only new generations (cache MISS) count - Supports X-Forwarded-For header for proxy setups **Example:** ``` GET /cdn/acme/website/live/hero-section?prompt=mountain+landscape&aspectRatio=16:9 ``` --- ## Live Scopes Management Authenticated endpoints for managing live URL scopes. All require Project Key authentication. ### POST /api/v1/live/scopes Create new live scope manually with settings. **Authentication:** Project Key required **Parameters:** - `slug` - Unique scope identifier (required, alphanumeric + hyphens + underscores) - `allowNewGenerations` - Allow new generations in scope (boolean, default: true) - `newGenerationsLimit` - Maximum generations allowed (number, default: 30) - `meta` - Custom metadata (JSON object, optional) **Purpose:** Pre-configure scope with specific settings before first use **Notes:** - Scopes are typically auto-created via live URLs - Slug must be unique within the project - Slug format: alphanumeric + hyphens + underscores only --- ### GET /api/v1/live/scopes List all live scopes with pagination and statistics. **Authentication:** Project Key required **Query Parameters:** - `slug` - Filter by exact slug match (optional) - `limit` - Results per page (default: 20, max: 100) - `offset` - Pagination offset (default: 0) **Purpose:** Browse all scopes (both auto-created and manually created) **Returns:** Scopes with currentGenerations count, lastGeneratedAt, settings, and metadata --- ### GET /api/v1/live/scopes/:slug Get single live scope by slug with complete statistics. **Authentication:** Project Key required **Parameters:** - `slug` - Scope slug identifier (path parameter) **Purpose:** View detailed scope information including generation count, last generation timestamp, settings, and metadata --- ### PUT /api/v1/live/scopes/:slug Update live scope settings and metadata. **Authentication:** Project Key required **Parameters:** - `slug` - Scope slug identifier (path parameter) - `allowNewGenerations` - Allow/disallow new generations (boolean, optional) - `newGenerationsLimit` - Update generation limit (number, optional) - `meta` - Update custom metadata (JSON object, optional) **Purpose:** Modify scope configuration **Notes:** - Changes take effect immediately for new live URL requests --- ### POST /api/v1/live/scopes/:slug/regenerate Regenerate images in a live scope. **Authentication:** Project Key required **Parameters:** - `slug` - Scope slug identifier (path parameter) - `imageId` - Specific image to regenerate (UUID, optional in request body) **Purpose:** Regenerate either a specific image or all images in the scope **Behavior:** - If `imageId` provided: Regenerates specific image only - If `imageId` omitted: Regenerates all images in scope - Uses exact same parameters (prompt, aspect ratio, etc.) - Updates existing images (preserves IDs and URLs) - Verifies image belongs to scope before regenerating **Notes:** - Useful for refreshing stale cached images or recovering from failures --- ### DELETE /api/v1/live/scopes/:slug Delete live scope with cascading image deletion. **Authentication:** Project Key required **Parameters:** - `slug` - Scope slug identifier (path parameter) **Purpose:** Permanently remove scope and all cached live URL images **Notes:** - Hard deletes all images in scope (MinIO + database) - Follows alias protection rules for each image - Hard deletes scope record (no soft delete) - Cannot be undone - use with caution --- ## Alias System The v1 API supports a 3-tier alias resolution system for referencing images. **Alias Format Requirements:** - All aliases MUST start with `@` symbol - Pattern: `@[a-zA-Z0-9_-]+` (alphanumeric, underscore, hyphen) - Maximum length: 50 characters - Examples: `@hero`, `@product-main`, `@image_1` **Technical Aliases** (Computed, Reserved) - `@last` - Most recently generated image in project - `@first` - First generated image in project - `@upload` - Most recently uploaded image in project **Reserved Aliases** (Cannot be used) - Technical aliases: `@last`, `@first`, `@upload` - Future reserved: `@all`, `@latest`, `@oldest`, `@random`, `@next`, `@prev`, `@previous` **Flow Aliases** (Flow-scoped) - Stored in flow's aliases JSONB field - Only accessible within flow context - Set via `PUT /api/v1/flows/:id/aliases` - Example: `@hero` in flow A is different from `@hero` in flow B **Project Aliases** (Global) - Unique within project - Accessible across all flows - Set via `PUT /api/v1/images/:id/alias` or generation/upload parameters - Example: `@logo` is the same image across entire project **Resolution Order:** 1. Technical aliases (if matches @last, @first, @upload) 2. Flow aliases (if flowId provided in context) 3. Project aliases (global lookup) --- ## Error Codes | Code | Description | |------|-------------| | 400 | Bad Request - Invalid parameters or validation failure | | 401 | Unauthorized - Missing, invalid, expired, or revoked API key | | 403 | Forbidden - Scope creation disabled or insufficient permissions | | 404 | Not Found - Resource does not exist | | 409 | Conflict - Alias or slug already exists | | 429 | Too Many Requests - Rate limit or scope generation limit exceeded | | 500 | Internal Server Error - Processing or generation failure | **Common Error Codes:** - `VALIDATION_ERROR` - Invalid parameters or missing required fields - `GENERATION_NOT_FOUND` - Generation does not exist - `FLOW_NOT_FOUND` - Flow does not exist - `IMAGE_NOT_FOUND` - Image or alias not found - `ALIAS_CONFLICT` - Alias already exists in project - `ALIAS_NOT_FOUND` - Alias does not exist in any scope - `SCOPE_INVALID_FORMAT` - Invalid scope slug format - `SCOPE_ALREADY_EXISTS` - Scope slug already in use - `SCOPE_NOT_FOUND` - Scope does not exist - `SCOPE_CREATION_DISABLED` - New scope creation not allowed - `SCOPE_GENERATION_LIMIT_EXCEEDED` - Scope generation limit reached - `IP_RATE_LIMIT_EXCEEDED` - IP rate limit exceeded for live URLs - `ORG_NOT_FOUND` - Organization not found - `PROJECT_NOT_FOUND` - Project not found - `IMAGE_NOT_IN_SCOPE` - Image doesn't belong to specified scope **Common Error Messages:** - `"Prompt is required"` - Missing prompt parameter - `"Alias already exists"` - Alias conflict in project - `"Invalid aspect ratio"` - Unsupported aspect ratio format - `"File too large"` - Upload exceeds 5MB limit - `"alias_format_check"` - Alias must start with @ symbol (e.g., @hero not hero) - `"Rate limit exceeded. Try again in N seconds"` - IP rate limit for live URLs