# Techniques ## Get a technique `client.Techniques.Get(ctx, techniqueID) (*TechniqueGetResponse, error)` **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 - `type TechniqueGetResponse struct{…}` - `Inputs []TechniqueGetResponseInput` - `ID string` Technique input or output identifier - `Name string` Technique input or output display name - `Type string` Technique input or output media type - `const TechniqueGetResponseInputTypeImageURL TechniqueGetResponseInputType = "imageUrl"` - `const TechniqueGetResponseInputTypeVideoURL TechniqueGetResponseInputType = "videoUrl"` - `const TechniqueGetResponseInputTypeAudioURL TechniqueGetResponseInputType = "audioUrl"` - `const TechniqueGetResponseInputTypeText TechniqueGetResponseInputType = "text"` - `const TechniqueGetResponseInputTypeDocumentURL TechniqueGetResponseInputType = "documentUrl"` - `Description string` Technique input or output description - `SpecifiedAspectRatio string` Required aspect ratio - `SpecifiedDuration float64` Required duration in seconds - `Name string` Technique name - `Outputs []TechniqueGetResponseOutput` - `ID string` Technique input or output identifier - `Name string` Technique input or output display name - `Type string` Technique input or output media type - `const TechniqueGetResponseOutputTypeImageURL TechniqueGetResponseOutputType = "imageUrl"` - `const TechniqueGetResponseOutputTypeVideoURL TechniqueGetResponseOutputType = "videoUrl"` - `const TechniqueGetResponseOutputTypeAudioURL TechniqueGetResponseOutputType = "audioUrl"` - `const TechniqueGetResponseOutputTypeText TechniqueGetResponseOutputType = "text"` - `const TechniqueGetResponseOutputTypeDocumentURL TechniqueGetResponseOutputType = "documentUrl"` - `Description string` Technique input or output description - `SpecifiedAspectRatio string` Required aspect ratio - `SpecifiedDuration float64` Required duration in seconds - `RunCost float64` - `TechniqueID string` Technique identifier - `Description string` Technique description ### Example ```go package main import ( "context" "fmt" "github.com/florafauna-ai/flora-go" "github.com/florafauna-ai/flora-go/option" ) func main() { client := flora.NewClient( option.WithAPIKey("My API Key"), ) technique, err := client.Techniques.Get(context.TODO(), "art-directors-critique") if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", technique.TechniqueID) } ``` #### 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(ctx, query) (*TechniquesCursorPage[TechniqueListResponse], error)` **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 param.Field[string]` Opaque cursor for fetching the next page - `Limit param.Field[int64]` Maximum number of results to return - `Query param.Field[string]` Search query - `WorkspaceID param.Field[string]` Workspace identifier ### Returns - `type TechniqueListResponse struct{…}` - `Inputs []TechniqueListResponseInput` - `ID string` Technique input or output identifier - `Name string` Technique input or output display name - `Type string` Technique input or output media type - `const TechniqueListResponseInputTypeImageURL TechniqueListResponseInputType = "imageUrl"` - `const TechniqueListResponseInputTypeVideoURL TechniqueListResponseInputType = "videoUrl"` - `const TechniqueListResponseInputTypeAudioURL TechniqueListResponseInputType = "audioUrl"` - `const TechniqueListResponseInputTypeText TechniqueListResponseInputType = "text"` - `const TechniqueListResponseInputTypeDocumentURL TechniqueListResponseInputType = "documentUrl"` - `Description string` Technique input or output description - `SpecifiedAspectRatio string` Required aspect ratio - `SpecifiedDuration float64` Required duration in seconds - `Name string` Technique name - `Outputs []TechniqueListResponseOutput` - `ID string` Technique input or output identifier - `Name string` Technique input or output display name - `Type string` Technique input or output media type - `const TechniqueListResponseOutputTypeImageURL TechniqueListResponseOutputType = "imageUrl"` - `const TechniqueListResponseOutputTypeVideoURL TechniqueListResponseOutputType = "videoUrl"` - `const TechniqueListResponseOutputTypeAudioURL TechniqueListResponseOutputType = "audioUrl"` - `const TechniqueListResponseOutputTypeText TechniqueListResponseOutputType = "text"` - `const TechniqueListResponseOutputTypeDocumentURL TechniqueListResponseOutputType = "documentUrl"` - `Description string` Technique input or output description - `SpecifiedAspectRatio string` Required aspect ratio - `SpecifiedDuration float64` Required duration in seconds - `RunCost float64` - `TechniqueID string` Technique identifier - `Description string` Technique description ### Example ```go package main import ( "context" "fmt" "github.com/florafauna-ai/flora-go" "github.com/florafauna-ai/flora-go/option" ) func main() { client := flora.NewClient( option.WithAPIKey("My API Key"), ) page, err := client.Techniques.List(context.TODO(), flora.TechniqueListParams{ }) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", page) } ``` #### 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 } } ``` # Runs ## Start a technique run `client.Techniques.Runs.New(ctx, techniqueID, body) (*TechniqueRunNewResponse, error)` **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 TechniqueRunNewParams` - `Inputs param.Field[[]TechniqueRunNewParamsInput]` Technique inputs - `ID string` Technique input identifier - `Type string` Technique input type - `const TechniqueRunNewParamsInputTypeText TechniqueRunNewParamsInputType = "text"` - `const TechniqueRunNewParamsInputTypeImageURL TechniqueRunNewParamsInputType = "imageUrl"` - `const TechniqueRunNewParamsInputTypeVideoURL TechniqueRunNewParamsInputType = "videoUrl"` - `Value string` Technique input value - `Mode param.Field[TechniqueRunNewParamsMode]` Technique run execution mode - `const TechniqueRunNewParamsModeAsync TechniqueRunNewParamsMode = "async"` - `const TechniqueRunNewParamsModeStream TechniqueRunNewParamsMode = "stream"` - `CallbackURL param.Field[string]` HTTPS callback URL for asynchronous run completion notifications - `IdempotencyKey param.Field[string]` Idempotency key for safely retrying requests ### Returns - `type TechniqueRunNewResponse struct{…}` - `CreatedAt float64` - `Progress float64` - `RunID string` Run identifier - `Status TechniqueRunNewResponseStatus` - `const TechniqueRunNewResponseStatusPending TechniqueRunNewResponseStatus = "pending"` - `const TechniqueRunNewResponseStatusRunning TechniqueRunNewResponseStatus = "running"` - `const TechniqueRunNewResponseStatusCompleted TechniqueRunNewResponseStatus = "completed"` - `const TechniqueRunNewResponseStatusFailed TechniqueRunNewResponseStatus = "failed"` - `ChargedCost float64` - `CompletedAt float64` - `ErrorCode string` Machine-readable run error code - `ErrorMessage string` Human-readable run error message - `Outputs []TechniqueRunNewResponseOutput` - `OutputID string` Run output identifier - `Type string` Run output media type - `const TechniqueRunNewResponseOutputTypeImageURL TechniqueRunNewResponseOutputType = "imageUrl"` - `const TechniqueRunNewResponseOutputTypeVideoURL TechniqueRunNewResponseOutputType = "videoUrl"` - `const TechniqueRunNewResponseOutputTypeAudioURL TechniqueRunNewResponseOutputType = "audioUrl"` - `const TechniqueRunNewResponseOutputTypeText TechniqueRunNewResponseOutputType = "text"` - `const TechniqueRunNewResponseOutputTypeDocumentURL TechniqueRunNewResponseOutputType = "documentUrl"` - `URL string` Run output URL - `PollURL string` - `StartedAt float64` ### Example ```go package main import ( "context" "fmt" "github.com/florafauna-ai/flora-go" "github.com/florafauna-ai/flora-go/option" ) func main() { client := flora.NewClient( option.WithAPIKey("My API Key"), ) run, err := client.Techniques.Runs.New( context.TODO(), "art-directors-critique", flora.TechniqueRunNewParams{ Inputs: []flora.TechniqueRunNewParamsInput{flora.TechniqueRunNewParamsInput{ ID: "id", Type: "text", Value: "value", }}, Mode: flora.TechniqueRunNewParamsModeAsync, }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", run.RunID) } ``` #### 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.Get(ctx, runID, query) (*TechniqueRunGetResponse, error)` **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 - `query TechniqueRunGetParams` - `TechniqueID param.Field[string]` Technique identifier or slug ### Returns - `type TechniqueRunGetResponse struct{…}` - `CreatedAt float64` - `Progress float64` - `RunID string` Run identifier - `Status TechniqueRunGetResponseStatus` - `const TechniqueRunGetResponseStatusPending TechniqueRunGetResponseStatus = "pending"` - `const TechniqueRunGetResponseStatusRunning TechniqueRunGetResponseStatus = "running"` - `const TechniqueRunGetResponseStatusCompleted TechniqueRunGetResponseStatus = "completed"` - `const TechniqueRunGetResponseStatusFailed TechniqueRunGetResponseStatus = "failed"` - `ChargedCost float64` - `CompletedAt float64` - `ErrorCode string` Machine-readable run error code - `ErrorMessage string` Human-readable run error message - `Outputs []TechniqueRunGetResponseOutput` - `OutputID string` Run output identifier - `Type string` Run output media type - `const TechniqueRunGetResponseOutputTypeImageURL TechniqueRunGetResponseOutputType = "imageUrl"` - `const TechniqueRunGetResponseOutputTypeVideoURL TechniqueRunGetResponseOutputType = "videoUrl"` - `const TechniqueRunGetResponseOutputTypeAudioURL TechniqueRunGetResponseOutputType = "audioUrl"` - `const TechniqueRunGetResponseOutputTypeText TechniqueRunGetResponseOutputType = "text"` - `const TechniqueRunGetResponseOutputTypeDocumentURL TechniqueRunGetResponseOutputType = "documentUrl"` - `URL string` Run output URL - `PollURL string` - `StartedAt float64` ### Example ```go package main import ( "context" "fmt" "github.com/florafauna-ai/flora-go" "github.com/florafauna-ai/flora-go/option" ) func main() { client := flora.NewClient( option.WithAPIKey("My API Key"), ) run, err := client.Techniques.Runs.Get( context.TODO(), "run_abc123", flora.TechniqueRunGetParams{ TechniqueID: "art-directors-critique", }, ) if err != nil { panic(err.Error()) } fmt.Printf("%+v\n", run.RunID) } ``` #### 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 } ```