# Techniques

## Get a technique

`client.techniques.retrieve(stringtechniqueID, RequestOptionsoptions?): TechniqueRetrieveResponse`

**get** `/techniques/{techniqueId}`

Returns the public definition for one technique, including its input and output schema used to start runs.

### Parameters

- `techniqueID: string`

  Technique identifier or slug

### Returns

- `TechniqueRetrieveResponse`

  - `inputs: Array<Input>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `name: string`

    Technique name

  - `outputs: Array<Output>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `run_cost: number`

    Cost per run in USD

  - `technique_id: string`

    Technique identifier

  - `description?: string`

    Technique description

### Example

```typescript
import FLORA from '@flora-ai/flora';

const client = new FLORA({
  apiKey: process.env['FLORA_API_KEY'], // This is the default and can be omitted
});

const technique = await client.techniques.retrieve('art-directors-critique');

console.log(technique.technique_id);
```

#### Response

```json
{
  "inputs": [
    {
      "id": "prompt",
      "name": "Prompt",
      "type": "imageUrl",
      "description": "Describe the desired image.",
      "specified_aspect_ratio": "1:1",
      "specified_duration": 0
    }
  ],
  "name": "Editorial Image Grid",
  "outputs": [
    {
      "id": "prompt",
      "name": "Prompt",
      "type": "imageUrl",
      "description": "Describe the desired image.",
      "specified_aspect_ratio": "1:1",
      "specified_duration": 0
    }
  ],
  "run_cost": 0,
  "technique_id": "tech_abcd1234",
  "description": "Generate a cohesive editorial image grid."
}
```

## List techniques

`client.techniques.list(TechniqueListParamsquery?, RequestOptionsoptions?): TechniquesCursorPage<TechniqueListResponse>`

**get** `/techniques`

Returns reusable Flora techniques visible to the authenticated public API key. Use workspace_id, query, cursor, and limit to filter the catalog.

### Parameters

- `query: TechniqueListParams`

  - `cursor?: string`

    Opaque cursor for fetching the next page

  - `limit?: number`

    Maximum number of results to return

  - `query?: string`

    Search query

  - `workspace_id?: string`

    Workspace identifier

### Returns

- `TechniqueListResponse`

  - `inputs: Array<Input>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `name: string`

    Technique name

  - `outputs: Array<Output>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `run_cost: number`

    Cost per run in USD

  - `technique_id: string`

    Technique identifier

  - `description?: string`

    Technique description

### Example

```typescript
import FLORA from '@flora-ai/flora';

const client = new FLORA({
  apiKey: process.env['FLORA_API_KEY'], // This is the default and can be omitted
});

// Automatically fetches more pages as needed.
for await (const techniqueListResponse of client.techniques.list()) {
  console.log(techniqueListResponse.technique_id);
}
```

#### Response

