Personalized Outreach Video Generator – AI Voice Clone avatar

Personalized Outreach Video Generator – AI Voice Clone

Pricing

from $0.99 / delivered video

Go to Apify Store
Personalized Outreach Video Generator – AI Voice Clone

Personalized Outreach Video Generator – AI Voice Clone

One recording. Hundreds of personalized videos. An AI voice clone greets each prospect by name, lip-synced, their website on screen. Built for cold email and LinkedIn outreach and video prospecting. $1.25 per delivered video, $0.99 on Business. Failed or degraded renders are never charged.

Pricing

from $0.99 / delivered video

Rating

0.0

(0)

Developer

Outvo

Outvo

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

7 days ago

Last modified

Share

Turn any lead list into personalized outreach videos

Record one short video of yourself — "Hey there, I loved what you're building" — and this Actor turns it into hundreds of videos where your own voice says each prospect's name — cloned from that one recording — and their website scrolls on screen next to your face. It is video prospecting at scale: the personalization that used to mean recording Looms by hand, produced from one take. Feed it a lead list, or chain it straight after any scraper Actor (LinkedIn, Google Maps, Apollo) and every scraped row becomes a personal video with a hosted, trackable link — ready to drop into a cold email or a LinkedIn DM. Agencies and SDR teams use one base recording per sales outreach campaign; all of their prospects get their own copy, each with an AI voice clone of the presenter rather than a synthetic narrator.

You pay only for videos that are actually delivered. Failed renders are free. Imperfect (degraded) renders are free.

What you get

  • One MP4 per recipient: your recording, their first name spliced in with correct prosody (not a bare name — a full carrier phrase, e.g. "Hey Sarah"), and their website recorded and shown on screen next to you.
  • A hosted, shareable link per video (shareableUrl) that stays live for 60 days.
  • A dataset row per recipient with the video, status, and whether it was charged — native Output tab, no post-processing needed.

Watch a real result (15s)

That video was produced by this Actor, start to finish, from one recording: the recipient's own website is captured on screen while the presenter appears lip-synced alongside it, then the video returns to full frame. It is one recipient's copy — every other person on the list gets their own.

Curious what goes in? Here is the example base video it was made from — a single plain take, no editing, nothing personalized yet.

Video prospecting for cold email and LinkedIn

Chain this Actor after any scraper and the whole motion runs unattended: a LinkedIn, Google Maps, or Apollo Actor produces the rows, this one turns each row into a personal video, and the shareableUrl column drops straight into your sequencer. The prospect opens a link and watches you say their name in front of their own homepage — from a recording you made once.

That is the difference between personalization and a merge field. SDR teams use it for first touch and for follow-up; agencies run one base recording per client campaign.

How it compares to HeyGen, Tavus, and recording Looms by hand

  • Avatar generators (HeyGen, Tavus, Synthesia) synthesize a presenter. This Actor does not generate a face — it splices a personalized greeting into your real recording, in your own cloned voice, and lip-syncs only that greeting. What the prospect watches is you.
  • Recording Looms by hand is the thing this replaces. It works, and it stops working somewhere around twenty a day. One take here covers the whole list.
  • This Actor is not affiliated with any of the above. The comparison is offered because it is the question every buyer asks first.

How it works

  1. Record once. A short video of yourself saying a greeting with a placeholder name — "Hey there, I loved what you're building" — uploaded anywhere reachable by URL. See an example base video (44s) — one take, no editing, nothing personalized yet; that is all it takes. Full guide: ./docs/recording-your-base-video.md, and ./docs/hosting-your-video.md if it only exists on your computer.
  2. Give it a list. Paste recipients as JSON, or chain this Actor after any scraper (see below) and map its columns. Full guide: ./docs/recipient-lists-and-chaining.md.
  3. Get videos back. Each row becomes a render: the greeting is re-synthesized as text-to-speech in a clone of your own voice, lip-synced to your face at the splice point, and composited with the website capture. Completed videos land in this run's dataset with a shareable link.

The one rule that matters when recording

Your placeholder must sit inside a carrier micro-phrase — say "Hey there", which becomes "Hey Sarah" — and must never be a bare name on its own. The surrounding words give the splice the natural mouth movement and intonation of real speech; a bare name recorded in isolation sounds pasted-in on every single video. The ./docs/recording-your-base-video.md covers this and the other failure modes before you spend anything.

Who this is for

  • Founder-led sales. Your face and your voice are the reason the video works; this keeps both while removing the part where you record two hundred takes.
  • SDRs and outbound teams doing video prospecting at volume — personalized video at scale, from the lead list you already have, without a per-seat contract.
  • Agencies running cold outreach video for several clients: one base recording per client, one run per campaign, billed only on what shipped.

