ImageStep · Schema

JobRequest

What to run and on what: one of `op`, `presetId` or `steps` (or a raw `type`), the inputs, and where the outputs go. The same body prices it with `?dryRun=true`.

AutomationAIOpsDeterministic OpsSDKCLI

Properties

Name Type Description
op string An op name — one entry of GET /api/v1/ops, the catalogue every client enumerates. When set, `type` / `presetId` / `preset` are derived from it and `parameters` carries the op's parameters; the dry run
variants array Run the op once per entry, producing one asset each — the whole set of social sizes from one call. Each entry is {name, parameters}; the parameters are merged over the top-level ones, and each name mu
type string Job type. `chain` is what several segments run as — a preset's or inline `steps` — and is derived from them; asked for on its own it is refused.
templateId string render_template: the template to render — an id, or `id@version` to pin one version. May also be given as `parameters.templateId`.
items array render_template: one object of template variables per output image (≤ 500). May also be given as `parameters.items`.
assetIds array Your assets to run on — one item per id, times the `variants`. Required unless the op reads no image (`requiresAssets: false` in GET /api/v1/ops) or the job is a render. Every id must be yours: one th
imageCount integer Dry run only (`?dryRun=true`): images you have not stored yet, priced as that many more `assetIds` — one item each, times the `variants` — so the price can be asked before anything is uploaded. Beside
wait integer Hold the response until the job is terminal, for at most this many seconds — capped at 60 (a larger value is clamped, not refused). A job of ONE item only; on a batch it is ignored and the handle come
retentionDays integer Keep the assets this job makes — and its own record — for this many days instead of your plan's retention: shorter only. More than the plan keeps is kept for the plan's time, not refused; the assets'
count integer A job with no `assetIds` that makes images from a prompt: how many to make, one item each. 1 when absent.
presetId string A saved preset to run: its slug or id, or `slug@version` / `id@version` to pin one version (GET /api/v1/presets). The preset decides the job type; `model` / `prompt` / `parameters` override its ONE AI
steps array An inline chain: the same steps a preset stores (each `{op, model?, prompt?, parameters?}` or `{operation, params}`), checked as a preset's are and run once without saving one. Sent instead of `op` or
subjects array With `steps` only: the subjects a preset stores — reference images plus the locked words, applied to every `generate` / `edit` step, with `{{subject.}}` in a prompt expanding to the descriptor.
model string The model an AI op runs on — an id from GET /api/v1/ai-models whose `categories` include the op's `modelCategory`; any other is `400 invalid_param` with the ones that fit in `details.allowed`. Absent,
prompt string The prompt of an AI op that takes one — required where the op's entry says `requiresPrompt`. With a preset it overrides the one AI step's prompt, and `{{subject.}}` in it expands to that subject
parameters object The op's parameters. A deterministic op's are checked against its `params` in GET /api/v1/ops, and one outside them is `400 invalid_param` naming it; an AI op's go to its model (`parameters` in GET /a
collection string Collection to put the output assets in (optional; at most 200 characters, and names starting with job: are reserved). Without one, an output made from an asset is in that asset's collection.
preset object A raw processing pipeline — registry steps, run as one pass. What an op translates into; prefer `op`, or `steps` for several.
View JSON Schema on GitHub

JSON Schema