```json
{
  "techniques": [
    {
      "technique_id": "tech_art-directors-critique",
      "name": "Art Director's Critique",
      "description": "Analyze, critique, and redesign any creative asset.",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_auto-translate",
      "name": "Auto Translate",
      "description": "Translate text in images instantly",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_book-drop",
      "name": "Book Drop",
      "description": "Mocks up front and back book covers",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_cctv-cam",
      "name": "CCTV Cam",
      "description": "Any face, CCTV style",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_character-lock",
      "name": "Character Lock",
      "description": "One character, 6 different angles",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_cinematic-movie-generator",
      "name": "Cinematic Movie Stills",
      "description": "Generate film-quality scene stills",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_color-mapping",
      "name": "Segment Mapper",
      "description": "Color-codes every element in your image",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_color-transfer",
      "name": "Color Transfer",
      "description": "Apply color grading from any reference",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_earth-zoom-out",
      "name": "Earth Zoom Out",
      "description": "Zoom out to space from any scene",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_facade-swap",
      "name": "Facade Swap",
      "description": "Reskin buildings with new materials",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_fit-checks",
      "name": "Fit Check",
      "description": "Extract outfits & swap onto new looks",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_glam-shots",
      "name": "Glam Shots",
      "description": "Create polished makeup ads instantly",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_icon-pack",
      "name": "Icon Pack",
      "description": "Generate matched icon sets from a prompt",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_live-like-an-amsterdammer",
      "name": "Live like an Amsterdammer",
      "description": "Places you into everyday Amsterdam scenes",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_location-scouter",
      "name": "Location Scout",
      "description": "Scouts five views from a single location",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_logo-stylist",
      "name": "Logo Stylist",
      "description": "Stylize any logo with a new visual twist",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_memoji-me",
      "name": "Memoji Me",
      "description": "Turn any face into a custom memoji",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_moodboard-maker",
      "name": "Mood Board Maker",
      "description": "Eclectic mood board from a photo",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_mugshot",
      "name": "Mugshot",
      "description": "Turn any portrait into a mugshot",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_palette-pull",
      "name": "Palette Pull",
      "description": "Extract color palettes from any image",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_product-animator",
      "name": "Product Animator",
      "description": "Animate your product",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_product-lookbook-grid",
      "name": "Product Lookbook Grid",
      "description": "Turn products into styled grid layouts",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_product-motion",
      "name": "Product Motion",
      "description": "Animate product shots in one click",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_quick-reframe",
      "name": "Layout Resizer",
      "description": "Resize layouts for any aspect ratio",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_relight-technique",
      "name": "Relighting",
      "description": "Relights your photo",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_room-render",
      "name": "Room Render",
      "description": "Turn floor plans into realistic rooms",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_seamless-transition",
      "name": "Seamless Transition",
      "description": "Animate between any two frames",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_sigil",
      "name": "Sigil",
      "description": "Turns any image into an animated glyph",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_sketch-to-garment",
      "name": "Garment Sketch",
      "description": "One sketch, one final garment.",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_studio-blur",
      "name": "Studio Blur",
      "description": "Add pro depth-of-field blur to photos",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_studio-shot",
      "name": "Studio Shot",
      "description": "Turns any product into a studio-lit shoot",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_tarot-pull",
      "name": "Tarot Pull",
      "description": "Custom illustrated tarot card readings",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_texture-matchers",
      "name": "Texture Match",
      "description": "Replicate textures & colors across assets",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_turn-any-product-into-4-ad-visuals",
      "name": "Turn any product into 4 ad visuals",
      "description": "Make a full ad campaign from 1 product",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_ugc-creation",
      "name": "UGC Creator",
      "description": "Casual, phone-shot clips of your product",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_video-scene-builder",
      "name": "Video Scene Builder",
      "description": "Compose video scenes from still assets",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_wireframe",
      "name": "Photo Wireframe",
      "description": "Turn any photo into a clean wireframe",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    },
    {
      "technique_id": "tech_wonder-fy",
      "name": "Wonder(fy)",
      "description": "Apply Wonder's cinematic style to images",
      "run_cost": 0,
      "inputs": [],
      "outputs": []
    }
  ],
  "meta": {
    "next_cursor": null
  }
}
```

## Domain Types

### Technique Retrieve Response

- `TechniqueRetrieveResponse`

  - `inputs: Array<Input>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `name: string`

    Technique name

  - `outputs: Array<Output>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `run_cost: number`

    Cost per run in USD

  - `technique_id: string`

    Technique identifier

  - `description?: string`

    Technique description

### Technique List Response

- `TechniqueListResponse`

  - `inputs: Array<Input>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `name: string`

    Technique name

  - `outputs: Array<Output>`

    - `id: string`

      Technique input or output identifier

    - `name: string`

      Technique input or output display name

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Technique input or output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `description?: string`

      Technique input or output description

    - `specified_aspect_ratio?: string`

      Required aspect ratio

    - `specified_duration?: number`

      Required duration in seconds

  - `run_cost: number`

    Cost per run in USD

  - `technique_id: string`

    Technique identifier

  - `description?: string`

    Technique description

# Runs

## Start a technique run

`client.techniques.runs.create(stringtechniqueID, RunCreateParamsbody, RequestOptionsoptions?): RunCreateResponse`

**post** `/techniques/{techniqueId}/runs`

Starts a run for a specific technique using the backward-compatible nested route. Mutating public API requests support an optional Idempotency-Key header for client retries; duplicate keys within two hours return idempotency_duplicate.

### Parameters

- `techniqueID: string`

  Technique identifier or slug

- `body: RunCreateParams`

  - `inputs: Array<Input>`

    Technique inputs

    - `id: string`

      Technique input identifier

    - `type: "text" | "imageUrl" | "videoUrl"`

      Technique input type

      - `"text"`

      - `"imageUrl"`

      - `"videoUrl"`

    - `value: string`

      Technique input value

  - `mode: "async" | "stream"`

    Technique run execution mode

    - `"async"`

    - `"stream"`

  - `callback_url?: string`

    HTTPS callback URL for asynchronous run completion notifications

  - `idempotency_key?: string`

    Idempotency key for safely retrying requests

### Returns

- `RunCreateResponse`

  - `created_at: number`

  - `progress: number`

  - `run_id: string`

    Run identifier

  - `status: "pending" | "running" | "completed" | "failed"`

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `charged_cost?: number`

    Cost charged in USD

  - `completed_at?: number`

  - `error_code?: string`

    Machine-readable run error code

  - `error_message?: string`

    Human-readable run error message

  - `outputs?: Array<Output>`

    - `output_id: string`

      Run output identifier

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Run output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `url: string`

      Run output URL or text content

  - `poll_url?: string`

    URL to poll pending/running runs or fetch completed/failed run details.

  - `started_at?: number`

### Example

```typescript
import FLORA from '@flora-ai/flora';

