Love the curl-first framing. Once you have one polling shape, A/B-ing the same prompt across Seedance, Veo, and Kling stops being a science project.
Two things I'd add for anyone copying this: store the exact checkpoint/version string with each job (host labels drift), and measure cost per usable clip, not per generate. Failed takes and silent ref drops wreck the spreadsheet.
Disclosure: I built PixelDojo, so I'm biased toward one balance across models. Native APIs are still the right call when you need full parameter control or you're shipping an agent. Your wrapper approach is how a lot of builders should start.