{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/craterview-ai/json-schema/craterview-ai-job-submission-schema.json",
  "title": "JobSubmission",
  "description": "The public request body for POST /v1/jobs.",
  "x-generated": "2026-10-30",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/craterview-ai-openapi.json#/components/schemas/JobSubmission",
  "properties": {
    "model": {
      "type": "string",
      "title": "Model",
      "description": "Which model to run, by its `id` in the model catalog."
    },
    "input_key": {
      "type": "string",
      "title": "Input Key",
      "description": "Object key returned by POST /v1/uploads."
    },
    "params": {
      "additionalProperties": true,
      "type": "object",
      "title": "Params",
      "description": "Options for the model, validated against its published `params_schema`."
    },
    "webhook_url": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 2048
        },
        {
          "type": "null"
        }
      ],
      "title": "Webhook Url",
      "description": "Absolute http or https URL to receive a signed POST once the job settles. See the webhooks section for the body and its signature."
    },
    "custom_id": {
      "anyOf": [
        {
          "type": "string",
          "maxLength": 128
        },
        {
          "type": "null"
        }
      ],
      "title": "Custom Id",
      "description": "Your own identifier for this job, returned on every read of it and on the webhook. Not interpreted, not required to be unique, and not something jobs can be searched by."
    },
    "input_megapixels": {
      "anyOf": [
        {
          "type": "number",
          "maximum": 100000.0,
          "exclusiveMinimum": 0.0
        },
        {
          "type": "null"
        }
      ],
      "title": "Input Megapixels",
      "description": "The size of the file you uploaded, in megapixels (width × height ÷ 1,000,000; for a clip, one frame times the number of frames). Optional. Used only to make `eta_seconds` an estimate for your file rather than for a typical one — it does not affect the price, the queue or whether the job is accepted, all of which read the file itself."
    }
  },
  "additionalProperties": false,
  "type": "object",
  "required": [
    "model",
    "input_key"
  ]
}