Get an AI video job
get_videoOne video job's current state: a SINGLE, IMMEDIATE read that waits for nothing. WHEN: only for one job's raw fields now (cost, refund, why it failed). It is not how you wait (wait_for_generation is) and not how you show a video (the create already opened the card; show_generation brings back an earlier one). Do not poll it. When the user says something failed or looks wrong, read the job and report its actual state and charges instead of arguing from memory. status is queued, processing, succeeded (url is the finished file) or failed (terminal: error.message says why). STORY EPISODES also carry story.stage: frames_review means the run WAITS FOR THE USER (show the frames, do not poll); writing_failed is TERMINAL with status: "failed" (nothing charged, cast saved: offer a fresh generate_story_video with the same cast_member_ids); at ready_to_render the episode url is only the raw stitched preview. After a render, story.render is the LATEST render's verdict: stage: "rendered" with story.render.status: "succeeded" makes story.render.url the FINAL file; failed means that render was refunded and the episode can render again. OUTPUT: tell the user the media URL and one line about it, not raw JSON or job ids.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | The job id returned by `generate_video` or `generate_story_video` (the documented way to read a story episode's stage); `list_videos` carries it too. |