Adobe, Vecteezy, and Dreamstime CSV Header Comparison: Lessons from a Failed Upload

Stock platform CSV headers differ greatly; scripted generation avoids upload rejections.
A creator's 40 images were instantly rejected by Adobe Stock because the CSV header had an extra "notes" column. The author then mapped out upload specs for Adobe, Vecteezy, and Dreamstime: Adobe requires exactly 5 columns with space-separated keywords and numeric categories; Vecteezy needs only 4 columns but comma-separated keywords; Dreamstime's 15-column template only requires 4 filled. Since the underlying data is the same, differences lie only in column count, delimiters, and category format. The author wrote Python scripts to generate metadata uniformly and added an upload ledger to prevent duplicates, replacing the most error-prone manual task each week with about 200 lines of code.
A Failed Upload Made Me Re-examine CSV Headers
A creator once had 40 images instantly rejected by Adobe Stock because the CSV header had an extra column called "notes." This experience revealed an easily overlooked fact: CSV upload formats for stock platforms are far from "close enough" — each platform has precise requirements for column count, column names, and keyword delimiters. According to the creator's personal blog, he spent an entire evening opening three browser tabs, recording the upload header specifications for Adobe, Vecteezy, and Dreamstime one by one, and eventually wrote a Python script to auto-generate metadata, completely ending the chaos of manually maintaining three spreadsheets.

