Corporate Holiday Card API: 5,000 in One Run

A corporate holiday card API renders one card per client from a list you already have. Name, company, the account manager who signs it: all of it varies per render, and the card doesn't move.

The design is the easy half and it's where most of the panic goes. The half that decides whether the run succeeds is the list, because a 5,000-row job fails in exactly one way: it renders 5,000 perfect cards with something wrong in them, and you find out after they're printed.

The deadline is the constraintThe deadline is the constraint

A holiday card has a date it stops being useful, and print has a lead time in front of that date. So the schedule works backwards, and the render step is the smallest piece of it.

StepOwns the riskTime
List export and cleanYouDays, and always more than expected
Design and sign-offYouDays
Proof run, 20 rowsThe renderMinutes
Full render, 5,000The renderMinutes
Print and mailPrinterWeeks

Rendering is the cheap, fast, repeatable step. Getting the list right is neither, which is why the rest of this is mostly about the list.

Proof the list before you spend the rendersProof the list before you spend the renders

Every render costs a render, including one you're throwing away, and a re-run after a data fix costs the full batch over again. So the proof step earns its time.

Render the first 20 rows and check three things.

The warnings header. When you send an override key that matches no dynamic layer, the render still succeeds and the header x-dma-warnings says so. That's the typo case: send client_name when the layer key is clientName and you get 5,000 cards with an empty name and no error anywhere. Read the header on the proof run and the whole class of problem disappears:

curl -sS -D headers.txt -X POST 'https://render.imejis.io/v1/YOUR_DESIGN_ID' \
  -H 'dma-api-key: YOUR_KEY' \
  -H 'Content-Type: application/json' \
  -d '{ "client_name": { "text": "Fairweather & Sons" } }' \
  --output proof-001.png
grep -i x-dma-warnings headers.txt

The long tail of the name column. Sort by length and render the longest and shortest. Auto-resize (minFontSize and maxFontSize) keeps both inside the box, but you still want to see what the extremes look like before a printer does.

The rows that shouldn't be there. Test accounts, duplicated contacts, a name field holding an email address, empty strings. A list exported from a CRM has all four. RFC 4180 is the reference for what a well-formed CSV actually is, and most exports aren't quite it.

One design, two outputs, chosen per render:

# print: single-page PDF at the design's canvas size
curl -X POST 'https://render.imejis.io/v1/YOUR_DESIGN_ID?format=pdf' ... --output card.pdf
 
# email: a PNG the client's mail app will actually render
curl -X POST 'https://render.imejis.io/v1/YOUR_DESIGN_ID?format=png' ... --output card.png

For the email half, resist the temptation to embed a live render URL in the message. Every open re-renders and costs a render, and a card forwarded around a client's office can cost you more than the card. Render once, host the file, link to that.

If you'd rather the link not live forever, signed delivery returns a time-limited URL with an expiresAt timestamp, defaulting to 60 minutes and capping at 7 days. Delivery modes covers the choice in full.

What a corporate holiday card api run costsWhat a corporate holiday card API run costs

One render per recipient, per attempt.

List sizeRendersPlanHeadroom for a re-run
90 clients90100 free renders a month, no cardNone
800 clients800Basic, $14.99Slim
5,000 clients5,000Pro, $24.99Yes, one full re-run
5,000, print and email versions10,000Unlimited, $69.99None

As of September 2026 those are the plan limits. The column that matters is the last one. Budget for a re-run, because the odds that a 5,000-row list is perfect on the first pass are not good, and discovering that with no allowance left is a bad week in December. The pricing page has the detail.

Where this isnt the right toolWhere this isn't the right tool

We don't send anything. No mail merge into an inbox, no postage, no address verification. You get files; your existing email platform or print partner does the delivery.

A greeting isn't a campaign. If you want tracking, per-recipient links and open rates, that's your email platform's job and it will do it better.

Under about 100 cards, do it by hand. Genuinely. Setting up a design, an export and a loop is an hour or two. For 60 cards you'd have finished by then.

The case for automating is a list in the thousands, a hard date, and the near-certainty that somebody will spot a wrong name on day two and want the batch re-run.

Getting startedGetting started

Build the card as a design, mark the name and message dynamic, and render 20 real rows with the warnings header visible. If your card carries several photos, photo collages covers multi-image layouts, and dynamic fields explains which properties to open up. The API docs have batch-shaped examples in Node, Python and Go.

Frequently asked questions

Export your client list, design the card once with the name and message marked dynamic, then render one card per row. Each render returns a finished file, so the batch is a loop over your list rather than a design job.

Render the first 20 rows and read the render warnings response header. It names any field you sent that matched no dynamic layer, which is how a typo in a field name gets caught before it produces 5,000 cards with a blank space where the name goes.

PDF for anything going to a printer, since it comes back single-page at your design's canvas size. PNG or WebP for email and messaging, because clients render those reliably. The same design serves both, chosen per render.

5,000 renders, one per recipient. As of September 2026 that fits Pro at $24.99 for 5,000 renders a month, with room for a re-run. A re-run after a data fix costs the full 5,000 again, so proof first.

Yes. Render with signed delivery and you get a time-limited URL with an expiry timestamp. The default is 60 minutes and the ceiling is 7 days, which suits a card someone opens the evening you send it.

We use cookies to run the site and, with your consent, for analytics and marketing. See our Cookie Policy. You can change this any time from “Cookie settings” in the footer.