{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://artifacts.apis.io/aicontentdrop-com/json-schema/aicontentdrop-com-drop-proposal-schema.json",
  "title": "DropProposal",
  "description": "Fields read from a pasted page, for a person to edit and then start a drop from. `brief` carries only the fields that cleared their threshold; `confidence` carries a number for every field that was judged, including the ones that did not clear.",
  "x-generated": "2026-11-01",
  "x-method": "derived",
  "x-generator": "derive-json-schema.py",
  "x-source": "openapi/aicontentdrop-com-openapi.json#/components/schemas/DropProposal",
  "type": "object",
  "required": [
    "proposal"
  ],
  "properties": {
    "proposal": {
      "type": "object",
      "required": [
        "source",
        "url",
        "brief",
        "confidence"
      ],
      "properties": {
        "source": {
          "type": "string",
          "enum": [
            "url"
          ]
        },
        "url": {
          "type": "string",
          "format": "uri"
        },
        "brief": {
          "$ref": "#/$defs/DropBrief"
        },
        "confidence": {
          "type": "object",
          "description": "Field name to a number between 0 and 1.",
          "additionalProperties": {
            "type": "number"
          }
        },
        "brand": {
          "type": "object",
          "properties": {
            "name": {
              "type": "string"
            },
            "value_props": {
              "type": "array",
              "items": {
                "type": "string"
              }
            },
            "cta": {
              "type": "string"
            },
            "tone": {
              "type": "string"
            }
          }
        },
        "screenshot_url": {
          "type": "string",
          "format": "uri",
          "description": "The captured page on this application's own storage."
        },
        "note": {
          "type": "string",
          "description": "One sentence when a field was dropped rather than proposed."
        }
      }
    }
  },
  "$defs": {
    "DropBrief": {
      "type": "object",
      "description": "What is being made, for what, how long, on which recipe. Every field is optional: a brief is filled in as it is settled. `reference_class` and `reference_facts` are settings, not questions: send the `facts` POST /v1/engine/analyze answered to skip the drop's own reading step, which otherwise copies that reading, or waits for it while a long clip is still being read; send a class to choose it yourself.",
      "properties": {
        "type": {
          "type": "string",
          "enum": [
            "image",
            "video"
          ]
        },
        "goal": {
          "type": "string",
          "enum": [
            "viral",
            "sales",
            "social"
          ]
        },
        "duration_s": {
          "type": "integer",
          "enum": [
            5,
            10,
            15,
            20,
            30,
            60
          ],
          "description": "Running time in seconds. A still image has none."
        },
        "lane": {
          "type": "string",
          "enum": [
            "cinematic",
            "ugc",
            "marketing",
            "drama",
            "recreate"
          ],
          "description": "Which recipe to follow. GET /v1/engine/lanes says which ones are open for this account; a closed one is refused with its reason."
        },
        "reference": {
          "type": "object",
          "description": "Where the material comes from. `upload` carries its url (for a reference read by POST /v1/engine/analyze, the `reference_url` it answered) and `template` its template id; a reference missing either is not one.",
          "required": [
            "kind"
          ],
          "properties": {
            "kind": {
              "type": "string",
              "enum": [
                "none",
                "upload",
                "template"
              ]
            },
            "url": {
              "type": "string",
              "format": "uri"
            },
            "template_id": {
              "type": "string"
            }
          }
        },
        "model": {
          "type": "object",
          "description": "A pinned model. Absent means the recipe's own default, revealed before anything is charged."
        },
        "reference_class": {
          "$ref": "#/$defs/ReferenceClass"
        },
        "reference_facts": {
          "$ref": "#/$defs/ReferenceFacts"
        }
      }
    },
    "ReferenceClass": {
      "type": "string",
      "description": "What kind of material a reference is, as the reading judged it or as the caller set it: `cel_anime` (cel anime), `western_animation` (Western animation), `3d_animation` (3D animation), `live_action` (live action), `ugc` (a creator video), `product` (a product shot), `unknown` (not sure yet). It steers how a drop directs and reviews the work.",
      "enum": [
        "cel_anime",
        "western_animation",
        "3d_animation",
        "live_action",
        "ugc",
        "product",
        "unknown"
      ]
    },
    "ReferenceFacts": {
      "type": "object",
      "description": "What was seen in a reference, in words only: no frame, thumbnail or link to the media ever appears here. An answer always carries every list, empty when nothing of that kind was seen.",
      "required": [
        "summary",
        "look",
        "frameCount"
      ],
      "properties": {
        "summary": {
          "type": "string",
          "maxLength": 600,
          "description": "The reference in a few sentences."
        },
        "shots": {
          "type": "array",
          "maxItems": 60,
          "default": [],
          "description": "One entry per shot, in order.",
          "items": {
            "$ref": "#/$defs/ReferenceShot"
          }
        },
        "cast": {
          "type": "array",
          "maxItems": 12,
          "default": [],
          "description": "The people and characters in it.",
          "items": {
            "type": "object",
            "required": [
              "key",
              "role",
              "look"
            ],
            "properties": {
              "key": {
                "type": "string",
                "maxLength": 40,
                "description": "A short handle for this person or character, the same in every shot."
              },
              "role": {
                "type": "string",
                "maxLength": 120
              },
              "look": {
                "type": "string",
                "maxLength": 400,
                "description": "How they look, in words."
              }
            }
          }
        },
        "look": {
          "type": "object",
          "required": [
            "register"
          ],
          "description": "The visual style.",
          "properties": {
            "register": {
              "type": "string",
              "maxLength": 300,
              "description": "The style in a phrase."
            },
            "palette": {
              "type": "array",
              "maxItems": 12,
              "default": [],
              "items": {
                "type": "string",
                "maxLength": 40
              }
            },
            "notes": {
              "type": "string",
              "maxLength": 400
            }
          }
        },
        "lines": {
          "type": "array",
          "maxItems": 40,
          "default": [],
          "description": "Dialogue or on-screen words heard or read, in order.",
          "items": {
            "type": "string",
            "maxLength": 200
          }
        },
        "durationSeconds": {
          "type": "number",
          "minimum": 0
        },
        "frameCount": {
          "type": "integer",
          "minimum": 0,
          "description": "How many frames were read to write this."
        }
      }
    },
    "ReferenceShot": {
      "type": "object",
      "description": "One shot of a reference, in plain words.",
      "required": [
        "index",
        "size",
        "camera",
        "action"
      ],
      "properties": {
        "index": {
          "type": "integer",
          "minimum": 0
        },
        "size": {
          "type": "string",
          "maxLength": 40,
          "description": "The shot size: close-up, medium, wide and so on."
        },
        "camera": {
          "type": "string",
          "maxLength": 120,
          "description": "What the camera does: static, slow push-in, handheld follow and so on."
        },
        "action": {
          "type": "string",
          "maxLength": 400,
          "description": "What happens in the shot."
        },
        "beatTags": {
          "type": "array",
          "maxItems": 4,
          "default": [],
          "description": "The kinds of beat the shot carries.",
          "items": {
            "type": "string",
            "enum": [
              "action",
              "camera",
              "vfx",
              "dialogue",
              "product",
              "emotion",
              "transition",
              "performance"
            ]
          }
        },
        "durationSeconds": {
          "type": "number",
          "minimum": 0
        }
      }
    }
  }
}