fal · Arazzo Workflow

fal Upload Asset Then Run Inference

Version 1.0.0

Upload a binary reference asset to the fal CDN, then run an image-to-X model against it.

1 workflow 2 source APIs 1 provider
View Spec View on GitHub Artificial IntelligenceGenerative AIGenerative MediaImage-GenerationVideo GenerationAudio GenerationInferenceServerlessGPUMCPArazzoWorkflows

Provider

fal-ai

Workflows

upload-then-inference
Register an input asset on the fal CDN and feed its URL into a model.
Initiates a signed upload to obtain a public CDN file_url, then submits an inference request that passes that file_url as the model's image_url input, waits for completion, and returns the result.
4 steps inputs: contentType, fileName, modelName, modelOwner, prompt outputs: fileUrl, requestId, result
1
initiateUpload
Request a short-lived signed upload URL and the public CDN file_url for the asset. The client PUTs the file bytes to upload_url out of band before the asset can be referenced by a model.
2
submitJob
Submit an inference request that references the uploaded asset by its CDN file_url as the model's image_url input.
3
pollStatus
Poll the request status until the job reaches a terminal COMPLETED state, re-entering itself while still IN_QUEUE or IN_PROGRESS.
4
fetchResult
Retrieve the final inference output for the completed request.

Source API Descriptions

Arazzo Workflow Specification

Raw ↑
arazzo: 1.0.1
info:
  title: fal Upload Asset Then Run Inference
  summary: Upload a binary reference asset to the fal CDN, then run an image-to-X model against it.
  description: >-
    Many fal models accept a reference image, audio clip, or control map by
    URL. This workflow first requests a signed upload URL from the fal Storage
    API, then submits an inference request that references the resulting public
    CDN file_url, polls the queue until the job completes, and returns the
    output. The actual PUT of the file bytes to the signed upload_url happens
    outside the orchestrated API steps and is noted where it occurs. Every step
    spells out its request inline so the flow can be read and executed without
    opening the underlying OpenAPI description.
  version: 1.0.0
  x-realizes-capability-ids:
  - BC-610.60
  x-capability-derivation:
    method: 'deterministic join: sourceDescriptions -> per-tag OpenAPI -> tag/capability edge. No classification at this step.'
    min_confidence: 0.7
    sources:
    - capability_id: BC-610.60
      capability_name: Artificial Intelligence Management
      spec: fal-ai-queue-api-openapi.yml
      confidence: 0.7
    model: Turbo EA Capabilities by Vincent Verdet — Turbo EA, https://github.com/vincentmakes/turbo-ea-capabilities, CC BY 4.0
sourceDescriptions:
- name: queueApi
  url: ../openapi/fal-ai-queue-api-openapi.yml
  type: openapi
- name: storageApi
  url: ../openapi/fal-ai-storage-api-openapi.yml
  type: openapi
workflows:
- workflowId: upload-then-inference
  summary: Register an input asset on the fal CDN and feed its URL into a model.
  description: >-
    Initiates a signed upload to obtain a public CDN file_url, then submits an
    inference request that passes that file_url as the model's image_url input,
    waits for completion, and returns the result.
  inputs:
    type: object
    required:
    - contentType
    - fileName
    - modelOwner
    - modelName
    - prompt
    properties:
      contentType:
        type: string
        description: MIME type of the asset being uploaded (e.g. "image/png").
      fileName:
        type: string
        description: Original file name used to derive the CDN object name.
      modelOwner:
        type: string
        description: Owning organization of the model (e.g. "fal-ai").
      modelName:
        type: string
        description: Model identifier (e.g. "flux/dev/image-to-image").
      prompt:
        type: string
        description: Natural-language prompt describing the desired output.
  steps:
  - stepId: initiateUpload
    description: >-
      Request a short-lived signed upload URL and the public CDN file_url for
      the asset. The client PUTs the file bytes to upload_url out of band before
      the asset can be referenced by a model.
    operationId: initiateUpload
    requestBody:
      contentType: application/json
      payload:
        content_type: $inputs.contentType
        file_name: $inputs.fileName
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      uploadUrl: $response.body#/upload_url
      fileUrl: $response.body#/file_url
  - stepId: submitJob
    description: >-
      Submit an inference request that references the uploaded asset by its CDN
      file_url as the model's image_url input.
    operationId: submitRequest
    parameters:
    - name: model_owner
      in: path
      value: $inputs.modelOwner
    - name: model_name
      in: path
      value: $inputs.modelName
    requestBody:
      contentType: application/json
      payload:
        prompt: $inputs.prompt
        image_url: $steps.initiateUpload.outputs.fileUrl
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      requestId: $response.body#/request_id
  - stepId: pollStatus
    description: >-
      Poll the request status until the job reaches a terminal COMPLETED state,
      re-entering itself while still IN_QUEUE or IN_PROGRESS.
    operationId: getRequestStatus
    parameters:
    - name: model_owner
      in: path
      value: $inputs.modelOwner
    - name: model_name
      in: path
      value: $inputs.modelName
    - name: request_id
      in: path
      value: $steps.submitJob.outputs.requestId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      status: $response.body#/status
    onSuccess:
    - name: completed
      type: goto
      stepId: fetchResult
      criteria:
      - context: $response.body
        condition: $.status == "COMPLETED"
        type: jsonpath
    - name: stillRunning
      type: goto
      stepId: pollStatus
      criteria:
      - context: $response.body
        condition: $.status == "IN_QUEUE" || $.status == "IN_PROGRESS"
        type: jsonpath
  - stepId: fetchResult
    description: >-
      Retrieve the final inference output for the completed request.
    operationId: getRequestResult
    parameters:
    - name: model_owner
      in: path
      value: $inputs.modelOwner
    - name: model_name
      in: path
      value: $inputs.modelName
    - name: request_id
      in: path
      value: $steps.submitJob.outputs.requestId
    successCriteria:
    - condition: $statusCode == 200
    outputs:
      result: $response.body
  outputs:
    fileUrl: $steps.initiateUpload.outputs.fileUrl
    requestId: $steps.submitJob.outputs.requestId
    result: $steps.fetchResult.outputs.result

Work with this as data

Every workflow here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for arazzo workflows

4 MCP tools reach this
  • find_arazzoBrowse and filter every workflow in the catalog.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This workflow
curl "https://apis.io/api/v1/arazzo/fal-ai-upload-then-inference-workflow"
All arazzo workflows
curl "https://apis.io/api/v1/arazzo?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.