---
title: Enhance doorbell or dashcam footage: why invideo says no
description: invideo does not enhance doorbell, CCTV or dashcam footage to read a plate or a face. It trims the clip and pulls stills for your police or insurance report.
---
invideo does not enhance doorbell, CCTV, security camera or dashcam footage to read a license plate, a number plate or a face. Its upscalers make a video look sharper by inventing detail, so a plate or a face they draw is a guess, not what the camera recorded. What invideo does is help you send the footage you have: a short trimmed clip, clear stills of the moments that matter, and a contact sheet, ready for the police or your insurer.

Use invideo for this when you need a short clip and clear stills to send with a police or insurance report, and you want to keep the original file untouched.

## Quickest path

Set up your agent first with [invideo for AI agents](/agents). Then give it this prompt.

```text
I have doorbell footage of a package theft in ./doorbell.mp4. Do not
enhance or upscale it. Trim it to the theft, give me stills at the
clearest moments, and a contact sheet of the whole clip, so I can send
them to the police with the original file.
```

In a chat app, you drag the file into the project's Media panel in invideo, then name it in the chat. In a terminal, you name the file and the agent uploads it.

## What you need

Keep the original file exactly as the camera or the app saved it.

- **The original file.** Download it from the camera app at full quality. Keep a copy that nobody edits.
- **The date, the time and the place.** Your report needs them. The camera app usually shows them.
- **The moments that matter.** A rough time in the clip for each one.
- **The report's address.** The police report number, or your insurer's claim number and upload page.

## Steps

These are the steps your agent does. It does not run an upscale or an enhance step on this footage.

<Steps>
<Step title="Bring in a copy">
The agent makes a project with `new_project` and uploads a copy of the file with `start_upload` and `add_media`. You keep the original. Expected result: a sequence URL for the copy.
</Step>
<Step title="Read the file's details">
The agent runs `media` `metadata` for the file's length, size, frame rate and streams. Expected result: the details, which you can add to your report.
</Step>
<Step title="Look through the clip">
The agent runs `media` `video.frames` at times across the clip, and `video.contactSheet` for one image of frames in a grid. It runs `audio.content` if the clip has sound, to find voices or a crash. Expected result: the times of the moments that matter.
</Step>
<Step title="Pull clear stills">
For each moment, the agent runs `media` `video.extractFrameAtTime` with `time_seconds`. Each still is the frame as recorded, with nothing added. It sends an `idempotency_key` with each one. Expected result: one image sequence per moment.
</Step>
<Step title="Trim a short clip">
The agent runs `media` `video.trim` with `start_time` and `end_time` around the event, a few seconds before and after, and an `idempotency_key`. It does not stabilize, sharpen, upscale or color the clip. Expected result: a short video sequence.
</Step>
<Step title="Hand it over">
The agent gives you the URLs of the trimmed clip, the stills and the contact sheet. You download them from the project and send them with the original file, which stays the evidence. Expected result: files you attach to the report.
</Step>
</Steps>

The same job from a terminal:

```bash
invideo project new --title "Doorbell 12 May"
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo asset upload <project-url> ./doorbell.mp4
invideo media metadata <sequence-url>
invideo media video.frames <sequence-url> --at 10,14,18,22 --out ./frames
invideo media video.extractFrameAtTime <sequence-url> --time-seconds 14.2 \
  --dry-run
invideo media video.extractFrameAtTime <sequence-url> --time-seconds 14.2 \
  --max-credits <price> --idempotency-key doorbell-still-1
invideo media video.trim <sequence-url> --start-time 8 --end-time 26 \
  --dry-run
invideo media video.trim <sequence-url> --start-time 8 --end-time 26 \
  --max-credits <price> --idempotency-key doorbell-trim-1
invideo status <still-sequence-url> <trim-sequence-url> --wait
invideo notebook show <still-sequence-url> --out ./report
invideo notebook show <trim-sequence-url> --out ./report
```

Where each value comes from:

