saymaker
Generate images and video on SayMaker from your own code: one API key runs Veo 3.1, Kling 3.0, Seedance 2.0, MiniMax H3, Nano Banana 2, GPT Image 2.5, Seedream 5.0 and the rest of the shelf on your own credits.
{:ok, url} = SayMaker.generate("a paper-cut layered mountain range at dusk")
{:ok, clip} = SayMaker.generate_video("a paper boat drifting down a rain gutter, low angle")
Each call waits for the run and returns the URL of the finished file. Runs on a free account wait in a queue before they start, and the wait grows with each run of the day; a paid plan starts at once. The default timeouts cover the longest wait.
Install
def deps do
[{:saymaker, "~> 0.1"}]
end
Elixir 1.18+; uses :httpc and the standard JSON module, no dependencies. Set SAYMAKER_API_KEY or pass api_key:.
API key
Sign up on saymaker.ai (new accounts get sign-up credits), create a key at saymaker.ai/settings/apikeys, then pass it or export it:
export SAYMAKER_API_KEY=sk-...
A key runs on your account exactly like the site does: same models, same credit prices, same plan, and every run lands in your library at saymaker.ai/history.
Images
SayMaker.generate("isometric diorama of a ramen shop at night", aspect_ratio: "16:9")
SayMaker.generate("product shot of a glass perfume bottle on wet slate", model: "gpt-image-2-5-flare")
The default model is saymaker-image-v1, the cheapest text-to-image run. Pass a model id for nano-banana-2, gpt-image-2-5-flare, seedream-5-pro, qwen-image-3-pro and the rest; see the image models.
Editing a photo
Pass an image URL and the prompt describes the change rather than the picture:
SayMaker.generate(
"change the jacket to dark green, keep the face, pose and background exactly as they are",
image_url: "https://example.com/portrait.jpg"
)
Naming what must stay is what decides whether the edit holds. Prompts that only name the change tend to drift the whole picture.
Video
SayMaker.generate_video("a fox trotting through fresh snow at dawn, tracking shot", duration: 6)
SayMaker.generate_video("the camera slowly orbits the statue", image_url: "https://example.com/statue.jpg")
SayMaker.generate_video("a street drummer in the rain", model: "veo-3-1", resolution: "1080p")
The default model is minimax-h3-fast, the one a free account can run (480p or 768p, 4 to 15 seconds). Veo 3.1, Kling 3.0, Seedance 2.0 and the other video models need a plan or a credit pack; see pricing. Each model's options are on its page: Veo 3.1, Kling 3.0, Seedance 2.0.
Errors worth catching
Failures are {:error, reason, message}:
:auth— no key, or the key is wrong or deleted:quota— the account is out of credits:plan— that model needs a paid plan or a credit pack:busy— another run on this account is still rendering; free accounts run one at a time:rejected— the content filter or the model refused the prompt; rewrite it rather than retrying
The API answers refusals with HTTP 200 and an error code in the body, so a client that only checks the status code reports a refusal as success. This one reads the body.
Free-account output carries a watermark; a paid plan returns the clean file.
MIT licensed. Made by SayMaker, the AI video generator agent.