# Image Generation API

Basic image generation using AI. For advanced features like references, aliases, and flows, see [image-generation-advanced.md](image-generation-advanced.md).

All endpoints require Project Key authentication via `X-API-Key` header.

---

## Create Generation

```
POST /api/v1/generations
```

Generate an AI image from a text prompt.

**Request Body:**

| Parameter | Type | Required | Default | Description |
|-----------|------|----------|---------|-------------|
| `prompt` | string | Yes | - | Text description of the image to generate |
| `aspectRatio` | string | No | `"1:1"` | Image aspect ratio |
| `autoEnhance` | boolean | No | `true` | Enable AI prompt enhancement |
| `enhancementOptions` | object | No | - | Enhancement configuration |
| `enhancementOptions.template` | string | No | `"general"` | Enhancement template |
| `meta` | object | No | `{}` | Custom metadata |

**Example Request:**

```json
{
  "prompt": "a red sports car on a mountain road",
  "aspectRatio": "16:9",
  "autoEnhance": true,
  "enhancementOptions": {
    "template": "photorealistic"
  }
}
```

**Response:** `201 Created`

```json
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "projectId": "57c7f7f4-47de-4d70-9ebd-3807a0b63746",
    "prompt": "A photorealistic establishing shot of a sleek red sports car...",
    "originalPrompt": "a red sports car on a mountain road",
    "autoEnhance": true,
    "aspectRatio": "16:9",
    "status": "pending",
    "outputImageId": null,
    "processingTimeMs": null,
    "createdAt": "2025-11-28T10:00:00.000Z",
    "updatedAt": "2025-11-28T10:00:00.000Z"
  }
}
```

---

## Aspect Ratios

Supported aspect ratios for image generation:

| Aspect Ratio | Use Case |
|--------------|----------|
| `1:1` | Square images, social media posts, profile pictures |
| `16:9` | Landscape, hero banners, video thumbnails |
| `9:16` | Portrait, mobile screens, stories |
| `3:2` | Photography standard, print |
| `21:9` | Ultra-wide banners, cinematic |

---

## Prompt Enhancement

By default, prompts are automatically enhanced by AI to produce better results.

### How It Works

When `autoEnhance: true` (default):
- Your original prompt is preserved in `originalPrompt`
- AI enhances it with style details, lighting, composition
- The enhanced version is stored in `prompt` and used for generation

When `autoEnhance: false`:
- Both `prompt` and `originalPrompt` contain your original text
- No AI enhancement is applied

### Enhancement Templates

> **Roadmap**: Template selection is planned for a future release. Currently all enhanced prompts use the default `general` style regardless of the `template` parameter.

Use `enhancementOptions.template` to guide the enhancement style:

| Template | Description | Best For |
|----------|-------------|----------|
| `general` | Balanced enhancement (default) | Most use cases |
| `photorealistic` | Photography terms, lighting, camera details | Realistic photos |
| `illustration` | Art style, composition, color palette | Artwork, drawings |
| `minimalist` | Clean, simple, essential elements | Logos, icons |
| `sticker` | Bold outlines, limited colors, vector style | Stickers, emojis |
| `product` | Studio lighting, materials, lifestyle context | E-commerce |
| `comic` | Action lines, expressions, panel composition | Comics, manga |

### Example: With Enhancement

```json
// Request
{
  "prompt": "a cat",
  "autoEnhance": true,
  "enhancementOptions": { "template": "photorealistic" }
}

// Response
{
  "prompt": "A photorealistic close-up portrait of a domestic cat with soft fur, captured with an 85mm lens at f/1.8, natural window lighting creating soft shadows, detailed whiskers and expressive eyes, shallow depth of field with creamy bokeh background",
  "originalPrompt": "a cat",
  "autoEnhance": true
}
```

### Example: Without Enhancement

```json
// Request
{
  "prompt": "a cat sitting on a windowsill",
  "autoEnhance": false
}

// Response
{
  "prompt": "a cat sitting on a windowsill",
  "originalPrompt": "a cat sitting on a windowsill",
  "autoEnhance": false
}
```

---

## Generation Status

Generations go through these status stages:

| Status | Description |
|--------|-------------|
| `pending` | Generation created, waiting to start |
| `processing` | AI is generating the image |
| `success` | Image generated successfully |
| `failed` | Generation failed (see `errorMessage`) |

Poll the generation endpoint to check status:

```
GET /api/v1/generations/:id
```

When `status: "success"`, the `outputImageId` field contains the generated image ID.

---

## List Generations

```
GET /api/v1/generations
```

List all generations with optional filters.

**Query Parameters:**

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `status` | string | - | Filter by status: `pending`, `processing`, `success`, `failed` |
| `limit` | number | `20` | Results per page (max: 100) |
| `offset` | number | `0` | Pagination offset |
| `includeDeleted` | boolean | `false` | Include soft-deleted records |