Common shape: a scraper builds the list, this Actor turns each row into a cold outreach video, and the shareable link goes into whatever channel you already send from.

Chain it after a scraper

Point Input dataset at a previous run's dataset and set Field mapping to match its columns. For example, chaining after HarvestAPI's LinkedIn Profile Scraper, whose output rows carry firstName, linkedinUrl, and a currentPosition array:

{
"firstName": "firstName",
"company": "currentPosition.0.companyName",
"url": "linkedinUrl"
}

Dot paths reach nested fields and array elements. Every scraped row becomes a personalized video automatically. A bad row (missing name, a broken URL) costs that one row, not the run — the rest of the list still renders.

Pricing: pay only for delivered videos

$1.25 per delivered video — $0.99 if you are on an Apify Business or Enterprise plan. The rate follows your own Apify subscription; nothing to apply for.

Apify's pricing table normalizes recurring events to a per-1,000 display, so this shows as "$1,250.00 / 1,000" (or "$990.00 / 1,000" on Business+). That is the same per-video price, not a bundle and not a minimum. You are never pre-buying a thousand of anything; each delivered video is billed individually.

Your Apify planPer delivered video
Free, Starter, Scale$1.25
Business, Enterprise$0.99
  • Failed and degraded videos are always free. A "degraded" video still plays (it's watchable) but fell short of the full pipeline — Outvo does not charge for output it isn't confident in.
  • Skipped rows are free. A row with a missing name or an invalid URL is reported as skipped_invalid and never submitted.
  • Daily capacity: the marketplace has a shared daily rendering ceiling and a per-account daily limit. If the ceiling is reached mid-run, remaining rows are reported as deferred_daily_cap (never submitted, never charged) and the run still finishes successfully — re-run the deferred rows tomorrow.
  • Apify free-plan accounts draw from a smaller shared daily pool. When that pool is used up, remaining rows defer the same way (free, deferred_daily_cap) with a note naming the free-plan pool; upgrade to a paid Apify plan to render without the free-plan limit, or re-run after midnight UTC.

A worked example

A 40-lead list where 3 rows have no usable website URL and 2 renders come back degraded:

RowsOutcomeCost
3skipped_invalid — missing URLs, never submitted$0.00
2degraded — watchable but imperfect, never charged$0.00
35completed — delivered with shareable links35 × $1.25 = $43.75

Total for the run: $43.75 on Free/Starter/Scale, or $34.65 on Business+. Every dataset row states whether it was charged.

Refunds

Failed and degraded renders are never charged in the first place — that is the billing invariant, not a refund policy. If a video was delivered as completed and you consider it unsatisfactory, report it through the Issues tab on this Actor's page; each case is reviewed individually and resolved within 1–2 business days.

Prefer to render against your own Outvo plan instead of paying per video here? Set Your own Outvo API key (Limits & advanced) with a key from outvo.io → Settings → API Keys.

How long does a run take?

  • ~2–4 minutes per video is typical. Videos render with real TTS, lip-sync, and a live website recording — this is compute, not templating.
  • A 100-row list takes hours. That is expected. The run does not need your browser open — close the tab and come back to a full dataset.
  • Do not lower the run timeout. Long lists need the default headroom (≥ 21600 seconds); a lowered timeout guarantees a timed-out — and therefore failed — run on any large list. Already-delivered rows are kept, but nothing in flight survives.

Input reference

FieldDescription
videoUrlYour recording's public URL. Required.
placeholderWordThe word in your recording that gets replaced with each recipient's name. Required.
recipientsInline recipient list as JSON. Leave empty when chaining a dataset.
inputDatasetIdA previous Actor run's dataset to chain from.
fieldMappingMaps Outvo fields to your dataset's column names.
pipLayoutWhere the recipient's website overlay appears, or none for talking-head only.
pipDurationSecondsHow long the website overlay stays on screen.
recordingModedesktop or mobile layout for the website recording.
missingUrlBehaviorskip (default) or renderWithoutPip for rows with no URL.
maxVideosSafety cap for this run (1-200). Rows past the cap are returned as deferred_max_videos — never silently dropped.
outvoApiKeyOptional — bring your own Outvo API key instead of paying per video.

Full descriptions and defaults are in the Input tab — they're written to match this table exactly (congruent naming is part of what the Apify quality score rewards).

Output reference

One dataset item per recipient row:

FieldMeaning
statuscompleted, degraded, failed, skipped_invalid, deferred_daily_cap, deferred_charge_limit, deferred_max_videos, or cancelled.
chargedWhether this row was billed. Always false unless status: "completed".
firstNameThe recipient this row belongs to.
companyThe recipient's company, when provided.
urlThe recipient's website or profile URL used for the on-screen recording.
shareableUrlThe hosted, shareable video link.
videoUrlDirect MP4 URL.
thumbnailUrlThumbnail image.
renderIdOutvo's internal render id, for support/troubleshooting.
noteHuman-readable explanation for anything other than a clean completed.
chargeErrorWhy a completed render was not charged (e.g. the run's "Max total charge" was reached, or billing failed). null on charged rows. An uncharged completed row has its video links withheld — you are never billed for it, and never given an unbilled video.

What this Actor does not do

Worth knowing before you run it, so nothing here is a surprise on the far side of a charge:

  • It does not send anything. You get hosted links and MP4s back. Email, LinkedIn, wherever it goes — that stays in the tool you already send from.
  • It does not build your list. Bring recipients as JSON, or chain a scraper Actor in front of it (below).
  • It does not synthesize an avatar. No AI avatar, no talking photo generated from a still, no digital twin. It lip-syncs a real recording of your real face, which is exactly why it needs you to record one.
  • It does not translate or dub. Greetings come back in the language you recorded in.
  • It does not edit video. No trimming, no captions, no thumbnail generation.

Limitations

  • Every dataset row ends in one of eight statuses. completed (delivered and charged), degraded (watchable but below the full pipeline's bar — free), failed (no video — free), skipped_invalid (bad input row, never submitted — free), deferred_daily_cap (capacity reached, never submitted — free; re-run tomorrow), deferred_charge_limit (the run's "Max total charge" was reached — free, never submitted; raise the limit and re-run), deferred_max_videos (the run's "Max videos" ceiling was already reached — free, never submitted; raise it or re-run with the remaining rows), and cancelled (run aborted while this row was in flight — free). charged is never true unless status is completed — and in the rare case a completed render could not be charged, the row carries a chargeError, its video links are withheld, and you pay nothing.
  • Some websites cannot be recorded. Pages behind a login wall or aggressive bot protection may fail to load in the recorder; those rows come back failed or degraded, and are free either way. Use missingUrlBehavior / pipLayout: none for talking-head-only videos when the URL isn't the point.
  • Language coverage: greetings are generated in the language of your recording, auto-detected, across 29 supported languages (English, Spanish, Portuguese, French, German, Italian, Japanese, Chinese, Korean, Hindi, and more). A recording in an unsupported language fails validation rather than producing a wrong-language splice.
  • Shareable links expire after 60 days. Download the MP4s (videoUrl) if you need them beyond that.
  • Daily capacity is shared. A marketplace-wide daily ceiling and a per-account daily limit apply; rows beyond them defer, free, to the next day. Each single run is additionally capped by maxVideos (1–200, default 25).
  • Aborting a run cancels everything in flight; only videos already delivered (and therefore already charged) are kept. Nothing in flight is billed.

Works well with these Actors

Feed this Actor from any scraper whose rows carry a name and a URL:

Chain any of them with Input dataset + Field mapping — see ./docs/recipient-lists-and-chaining.md for worked mappings.

FAQ & troubleshooting

What counts against the daily cap? The marketplace has a shared capacity ceiling across every user of this Actor, plus a per-account daily limit. Rows deferred by either show status: "deferred_daily_cap" and were never submitted or charged — just re-run them.

What does "degraded" mean, and why is it free? A render that completed but fell short somewhere in the pipeline (e.g. a website recording that didn't load cleanly). It's still a real, watchable video — Outvo just doesn't charge for output it isn't confident represents your best result.

A recipient's website wouldn't record — what happens to that row? It fails independently; that one row is failed (and free), the rest of the run is unaffected.

How does "Max total charge" interact with pricing? It's an Apify run setting this Actor actively respects: rows that would push the run past your limit are never submitted and come back as deferred_charge_limit, free, with a note telling you to raise the limit. Leave it unset for no extra ceiling beyond maxVideos, or set it to cap total spend for a single run — a capped run still finishes successfully.

What happens if I abort a run? In-flight renders are cancelled; only videos already delivered (and therefore already charged) are kept. Nothing in flight is billed.

My video is a local file — where do I host it? ./docs/hosting-your-video.md walks through Google Drive, S3, and Dropbox, including the classic mistake (a Drive share link is an HTML page, not an MP4).

Support

  • Issues tab on this Actor's page — the fastest route for anything about a specific run or video; include the renderId from the dataset row when it's about one video.
  • Expect a response within 1–2 business days.
  • Failed and degraded renders are never charged; a delivered video you consider unsatisfactory is reviewed case by case through the same Issues tab, within the same 1–2 business days.

About Outvo

Outvo turns a base recording and a recipient list into individually personalized outreach videos — TTS-matched greetings, lip-sync, and optional live website recordings. This Actor is the zero-setup way to use it from inside Apify, chained straight off whatever scraper already built your list — or bring your own API key from outvo.io to render against your Outvo plan.