Adobe Stock: Five Columns, Not One More
Adobe Stock's CSV upload is the most strict. The header is fixed at five columns, the order cannot be changed, and the system performs column-count validation before human review. The correct header is:
Filename,Title,Keywords,Category,Releases
A few key pitfalls: The column count is checked, not just the column names. The author was rejected for adding a sixth column "notes" — the entire validation was completed before a human ever saw the file. Keywords are separated by spaces within a single quoted cell, not commas. If you write "sunset, beach, ocean", each asset will be recognized as one long keyword containing commas. Category is a number, not a name; when left blank, Adobe guesses, but the guess quality is mediocre. For flat illustration work, the author typically falls between 8 and 15 (objects, backgrounds, education). The Releases column can be left blank if there are no people or property in the image. For pure AI-generated vector graphics and stickers, this column is entirely empty.
Practical rule: five columns, exact column names, keywords separated by spaces, done. No creative liberties are needed in this file.
Category numeric codes are an easily overlooked detail in Adobe Stock submissions. The platform maps content categories to fixed integers — for example, 8 typically corresponds to "Graphic Resources & Backgrounds," 11 to "Abstract," and 14 to "Education." Different category ranges cover photography, illustration, vector, and other media; refer to Adobe's official contributor documentation for the exact mapping. When generating programmatically, it's advisable to explicitly specify the category number for each asset rather than relying on the platform's guess, because empty values trigger automatic classification with limited accuracy. If a batch of assets belongs to the same category, you can pass it uniformly as a script parameter to avoid filling in each one individually.
Vecteezy: Four Columns, Keywords Are the Main Event
Vecteezy's contributor CSV is shorter:
Filename,Title,Keywords,Category
Only four columns, with no Releases column, which hints at a difference in review priorities. Two things to watch: Keywords are separated by commas, the opposite of Adobe. This is the easiest trap to fall into — if you directly reuse Adobe's CSV and just delete a column, the keywords will become a jumbled mess, affecting search rankings. The author once uploaded 20 files and then searched for his own work but couldn't find it before realizing the problem. Titles matter more than on Adobe, because Vecteezy's search relies more on title matching. Using the filename as the title works for a first pass, but you lose discoverability opportunities.
The difference in keyword delimiters stems from how each platform's search index parses data. Adobe Stock treats spaces within a quoted cell as keyword boundaries, while Vecteezy and Dreamstime split by commas. This means the same keyword phrase (such as "sunset beach") will be split into two words on Adobe, but kept as one phrase on comma-delimited platforms. When generating uniformly via script, different joining strategies should be used for different platforms: Adobe joins individual words with spaces, while Vecteezy and Dreamstime join with commas. If a keyword itself contains a comma, the entire cell should be wrapped in double quotes per CSV conventions to avoid parsing misalignment.
Dreamstime: Fifteen Columns, Most Left Blank
Dreamstime is the other extreme. Its CSV template has fifteen columns, but for independent creators doing AI-assisted work, most columns are empty:
Filename,Image Name,Description,Keywords (comma separated),Category 1,Category 2,
Category 3,Extra Keywords,Is Free,Is Editorially Reviewed,Sex,Age,Model Release,
Property Release,Country
What actually needs to be filled in: Description is a real sentence, not a keyword list — Dreamstime indexes it. Is Free and Is Editorially Reviewed are literal yes/no fields; don't touch them unless you know why you're changing them. Model Release and Property Release are left blank for the author's work, consistent with Adobe. The three Category slots accept category names; filling in one is enough.
Fifteen columns sounds intimidating, but in practice you only fill four per row and leave the other eleven blank — which is exactly why this should be handled by a script rather than manually in a spreadsheet.
Model Release and Property Release are fields used by stock platforms to confirm portrait rights and property authorization. When identifiable people appear in the image, a model-signed release is typically required; when private property appears (such as specific buildings or artwork), a property release is needed. For pure AI-generated vector graphics and stickers with no real people or identifiable property, leaving these two columns blank is the compliant approach. Dreamstime's template has these two columns as separate fields, but independent creators without release documents should not casually fill in "yes," as this may trigger review disputes. When handling programmatically, these two columns can be output as fixed empty strings, maintaining consistency with Adobe's Releases column logic.
Why I Gave Up Maintaining Three Spreadsheets
Once the headers for all three platforms were sorted out, the problem simplified. Each platform needs the same underlying data: filename, title, keywords, category. The differences lie only in column count (5, 4, 15), keyword delimiters (spaces vs. commas), and category format (numbers vs. names vs. either).
The author therefore wrote make_metadata.py, which points to a folder of files and specifies the platform:
python make_metadata.py ./my-assets --platform adobe --out adobe.csv --ext .jpg
python make_metadata.py ./my-assets --platform vecteezy --out vecteezy.csv --ext .jpg
The script writes out the header required by each platform, and nothing more. Internally it maintains one canonical record per asset and renders it into three formats. Keywords are joined with spaces for Adobe, and with commas for Vecteezy and Dreamstime. It uses only the Python standard library, so nothing needs to be installed. If no title file is passed, it title-cases the filename — good enough for a first pass, to be replaced before formal submission.
Another lesson from that night of failure: after fixing the CSV, the author nearly re-uploaded the same batch of files because the upload had failed but memory hadn't. Duplicate publishing is the fastest way to get a contributor account flagged. So a second script, upload_tracker.py, is a simple ledger that records what's already been done, so re-runs only process the pending list. The two scripts together are about 200 lines, replacing the most error-prone hour of every week.
Key Takeaway: Fragile, Not Complex
Platform CSVs themselves aren't complex, but they are fragile. Adobe checks column count, Vecteezy wants comma-separated keywords, Dreamstime has a fifteen-column template but only four need filling. Get any one wrong, and the rejection is instant and silent. Write down the headers once, encode them once, and never manually edit upload CSVs again.
This system — the metadata generator, the upload ledger, the Markdown-to-PDF tool, and the packager that bundles products into 1280x720 covers and 600x600 thumbnails — was built by the author while packaging 39 products and 856 MB of output on a server with 1 vCPU, 2 GB of RAM, and no GPU. The related scripts and the reasoning behind the rules are included in the AI Sticker Factory Handbook. If you're about to hand-type the CSV for a fourth platform, this approach can save you the night the author lost.
Related articles

Chain of Thought Isn't Just for AI: How Humans Can Use CoT to Improve Thinking Quality
Chain of Thought isn't just a prompt trick for large models. Starting from a Hacker News discussion, this article analyzes why CoT works for human thinking too, breaks down actionable ways to transfer it, and highlights the key differences between human CoT and machine CoT.
Cloudflare Teams Up with OpenAI: Closi…
Cloudflare Teams Up with OpenAI: Closing the Loop from Vulnerability Discovery to Defense with AI
Cloudflare uses OpenAI Daybreak to investigate security vulnerabilities and generate reviewable remediation plans, while developers use Codex to boost coding efficiency and quality.

Orca Multi-Agent Orchestration in Practice: A Guide to Parallel Collaboration with Claude and Codex
Orca is Stable AI's free open-source agent workbench supporting 34 agents like Claude Code and Codex in parallel. Learn its Git worktree isolation, multi-model orchestration, and mobile management.