---
title: Make a video invitation for a birthday, wedding, baby shower or gender reveal
description: A vertical video invitation, or evite, with your photos, the event details, music and a QR code that opens your RSVP page.
---
You get a vertical video invitation, also called a video invite or an evite, for a birthday, a wedding, a baby shower, a gender reveal or a save the date. It shows your photos or a generated scene, the names, the date, the place and a QR code for the RSVP. You send the MP4 in a chat or by email, and guests watch it on their phones.

Use invideo for this when you want to change the date, the venue or a name later: the invitation stays an editable timeline, and a changed invitation is one export away.

## Quickest path

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

```text
Make a vertical video invitation for Maya's 30th birthday. Use the
photos in ./maya. Show "Maya turns 30", "Saturday 14 June, 7 pm",
"The Garden Room, 12 Hill Street" and a QR code for
https://example.com/rsvp. Add happy music. Show me frames before you
export, and tell me the price before you generate anything.
```

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

## What you need

Collect these before you start. The text matters most, so check the spelling of every name.

- **The event details.** Who, what, when, where, and the dress code if there is one.
- **The RSVP link.** A web page or form for replies. Links in a video are not clickable, so the agent turns the link into a QR code image.
- **Photos or clips.** JPG, PNG, MP4 or MOV from your phone. Or ask for a generated background scene instead.
- **The shape.** Vertical 9:16 for phones. Ask for 1:1 if you post it in a feed.
- **The mood.** Elegant, playful, cute, a theme color.

Characters from a film, a show or a game, such as a princess, a superhero or a cartoon dog, belong to their owners, and some image models decline them. Ask for an original look in the same spirit, like "a friendly dinosaur in green and gold".

## Steps

Your agent works in your invideo project and tells you what it made at each step.

<Steps>
<Step title="Make the timeline and bring in your photos">
The agent makes a project with `new_project`, a 9:16 timeline with `new_timeline`, and a branch with `timeline_history`, so the main timeline stays as it is. For each local file, it calls `start_upload`, sends the bytes to the `upload_url`, then calls `add_media` with the `upload_id` on the branch URL. Expected result: a branch URL, and one sequence URL and media bin id per photo.
</Step>
<Step title="Make the QR code">
The agent makes a QR code image for your RSVP link with its own tool, like a QR code library on your machine, and saves it as a PNG. An image model can redraw the squares, so the agent does not make the code with one. Then it brings the PNG in with `start_upload` and `add_media`. Expected result: a QR code in the media bin.
</Step>
<Step title="Add a background, if you want one">
With no photos, the agent finds a scene with `search_library` in `stock_video`, or generates one. To generate, it runs `find_models` with the job in words, like "vertical party background image", and `get_model` on its pick. A good pick is `nanobanana_pro`. Your agent can search for others with `find_models`. It calls `generate` with a `prompt`, `aspect_ratio` 9:16 and `dry_run: true`, and tells you the price. For a price of 1 credit or more it waits for your yes. Then it calls `generate` with `max_credits` set to that price and an `idempotency_key`. Expected result: a background sequence URL, which the agent reads with `read`, never with a second `generate`.
</Step>
<Step title="Lay out the invitation">
The agent places the photos with `place_media` or `insert_media`, fills the frame with `fill_frame`, and adds each line of text with `add_text`. It puts the QR code on a track above with `place_media` and sizes it with `set_zoom` and `set_position`. Fades come from `add_edge_transition` with the `fade` transition. Expected result: a new `state_token` and the clips on the timeline.
</Step>
<Step title="Add music">
The agent searches `stock_music` with `search_library`, plays you the previews, and adds your pick with `add_media` and `stock`. It fades the end with `set_audio_fades`. Expected result: music on an audio track that ends with the video.
</Step>
<Step title="Check it on a phone screen">
The agent runs `capture` at the title, the details and the QR code, and `check_timeline`. You scan the QR code frame on your screen with your phone. Expected result: every line is readable, no text sits at the edge, and the code opens your RSVP page.
</Step>
<Step title="Export">
The agent runs `export` with `format` video and an `idempotency_key`, then reads the export card until its status is `completed`. In a terminal, it saves the file with `invideo notebook show` on the card's URL. Expected result: a 1080p MP4 you download and send.
</Step>
</Steps>

The same job from a terminal:

