{
  "id": 18202520,
  "title": "Testing Your Metadata CSV Against Adobe, Vecteezy And Dreamstime Before Upload",
  "url": "https://urgent.news/2026/11/04/testing-your-metadata-csv-against-adobe-vecteezy-and-dreamstime",
  "topic": "tech",
  "section": "Tech",
  "published": "2026-11-04T23:12:28.000Z",
  "source": {
    "name": "Dev.to",
    "slug": "dev-to",
    "url": "https://dev.to/revanzart/testing-your-metadata-csv-against-adobe-vecteezy-and-dreamstime-before-upload-41nf"
  },
  "original_language": "en",
  "account": "Hand-building CSV files for Adobe Stock led to a disastrous Saturday when a single extra column caused the upload to fail. After the rejection, the reporter rewrote the process into a script called make_metadata.py. This script generates the five required columns - filename, title, keywords, category, and releases - and nothing else. Adobe is strict about CSV format, so it's crucial to get the count and order right. Other platforms have different requirements: Vecteezy only needs four columns, and Dreamstime demands fifteen. The reporter's script can create each format from the same folder of assets. The process involves testing with one file before running a full batch of 40 files to catch any errors early. The reporter also created a tracking system called upload_tracker.py to prevent double-posting, which could flag the account. This simple pipeline uses only the Python standard library, Pillow for cover rendering, and reportlab for PDF output. The reporter emphasizes the importance of keeping notes, as they are the foundation for future projects.",
  "summary": "I lost an entire Saturday to a CSV header. Not to the art. Not to keywords. To one row of column names. I had 40 files ready for Adobe Stock, a metadata file I'd built by hand in a spreadsheet, and the uploader rejected it in about two seconds. The reason: Adobe's CSV wants exactly five columns, in a fixed order, and I had six. One extra column, \"notes\", that I thought would be harmless. It…",
  "key_points": [],
  "editors_take": null,
  "illustration": null,
  "coverage": {
    "outlets": 1,
    "also_reported_by": []
  },
  "ai_generated": true,
  "disclaimer": "Summaries, key points and the editor’s take are written by software from other outlets’ reporting and may contain errors — always check the linked original."
}