# 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` - `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` - `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` - `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` **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` - `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` - `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` - `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` - `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` - `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` - `technique_id: string` Technique identifier - `description?: string` Technique description ### Technique List Response - `TechniqueListResponse` - `inputs: Array` - `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` - `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` - `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` 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` - `completed_at?: number` - `error_code?: string` Machine-readable run error code - `error_message?: string` Human-readable run error message - `outputs?: Array` - `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 - `poll_url?: string` - `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 } ``` ## 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` - `completed_at?: number` - `error_code?: string` Machine-readable run error code - `error_message?: string` Human-readable run error message - `outputs?: Array` - `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 - `poll_url?: string` - `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` - `completed_at?: number` - `error_code?: string` Machine-readable run error code - `error_message?: string` Human-readable run error message - `outputs?: Array` - `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 - `poll_url?: string` - `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` - `completed_at?: number` - `error_code?: string` Machine-readable run error code - `error_message?: string` Human-readable run error message - `outputs?: Array` - `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 - `poll_url?: string` - `started_at?: number`