```bash
invideo project new --title "Maya 30 invite"
invideo agent register <project-url> --name <name>
export INVIDEO_AS=<name>
invideo edit new <project-url> --name "Invite" --width 1080 --height 1920
invideo asset upload <edit-url> ./maya/*.jpg ./rsvp-qr.png
invideo library search <project-url> --library stock_music \
  --query "happy party"
invideo asset add <project-url> --stock <id>
invideo gen models <project-url> --query "vertical party background image"
invideo gen model <project-url> --model nanobanana_pro
invideo gen run <page-url> --model nanobanana_pro --dry-run \
  -i prompt="warm garden party at dusk, string lights" -i aspect_ratio=9:16
invideo gen run <page-url> --model nanobanana_pro \
  --max-credits <price> --idempotency-key maya-bg-1 \
  -i prompt="warm garden party at dusk, string lights" -i aspect_ratio=9:16
invideo edit show <edit-url> --json
invideo edit change <edit-url> --timeline T1 --token <state_token> \
  --operations @ops.json
invideo edit capture <edit-url> --at 1,5,9 --out ./frames
invideo edit check <edit-url>
invideo edit export <edit-url> --format video --quality 1080 --json
invideo status <card-url> --wait
invideo notebook show <card-url> --out ./out
```

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`, and `<edit-url>` from `invideo edit new`. `<id>` comes from `library search`.
- The `gen` lines are only for a generated background. `<page-url>` is a notebook page; `invideo notebook show <project-url>` lists them. `<price>` is the dry run's `.estimated_credits`. The paid run returns a thread URL; `invideo notebook show` on it lists the image's sequence URL once it lands.
- `<state_token>` comes from `invideo edit show`. `ops.json` holds a bare list of operations, like the `operations` list in the call below.
- `<card-url>` is `.sequences[0]` of the export result. `invideo status` waits and saves nothing. `invideo notebook show` saves the file as `./out/export.mp4`.

The key MCP call is the full call. It places the QR code and the details text in one `edit_timeline` call. `<branch-url>` is the `branch_url` that `timeline_history` returns. The `<state_token>` and the ids, like `m4` for the QR code, come from `get_timeline`. Times ending in `_f` are frames at the timeline's rate.

```json
{
  "url": "<branch-url>",
  "timeline_id": "T1",
  "expected_state_token": "<state_token>",
  "operations": [
    { "op": "place_media", "asset": "m4", "track": "V2", "at_f": 240,
      "source_start_seconds": 0, "source_end_seconds": 5,
      "mode": "place_on_top", "linked_audio": false },
    { "op": "add_text", "track": "V3", "start_f": 0, "end_f": 390,
      "text": "Saturday 14 June, 7 pm\nThe Garden Room",
      "style": { "font_size": 72, "align": "center",
                 "color": "#ffffff", "shadow": true } }
  ]
}
```

## 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:** uploads, the layout, text, transitions, the QR code your agent makes, frame checks and the export.
- **Costs credits:** paid stock music or stock video with `add_media`, and any generated background with `generate`.

A photo invitation takes a few minutes. A generated background adds the time the model takes. See [Credits and what they cost](/account/credits) for prices.

## If something goes wrong

Most problems are the QR code, text at the edge, or a character a model declines.

| 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. |
| The QR code does not scan | Make it larger with `set_zoom`, and keep it on a plain background. Scan the `capture` frame again. |
| The timeline is not 9:16 | The agent sets the size with `set_timeline_settings`, then `capture` again. |
| Text is cut at the edge of a phone | Move it in with `set_position`, and `capture` again. |
| A model declines a character | The provider does not allow that character. Ask for an original look in the same colors. |
| `edit_timeline` refused as a conflict | The timeline changed since the read. Read it with `get_timeline` and send again with the new token. |
| CLI exit 5 | A credit limit. Use your own photos, or check your balance. |
| CLI exit 7 | Nothing ran. Run the same command again. |
| Avoid: putting the RSVP link as text only | Instead: add the QR code, and paste the link in the message you send with the video. |
| Avoid: saying done without looking | Instead: `capture` frames and scan the QR code first. |

## Prompts to try

Each prompt is a different kind of invitation.

```text
Make a 15 second gender reveal teaser, vertical. Pink and blue
balloons, the words "Boy or girl? Find out 3 May" and a QR code for
our RSVP form. Soft music. No characters from films.
```

```text
Make an elegant wedding save the date from our engagement photos in
./photos. Gold text, "Priya and Sam, 20.09.2027, Jaipur", a slow fade
between photos, and a QR code for our wedding website.
```

```text
Make a baby shower invite in 1:1 for Instagram and 9:16 for WhatsApp,
one branch each. Same text, same QR code, gentle music.
```

## When to use something else

A video file cannot hold a link you tap or a reply button. Use your RSVP tool, like a form or an event page, for the replies, and send its link with the video.

For a printed card, use a design tool and export a PDF. invideo exports video, not print files.

## Related

- [Make a birthday montage from photos and clips](/how-to/personal/birthday-montage)
- [Make a photo slideshow for any occasion: anniversary, graduation, retirement, baby's first year, family recap](/how-to/personal/occasion-slideshow)
- [Make a personalized video message from Santa or an AI presenter](/how-to/personal/personalized-message-video)
- [Make a video with ChatGPT, Claude or Gemini](/how-to/personal/with-chatgpt-claude-gemini)
- [Check your video before you say it is done](/how-to/check-your-video)