**Example:**

```
GET /api/v1/generations?status=success&limit=10
```

**Response:**

```json
{
  "success": true,
  "data": [
    {
      "id": "550e8400-e29b-41d4-a716-446655440000",
      "prompt": "A photorealistic establishing shot...",
      "originalPrompt": "a red sports car",
      "autoEnhance": true,
      "aspectRatio": "16:9",
      "status": "success",
      "outputImageId": "7c4ccf47-41ce-4718-afbc-8c553b2c631a",
      "processingTimeMs": 8500,
      "createdAt": "2025-11-28T10:00:00.000Z"
    }
  ],
  "pagination": {
    "limit": 10,
    "offset": 0,
    "total": 42,
    "hasMore": true
  }
}
```

---

## Get Generation

```
GET /api/v1/generations/:id
```

Get a single generation with full details.

**Response:**

```json
{
  "success": true,
  "data": {
    "id": "550e8400-e29b-41d4-a716-446655440000",
    "projectId": "57c7f7f4-47de-4d70-9ebd-3807a0b63746",
    "prompt": "A photorealistic establishing shot of a sleek red sports car...",
    "originalPrompt": "a red sports car on a mountain road",
    "autoEnhance": true,
    "aspectRatio": "16:9",
    "status": "success",
    "outputImageId": "7c4ccf47-41ce-4718-afbc-8c553b2c631a",
    "outputImage": {
      "id": "7c4ccf47-41ce-4718-afbc-8c553b2c631a",
      "storageKey": "default/my-project/img/7c4ccf47-41ce-4718-afbc-8c553b2c631a",
      "storageUrl": "https://cdn.banatie.app/default/my-project/img/7c4ccf47-41ce-4718-afbc-8c553b2c631a",
      "mimeType": "image/png",
      "width": 1792,
      "height": 1024,
      "fileSize": 1909246
    },
    "processingTimeMs": 8500,
    "retryCount": 0,
    "errorMessage": null,
    "meta": {},
    "createdAt": "2025-11-28T10:00:00.000Z",
    "updatedAt": "2025-11-28T10:00:08.500Z"
  }
}
```

---

## Delete Generation

```
DELETE /api/v1/generations/:id
```

Delete a generation and its output image.

**Response:** `200 OK`

```json
{
  "success": true,
  "message": "Generation deleted"
}
```

**Behavior:**
- Generation record is hard deleted
- Output image is hard deleted (unless it has a project alias)

---

## Response Fields

### Generation Response

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Generation UUID |
| `projectId` | string | Project UUID |
| `prompt` | string | Prompt used for generation (enhanced if applicable) |
| `originalPrompt` | string | Original user input |
| `autoEnhance` | boolean | Whether enhancement was applied |
| `aspectRatio` | string | Image aspect ratio |
| `status` | string | Generation status |
| `outputImageId` | string | Output image UUID (when successful) |
| `outputImage` | object | Output image details (when successful) |
| `processingTimeMs` | number | Generation time in milliseconds |
| `retryCount` | number | Number of retry attempts |
| `errorMessage` | string | Error details (when failed) |
| `meta` | object | Custom metadata |
| `createdAt` | string | ISO timestamp |
| `updatedAt` | string | ISO timestamp |

### Output Image

| Field | Type | Description |
|-------|------|-------------|
| `id` | string | Image UUID (same as filename in storage) |
| `storageKey` | string | Storage path: `{org}/{project}/img/{imageId}` |
| `storageUrl` | string | CDN URL: `https://cdn.banatie.app/{org}/{project}/img/{imageId}` |
| `mimeType` | string | Image MIME type |
| `width` | number | Image width in pixels |
| `height` | number | Image height in pixels |
| `fileSize` | number | File size in bytes |

> **Note:** The image filename in storage equals `image.id` (UUID). No file extension is used - Content-Type is stored in object metadata.

---

## Error Codes

| HTTP Status | Code | Description |
|-------------|------|-------------|
| 400 | `VALIDATION_ERROR` | Invalid parameters |
| 401 | `UNAUTHORIZED` | Missing or invalid API key |
| 404 | `GENERATION_NOT_FOUND` | Generation does not exist |
| 429 | `RATE_LIMIT_EXCEEDED` | Too many requests |
| 500 | `GENERATION_FAILED` | AI generation failed |

---

## Rate Limits

- **100 requests per hour** per API key
- Rate limit headers included in response:
  - `X-RateLimit-Limit`: Maximum requests
  - `X-RateLimit-Remaining`: Remaining requests
  - `X-RateLimit-Reset`: Seconds until reset

---

## See Also

- [Advanced Generation](image-generation-advanced.md) - References, aliases, flows
- [Image Upload](images-upload.md) - Upload and manage images
- [Live URLs](live-url.md) - CDN and live generation