const client = new FLORA({
  apiKey: process.env['FLORA_API_KEY'], // This is the default and can be omitted
});

const run = await client.techniques.runs.create('art-directors-critique', {
  inputs: [
    {
      id: 'id',
      type: 'text',
      value: 'value',
    },
  ],
  mode: 'async',
});

console.log(run.run_id);
```

#### Response

```json
{
  "created_at": 0,
  "progress": 0,
  "run_id": "run_abc123",
  "status": "pending",
  "charged_cost": 0,
  "completed_at": 0,
  "error_code": "provider_error",
  "error_message": "The provider failed to complete the generation.",
  "outputs": [
    {
      "output_id": "output_1",
      "type": "imageUrl",
      "url": "https://media.flora.ai/output.png"
    }
  ],
  "poll_url": "https://example.com",
  "started_at": 0
}
```

## List technique run history

`client.techniques.runs.list(RunListParamsquery?, RequestOptionsoptions?): TechniqueRunsCursorPage<RunListResponse>`

**get** `/technique-runs`

Lists technique run history for the authenticated caller, including pending, running, completed, and failed technique runs. Results are newest first and can be filtered by workspace_id, project_id, technique_id, and status. Each item includes poll_url; use it to poll pending/running technique runs and to fetch completed or failed run details and outputs.

### Parameters

- `query: RunListParams`

  - `cursor?: string`

    Opaque cursor for fetching the next page

  - `limit?: number`

    Maximum number of results to return

  - `project_id?: string`

    Project identifier

  - `status?: "pending" | "running" | "completed" | "failed"`

    Run status filter

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `technique_id?: string`

    Technique identifier

  - `workspace_id?: string`

    Workspace identifier

### Returns

- `RunListResponse`

  - `created_at: number`

  - `progress: number`

  - `project_id: string`

    Project identifier

  - `run_id: string`

    Run identifier

  - `status: "pending" | "running" | "completed" | "failed"`

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `technique: Technique`

    - `name: string`

      Technique name

    - `technique_id: string`

      Technique identifier

  - `technique_run_id: string`

    Run identifier

  - `workspace_id: string`

    Workspace identifier

  - `charged_cost?: number`

    Cost charged in USD

  - `completed_at?: number`

  - `error_code?: string`

    Machine-readable run error code

  - `error_message?: string`

    Human-readable run error message

  - `outputs?: Array<Output>`

    - `output_id: string`

      Run output identifier

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Run output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `url: string`

      Run output URL or text content

  - `poll_url?: string`

    URL to poll pending/running runs or fetch completed/failed run details.

  - `started_at?: number`

### Example

```typescript
import FLORA from '@flora-ai/flora';

const client = new FLORA({
  apiKey: process.env['FLORA_API_KEY'], // This is the default and can be omitted
});

