{
  "_doc": "Expected API parameter schemas per model endpoint. The audit harness validates that every request body contains exactly these keys — no more, no less (except optional keys marked as such). Any mismatch = FAIL, not silent drop.",
  "fal-ai/wan/v2.7/image-to-video": {
    "required": ["prompt", "image_url", "duration", "resolution", "enable_prompt_expansion", "enable_safety_checker"],
    "optional": ["end_image_url", "negative_prompt", "seed", "audio_url", "video_url"],
    "forbidden": ["tail_image_url", "image_tail", "start_image_url", "multi_shots", "reference_image_urls"],
    "type_checks": {
      "duration": "int",
      "enable_prompt_expansion": "bool",
      "enable_safety_checker": "bool"
    }
  },
  "fal-ai/wan/v2.7/reference-to-video": {
    "required": ["prompt", "duration", "resolution", "enable_safety_checker"],
    "optional": ["reference_image_urls", "reference_video_urls", "multi_shots", "negative_prompt", "seed", "aspect_ratio"],
    "forbidden": ["image_url", "end_image_url", "tail_image_url", "image_tail", "enable_prompt_expansion"],
    "type_checks": {
      "duration": "int",
      "multi_shots": "bool"
    }
  },
  "fal-ai/kling-video/v3/standard/image-to-video": {
    "required": ["prompt", "duration", "aspect_ratio"],
    "optional": ["image_url", "end_image_url", "negative_prompt", "cfg_scale", "generate_audio", "elements", "multi_prompt", "shot_type"],
    "forbidden": ["tail_image_url", "start_image_url"],
    "type_checks": {
      "duration": "str"
    },
    "notes": "start_image_url is for O3 ref endpoints only. V3 I2V uses image_url."
  },
  "fal-ai/kling-video/v3/standard/text-to-video": {
    "required": ["prompt", "duration", "aspect_ratio"],
    "optional": ["negative_prompt", "cfg_scale", "generate_audio"],
    "forbidden": ["image_url", "end_image_url", "tail_image_url", "image_tail"],
    "type_checks": {
      "duration": "str"
    }
  }
}