imagestep-dev-job-request-schema.json Raw ↑
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/imagestep-dev/json-schema/imagestep-dev-job-request-schema.json",
  "title": "JobRequest",
  "description": "What to run and on what: one of `op`, `presetId` or `steps` (or a raw `type`), the inputs, and where the outputs go. The same body prices it with `?dryRun=true`.",
  "x-generated": "2026-11-12",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/imagestep-dev-openapi.json#/components/schemas/JobRequest",
  "type": "object",
  "properties": {
    "op": {
      "type": "string",
      "description": "An op name — one entry of GET /api/v1/ops, the catalogue every client enumerates. When set, `type` / `presetId` / `preset` are derived from it and `parameters` carries the op's parameters; the dry run prices it like any job."
    },
    "variants": {
      "type": "array",
      "description": "Run the op once per entry, producing one asset each — the whole set of social sizes from one call. Each entry is {name, parameters}; the parameters are merged over the top-level ones, and each name must be distinct (it is added to the output's name). Deterministic ops only — beside an AI op, `render_template` or a preset it is `400 invalid_param`; at most 20.",
      "items": {
        "type": "object",
        "additionalProperties": {}
      }
    },
    "type": {
      "type": "string",
      "description": "Job type. `chain` is what several segments run as — a preset's or inline `steps` — and is derived from them; asked for on its own it is refused.",
      "enum": [
        "ai-generate",
        "ai-edit",
        "parse",
        "process",
        "render",
        "chain"
      ]
    },
    "templateId": {
      "type": "string",
      "description": "render_template: the template to render — an id, or `id@version` to pin one version. May also be given as `parameters.templateId`."
    },
    "items": {
      "type": "array",
      "description": "render_template: one object of template variables per output image (≤ 500). May also be given as `parameters.items`.",
      "items": {
        "type": "object",
        "additionalProperties": {}
      },
      "maxItems": 500,
      "minItems": 0
    },
    "assetIds": {
      "type": "array",
      "description": "Your assets to run on — one item per id, times the `variants`. Required unless the op reads no image (`requiresAssets: false` in GET /api/v1/ops) or the job is a render. Every id must be yours: one that is not is `404 asset_not_found`, before anything is created.",
      "items": {
        "type": "string"
      },
      "maxItems": 10000,
      "minItems": 0
    },
    "imageCount": {
      "type": "integer",
      "format": "int32",
      "description": "Dry run only (`?dryRun=true`): images you have not stored yet, priced as that many more `assetIds` — one item each, times the `variants` — so the price can be asked before anything is uploaded. Beside `assetIds` it adds to them, and those are still checked. A submit needs the images themselves as `assetIds`: without `dryRun`, or on a job that reads no image (a render), it is `400 invalid_param`. At most 10000 together with `assetIds`.",
      "maximum": 10000,
      "minimum": 1
    },
    "wait": {
      "type": "integer",
      "format": "int32",
      "description": "Hold the response until the job is terminal, for at most this many seconds — capped at 60 (a larger value is clamped, not refused). A job of ONE item only; on a batch it is ignored and the handle comes back at once. Terminal inside the window → 200 with the finished job; still running → 202 with the same handle, and GET /api/v1/jobs/{id}?wait= waits again. Ignored on a dry run."
    },
    "retentionDays": {
      "type": "integer",
      "format": "int32",
      "description": "Keep the assets this job makes — and its own record — for this many days instead of your plan's retention: shorter only. More than the plan keeps is kept for the plan's time, not refused; the assets' `expiresAt` says what was stamped. Absent: the plan's retention.",
      "minimum": 1
    },
    "count": {
      "type": "integer",
      "format": "int32",
      "description": "A job with no `assetIds` that makes images from a prompt: how many to make, one item each. 1 when absent.",
      "maximum": 10,
      "minimum": 1
    },
    "presetId": {
      "type": "string",
      "description": "A saved preset to run: its slug or id, or `slug@version` / `id@version` to pin one version (GET /api/v1/presets). The preset decides the job type; `model` / `prompt` / `parameters` override its ONE AI step, and are refused by a preset that has none or several."
    },
    "steps": {
      "type": "array",
      "description": "An inline chain: the same steps a preset stores (each `{op, model?, prompt?, parameters?}` or `{operation, params}`), checked as a preset's are and run once without saving one. Sent instead of `op` or `presetId`; `model`, `prompt` and `parameters` go on the step. The job records them.",
      "items": {
        "$ref": "#/$defs/PresetStep"
      }
    },
    "subjects": {
      "type": "array",
      "description": "With `steps` only: the subjects a preset stores — reference images plus the locked words, applied to every `generate` / `edit` step, with `{{subject.<name>}}` in a prompt expanding to the descriptor. Checked as a preset's are (your own DONE assets, at most 4 subjects, and a generate or edit step to read them). The job records them.",
      "items": {
        "$ref": "#/$defs/Subject"
      }
    },
    "model": {
      "type": "string",
      "description": "The model an AI op runs on — an id from GET /api/v1/ai-models whose `categories` include the op's `modelCategory`; any other is `400 invalid_param` with the ones that fit in `details.allowed`. Absent, the op's `defaultModel`. With a preset it overrides the preset's one AI step."
    },
    "prompt": {
      "type": "string",
      "description": "The prompt of an AI op that takes one — required where the op's entry says `requiresPrompt`. With a preset it overrides the one AI step's prompt, and `{{subject.<name>}}` in it expands to that subject's descriptor."
    },
    "parameters": {
      "type": "object",
      "additionalProperties": {},
      "description": "The op's parameters. A deterministic op's are checked against its `params` in GET /api/v1/ops, and one outside them is `400 invalid_param` naming it; an AI op's go to its model (`parameters` in GET /api/v1/ai-models). With a preset they replace its one AI step's parameters."
    },
    "collection": {
      "type": "string",
      "description": "Collection to put the output assets in (optional; at most 200 characters, and names starting with job: are reserved). Without one, an output made from an asset is in that asset's collection."
    },
    "preset": {
      "$ref": "#/$defs/PipelineData",
      "description": "A raw processing pipeline — registry steps, run as one pass. What an op translates into; prefer `op`, or `steps` for several."
    }
  },
  "$defs": {
    "PipelineData": {
      "type": "object",
      "description": "An inline processing pipeline: a name and the registry steps a process job runs.",
      "properties": {
        "name": {
          "type": "string"
        },
        "pipeline": {
          "type": "array",
          "items": {
            "$ref": "#/$defs/PipelineStep"
          }
        }
      }
    },
    "PipelineStep": {
      "type": "object",
      "properties": {
        "operation": {
          "type": "string"
        },
        "params": {
          "type": "object",
          "description": "The registry step's arguments"
        },
        "disabled": {
          "type": "boolean"
        }
      }
    },
    "PresetStep": {
      "type": "object",
      "description": "A preset step: either an L1 op from GET /api/v1/ops — {op, model?, prompt?, parameters?} — or a processing-registry step — {operation, params} — for what no op covers. Never both.",
      "properties": {
        "op": {
          "type": "string",
          "description": "An op from GET /api/v1/ops (kind ai or deterministic)."
        },
        "model": {
          "type": "string",
          "description": "AI steps: the model; the op's default when absent."
        },
        "prompt": {
          "type": "string",
          "description": "AI steps: the prompt. {{subject.<name>}} expands to that subject's descriptor."
        },
        "parameters": {
          "type": "object",
          "additionalProperties": {},
          "description": "The op's parameters. A deterministic op's are checked against its catalogue contract when the steps are written, and so are `analyze`'s bounds; an AI image op's go to the model as sent."
        },
        "operation": {
          "type": "string",
          "description": "A processing-registry key (deterministic only), for steps no op covers."
        },
        "params": {
          "type": "object",
          "description": "That registry step's arguments."
        }
      }
    },
    "Subject": {
      "type": "object",
      "description": "A recurring character, product or location: reference images plus the locked words for it.",
      "properties": {
        "name": {
          "type": "string",
          "description": "Lowercase handle (`[a-z0-9][a-z0-9_-]{0,39}`, unique among the subjects), referenced in a prompt as {{subject.<name>}}."
        },
        "referenceAssetIds": {
          "type": "array",
          "description": "Your own DONE asset ids showing this subject. They pin the geometry.",
          "items": {
            "type": "string"
          }
        },
        "descriptor": {
          "type": "string",
          "description": "The locked description — colour, material, markings — at most 300 characters. Text pins what an image cannot show."
        }
      }
    }
  }
}

Work with this as data

Every JSON Schema 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 schemas

4 MCP tools reach this
  • find_json_schemasBrowse and filter every JSON Schema 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 JSON Schema
curl "https://apis.io/api/v1/json-schemas/imagestep-dev-job-request"
All schemas
curl "https://apis.io/api/v1/json-schemas?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

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.