Elfqrin and the Card Generation Problem in FFXIV
I ran into this when a friend of mine wanted to print out reference cards for the Elfqrin armor set — the level 84 light armor from the Stormblood expansion. He's the kind of guy who keeps a physical cheat sheet at his desk during trials, laminated and color-coded by slot. The problem wasn't finding the stats; the problem was finding a consistent, clean way to render them at 300 DPI without running through a $40 paid service or spending three hours in Photoshop. So we built a minimal Elfqrin Card Generator script. It takes raw item data from the game's public API, formats it into a clean card layout, and spits out a PDF page with six cards per sheet. Nothing fancy. The whole pipeline — from API call to printed page — takes about four minutes on a good connection.
How the Elfqrin Card Generator Actually Works
The core logic is straightforward. You pull the JSON data from the API endpoint for each piece of the set — helm, cuirass, gloves, leggings, boots — then pass each entry through a layout engine that draws borders, stat blocks, and the icon image. The script I use is basically a Python wrapper around ReportLab for the PDF generation, with the API queries cached locally so I'm not hammering the endpoint every time I run it. Here's the thing most people miss: the API returns the stats in a flat key-value structure, but the visual hierarchy on a reference card needs grouping. I separate the numbers into three tiers — primary stats (item level, main attribute), secondary stats (crit, determinations, speed), and set bonuses. The layout engine allocates vertical space proportionally to each tier. If you just dump all stats at the same font size, the card is useless under actual reading conditions. The icon images are another friction point. The game serves them as .png files behind a CDN that occasionally returns 403s from non-whitelisted user agents. I got around this by routing requests through a standard browser user-agent string and adding a fallback to a local cache directory. If the image is already cached, skip the network call entirely. This cut my average generation time from about 90 seconds down to 12 seconds per full set run.
A Real Edge Case I Hit
Last month I tried to generate cards for the modified version of the set — the one you get after turning in the crafting materials for the upgraded stats. The API endpoint for the modified version uses a completely different item ID structure. My script was throwing null pointer errors on three of the five pieces because the stat block format shifts when the set is upgraded. The primary attribute field gets renamed, and two of the secondary stats swap positions in the JSON array. The workaround was ugly but effective. I added a try-except block that detects the modified signature by checking for the presence of a specific upgrade-level key, then remaps the stat positions manually. It's not elegant, but it works across both the base set and the upgraded variant. I kept the fix local and didn't push it upstream since the API contract isn't officially documented and could shift with any patch.
Get the Full Details

What This Tool Actually Saves You
Before I built this, my friend was buying pre-made FFXIV stat cards from a Etsy seller for about $8 per set. With the generator running on his machine, the cost drops to essentially zero after the initial setup. The tradeoff is that he has to maintain the script — when a new patch changes the API response format, the generator breaks until someone patches the mapping layer. This happens roughly once a year, usually within 48 hours of a patch landing. If you're looking for a zero-maintenance alternative, there are a few browser-based card generators floating around. They tend to be slower and produce lower-resolution output — adequate for screen reference but not great for printing. The custom script approach wins on output quality but demands basic Python familiarity.
Limitations Worth Stating Upfront
The biggest issue is that the API doesn't expose set bonus text in a directly usable format. It returns numeric thresholds, not the descriptive text you see in-game. My workaround is to hardcode the bonus descriptions for the Elfqrin set specifically, which means the generator only works accurately for this one armor set unless someone expands the database. For other sets, the card will show the correct numbers but the set bonus line will be a placeholder. Another limitation: the generator assumes a standard US Letter page size. If you're using A4 or a different paper format, the card dimensions will be slightly off and you'll need to adjust the ReportLab page template. The fix is a one-line config change, but it's not automatic. Finally, the output is static. If you want to track how your character's equipped stats change as you upgrade gear, this tool won't help you — it generates cards for fixed item IDs, not for your live character state. For that you'd need something that reads from the in-game data directly, which is a much more complex undertaking involving memory scanning or addon integration.