Automated Job Ad Video: One Render per Open Role
Render a 34-second job ad from eight fields in your ATS. One video per requisition, the same design every time, one credit each, published before a designer opens a file.

An automated job ad video is one render per requisition, not one design project per role. Map eight fields from your ATS onto a 34-second template, POST one request when the role is published, and the video is ready before a designer opens a file. Each render costs one credit.
The finished video
This guide renders Job Ad Promo - Open Role Announcement - a 34-second 16:9 ad in seven scenes: a self-aware hook, the role reveal, the team scene, three numbered perk cards, and a full-bleed yellow Apply payoff.
Eight fields change per role and drive 35 overlays. Everything else - colour, type, timing, the copy between the fields - is identical in every render, which is the entire point.
What you need
- A Renderly API key. Create one in the dashboard under Settings → API keys.
- An ATS that fires a webhook when a requisition is published, or a sheet of open roles.
- A company logo at a URL that serves the file directly, ideally a transparent PNG, because the outro forces it to solid ink.
Step 1 - Decide whether you want one video or the same video
Search this query and you get makers. Biteable's AVA, FlexClip, Storykit and InVideo all take a job description and generate a video from it. VideoMyJob and Rezoomo do a different thing again: they put a hiring manager on camera inside a branded frame. Both are real products and neither is this one.
The difference is what varies between roles. A maker gives every opening its own copy and its own layout, so 40 roles become 40 different-looking videos, each needing a look before it ships. A template changes only the words, so the 40th render is approved by the same decision that approved the first.
That makes it a volume question, not a quality one. Four openings a year is a job for a designer. Forty, which must read as one company, is a job for a template: the design work is already done and each render is one credit.
Step 2 - Map the requisition onto eight fields
Eight fields cover the whole 34 seconds:
| Field | Scene | Comes from |
|---|---|---|
company_logo | 1 and 7 | Your brand assets, one URL |
job_title | 2 | The requisition title |
location_mode | 2 | City and working pattern, as one string |
team_name | 3 | The hiring team or department |
perk_1, perk_2, perk_3 | 4, 5, 6 | Written by hand, once per company |
apply_url | 7 | A short vanity link, not the ATS URL |
company_logo is one field used twice. Scene 1 renders it as supplied on the
dark open; scene 7 applies brightness(0), so the same file knocks out to solid
ink on the yellow Apply frame. One URL covers both, whatever colour the logo is.
The perks are the only fields that are not a lookup, and they carry the personality. Write three for the company, not three per role, and keep them true: "No-meeting Wednesdays. We defend them like it's our job." beats a line about a dynamic environment.
Step 3 - Keep the title, the location and the team inside their boxes
Every text field is a fixed size. Nothing shrinks to fit, and an overrun does not fail the render - it publishes a video with a line missing. Make the limits a validation rule in your mapping function:
| Field | Box | Holds | Breaks at |
|---|---|---|---|
job_title | 1520x360, 150px | 2 lines, ~46 characters | "Vice President of Engineering, Developer Platform" - 3 lines, one lost |
location_mode | pill from x=140 | ~15 characters | "Remote · worldwide" - runs into the Full-time pill |
team_name | from x=140, 120px | ~430px of text | "Platform" - touches the static word "team." |
perk_1/2/3 | 1560x380, 110px | 3 lines, ~90 characters | 99 characters - 4th line lost |
apply_url | 800x112, 38px mono | 48 characters | a full ATS link with UTM parameters |
Two of those are collisions rather than overflows, and they are the ones that
surprise people. The location_mode pill grows to fit its text, but the
Full-time pill beside it is nailed to x=514, leaving about 280px once the
border and 44px of padding are counted. "Berlin · hybrid" lands 42px clear;
"San Francisco · on-site" sits on top of its neighbour.
team_name collides the same way with the static word "team." at x=570.
"Growth" ends 50px short of it; "Platform" ends 6px past it. The scene reads
"You'd join the Growth team.", so map long team names down to one short
word.
Step 4 - Pick a voice: the yellow ad or the deadpan one
Two templates ship on the same eight fields. job-ad-promo is yellow on ink in
Space Grotesk and opens "Yes, this is a job ad." job-ad-promo-v2, The Honest
Job Ad, is lime on spruce in Geist and reframes the perks as Full Disclosure
confessions.
Switching is one word in templateId. The decision worth making is to stop
switching: a candidate who sees three of your roles in a week should see the
same video three times with different words in it.
Step 5 - Render one video the moment a requisition opens
One published role becomes one POST. The template's API id is job-ad-promo,
the same string as its gallery URL.
curl -X POST https://renderly.video/api/v1/renders \
-H "Authorization: Bearer $RENDERLY_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"templateId": "job-ad-promo",
"replacements": {
"company_logo": "https://cdn.example.com/brand/logo-mark.png",
"job_title": "Senior Backend Engineer",
"location_mode": "Berlin · hybrid",
"team_name": "Payments",
"perk_1": "Actually flexible hours. Not \"flexible\" with air quotes.",
"perk_2": "A learning budget nobody guilt-trips you for using.",
"perk_3": "No-meeting Wednesdays. We defend them like it'\''s our job.",
"apply_url": "example.jobs/backend-payments"
},
"webhookUrl": "https://your-app.com/hooks/renderly"
}'Any field you leave out keeps the template's default, and those defaults belong
to a fictional company called Acme. A missing company_logo does not fail the
render, it publishes Acme's logo on your careers page. Validate the requisition
before the request, not the file after it.
The call returns a job id immediately and the finished URL arrives on the
render.completed webhook, signed with HMAC-SHA256; the
webhooks guide covers verifying
it.
What this costs at scale
Renderly bills 1 credit per minute of 1080p output, rounded up to the nearest half credit. A 34-second ad is 0.57 minutes, which rounds to one credit.
| Roles per month | Credits | Plan | Cost |
|---|---|---|---|
| 12 - one company hiring steadily | 12 | Creator, $29/mo | included |
| 200 - an agency desk | 200 | Creator, $29/mo | included |
| 1,000 - a staffing firm | 1,000 | Business, $99/mo | included |
| 2,000 | 2,000 | Business + 1,000 extra at $0.12 | $219/mo |
At a thousand roles a month the video costs about ten cents an opening, well under the job board fee for the same posting. Rendering is not the constraint; writing three honest perks is.
Where to go next
The argument behind step 1 is set out at length in template-based video versus AI-generated video. If your open roles live in a spreadsheet rather than an ATS, the loop in the CSV guide renders the whole list, and the Google Sheets guide puts it on a trigger.
Frequently asked
Does Renderly write the job ad from the job description?
What happens if the job title is too long?
Can I use my own brand colours and fonts?
What is the difference between the two job ad templates?
How does the video get onto LinkedIn?
What does it cost to re-render when a role changes?
Related guides
Bulk Video from CSV: Generate One Video per Row
Turn a CSV export into finished videos. Map headers to template variables, send one render request per row from a resumable script, and collect every result.
Google Sheets to Video: Automate Video Creation from a Sheet
Turn spreadsheet rows into finished videos. Connect a Google Sheet to the Renderly API with Apps Script, map columns to variables, and render every row.