// Automatically fetches more pages as needed.
for await (const runListResponse of client.techniques.runs.list()) {
  console.log(runListResponse.project_id);
}
```

#### Response

```json
{
  "meta": {
    "next_cursor": "eyJvZmZzZXQiOjIwfQ",
    "total_estimate": 0
  },
  "technique_runs": [
    {
      "created_at": 0,
      "progress": 0,
      "project_id": "prj_abc123",
      "run_id": "run_abc123",
      "status": "pending",
      "technique": {
        "name": "name",
        "technique_id": "tech_abcd1234"
      },
      "technique_run_id": "run_abc123",
      "workspace_id": "ws_abc123",
      "charged_cost": 0,
      "completed_at": 0,
      "error_code": "provider_error",
      "error_message": "The provider failed to complete the generation.",
      "outputs": [
        {
          "output_id": "output_1",
          "type": "imageUrl",
          "url": "https://media.flora.ai/output.png"
        }
      ],
      "poll_url": "https://example.com",
      "started_at": 0
    }
  ]
}
```

## Get a technique run

`client.techniques.runs.retrieve(stringrunID, RunRetrieveParamsparams, RequestOptionsoptions?): RunRetrieveResponse`

**get** `/techniques/{techniqueId}/runs/{runId}`

Returns status, progress, outputs, and error details for a technique run when it is accessible to the authenticated public API key.

### Parameters

- `runID: string`

  Run identifier

- `params: RunRetrieveParams`

  - `techniqueId: string`

    Technique identifier or slug

### Returns

- `RunRetrieveResponse`

  - `created_at: number`

  - `progress: number`

  - `run_id: string`

    Run identifier

  - `status: "pending" | "running" | "completed" | "failed"`

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `charged_cost?: number`

    Cost charged in USD

  - `completed_at?: number`

  - `error_code?: string`

    Machine-readable run error code

  - `error_message?: string`

    Human-readable run error message

  - `outputs?: Array<Output>`

    - `output_id: string`

      Run output identifier

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Run output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `url: string`

      Run output URL or text content

  - `poll_url?: string`

    URL to poll pending/running runs or fetch completed/failed run details.

  - `started_at?: number`

### Example

```typescript
import FLORA from '@flora-ai/flora';

const client = new FLORA({
  apiKey: process.env['FLORA_API_KEY'], // This is the default and can be omitted
});

const run = await client.techniques.runs.retrieve('run_abc123', {
  techniqueId: 'art-directors-critique',
});

console.log(run.run_id);
```

#### Response

```json
{
  "created_at": 0,
  "progress": 0,
  "run_id": "run_abc123",
  "status": "pending",
  "charged_cost": 0,
  "completed_at": 0,
  "error_code": "provider_error",
  "error_message": "The provider failed to complete the generation.",
  "outputs": [
    {
      "output_id": "output_1",
      "type": "imageUrl",
      "url": "https://media.flora.ai/output.png"
    }
  ],
  "poll_url": "https://example.com",
  "started_at": 0
}
```

## Domain Types

### Run Create Response

- `RunCreateResponse`

  - `created_at: number`

  - `progress: number`

  - `run_id: string`

    Run identifier

  - `status: "pending" | "running" | "completed" | "failed"`

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `charged_cost?: number`

    Cost charged in USD

  - `completed_at?: number`

  - `error_code?: string`

    Machine-readable run error code

  - `error_message?: string`

    Human-readable run error message

  - `outputs?: Array<Output>`

    - `output_id: string`

      Run output identifier

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Run output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `url: string`

      Run output URL or text content

  - `poll_url?: string`

    URL to poll pending/running runs or fetch completed/failed run details.

  - `started_at?: number`

### Run List Response

- `RunListResponse`

  - `created_at: number`

  - `progress: number`

  - `project_id: string`

    Project identifier

  - `run_id: string`

    Run identifier

  - `status: "pending" | "running" | "completed" | "failed"`

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `technique: Technique`

    - `name: string`

      Technique name

    - `technique_id: string`

      Technique identifier

  - `technique_run_id: string`

    Run identifier

  - `workspace_id: string`

    Workspace identifier

  - `charged_cost?: number`

    Cost charged in USD

  - `completed_at?: number`

  - `error_code?: string`

    Machine-readable run error code

  - `error_message?: string`

    Human-readable run error message

  - `outputs?: Array<Output>`

    - `output_id: string`

      Run output identifier

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Run output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `url: string`

      Run output URL or text content

  - `poll_url?: string`

    URL to poll pending/running runs or fetch completed/failed run details.

  - `started_at?: number`

### Run Retrieve Response

- `RunRetrieveResponse`

  - `created_at: number`

  - `progress: number`

  - `run_id: string`

    Run identifier

  - `status: "pending" | "running" | "completed" | "failed"`

    - `"pending"`

    - `"running"`

    - `"completed"`

    - `"failed"`

  - `charged_cost?: number`

    Cost charged in USD

  - `completed_at?: number`

  - `error_code?: string`

    Machine-readable run error code

  - `error_message?: string`

    Human-readable run error message

  - `outputs?: Array<Output>`

    - `output_id: string`

      Run output identifier

    - `type: "imageUrl" | "videoUrl" | "audioUrl" | 2 more`

      Run output media type

      - `"imageUrl"`

      - `"videoUrl"`

      - `"audioUrl"`

      - `"text"`

      - `"documentUrl"`

    - `url: string`

      Run output URL or text content

  - `poll_url?: string`

    URL to poll pending/running runs or fetch completed/failed run details.

  - `started_at?: number`