- `<name>` is the name you choose in `invideo agent register`. `INVIDEO_AS` passes it to every later command.
- `<project-url>` comes from `invideo project new`. `<sequence-url>` is the URL `invideo asset upload` returns for the copy. The stills and the trim make files, so they take that URL, not a media bin id. `<price>` is the `credits` value of each dry run.
- `<still-sequence-url>` is the URL `video.extractFrameAtTime` returns, and `<trim-sequence-url>` the URL `video.trim` returns.
- `invideo status` waits and saves nothing. `invideo notebook show` with `--out` saves each file to the folder.

The key MCP call is the full `media` call. It pulls one still at the time the face or the plate is clearest, as recorded. `<sequence-url>` is the URL `add_media` returns for the copy:

```json
{
  "url": "<sequence-url>",
  "op": "video.extractFrameAtTime",
  "time_seconds": 14.2,
  "idempotency_key": "doorbell-still-1"
}
```

The contact sheet uses `video.contactSheet` on the same sequence URL. It needs all four of `columns`, `rows`, `resolution` and `style`, and `style` is `labeled` or `plain`. A `dry_run` shows its price before it starts.

## Cost and time

Edits and exports are free. Generation and transcripts cost credits. Paid stock costs a small credit charge, or one of your workspace's iStock licenses. Your agent runs a dry run first and tells you the price before it spends anything.

- **Free:** the upload and the download.
- **Tool ops:** `metadata`, `video.frames`, `video.contactSheet`, `audio.content`, `video.extractFrameAtTime` and `video.trim`. The dry run shows its price before anything starts.
- **Costs credits:** a transcript of speech in the clip with `audio.transcript`, and the face masks with `sam_3_1_video` for the last prompt below.

The whole job takes a few minutes. See [Credits and what they cost](/account/credits) for prices.

## If something goes wrong

Most questions on this job are requests invideo turns down, and why.

| Symptom | Fix |
| --- | --- |
| `get_model` or `generate` refuses the model as not found | Models retire. Run `find_models` with the job in words, use the best match, and tell the person which model you used. |
| Exit code 6, or `status` is `held` | A safety review, not a refusal. Wait, then run `invideo status <url> --wait` again. Do not resend. If it ends `failed`, change the input the review flagged. |
| You ask to read a plate or a face that is a blur | The agent says no. An upscale invents the detail, and a made-up plate can name the wrong person. Ask the police or your insurer. |
| You ask who the person is | The agent does not identify people from footage. Send the stills to the police. |
| You ask to upscale "a little" for the report | The agent says no for evidence. It sends the frames as recorded. |
| The camera app saves a low quality copy | Download the original again at full quality from the camera app or its cloud. |
| A still is blurred by motion | The agent pulls the frames before and after with `video.frames`, and you pick the clearest. |
| CLI exit 7 | Nothing ran. Run the same command again. |
| Avoid: sending only the trimmed clip | Instead: send the original file too. Investigators need it as the camera saved it. |
| Avoid: posting an "enhanced" still online | Instead: post the frame as recorded, or none. A wrong guess can harm someone. |

## Prompts to try

Each prompt is a real version of the job.

```text
My dashcam caught a car hitting mine in ./dashcam.mp4 at about 2:10.
Trim from 2:00 to 2:30, pull stills every second of the impact, and a
contact sheet. No enhancement.
```

```text
Make a contact sheet of my CCTV clip ./yard.mp4 and tell me the times
when someone is in the frame. Do not upscale anything.
```

```text
I want to share the doorbell clip in my neighborhood group. Trim it,
and blur the faces of my neighbors who walk past, but not the
person at the door.
```

For the last prompt, the agent masks the neighbors with `sam_3_1_video` or `object_track`, then blurs them with `track_matte_key` and `gaussian_blur`, priced first. It does not sharpen the person at the door.

## When to use something else

Forensic video enhancement and identification are jobs for the police and for the forensic lab your insurer uses. They work from the original file, record every step, and their findings stand up in a claim or in court. Give them the original file and your report number.

If the camera company holds a cloud copy, ask them for the original export too. It can have more detail than the copy on your phone.

## Related

- [Check your video before you say it is done](/how-to/check-your-video)
- [Know the cost before you spend](/how-to/cost-before-you-spend)
- [MCP tools](/reference/mcp-tools)
- [Security and data](/account/security-and-data)
- [Make a video with ChatGPT, Claude or Gemini](/how-to/personal/with-chatgpt-claude-gemini)