Midjourney has no public API: comparable control in a pipeline
Midjourney's 10/1 alpha adds a pinnable --exp setting and edits that keep aspect ratio. What to use when you need that kind of control from code.

If you need code-driven image control, Midjourney is not the tool to plan around: the research behind this post found no public API for it. Its October 1 alpha changelog is still worth reading for what control looks like, and the Sume Image API offers parameters that serve the same goals.
What the alpha changelog lists
The October 1 entry describes three changes relevant to repeatable work. They are features of Midjourney's own interface, and Midjourney's page is the place to confirm how they behave.
| Change | Why it matters for repeatable work |
|---|---|
| Multiple style references as one pill | Several looks combined into a single control |
--exp pinnable per folder | A setting that stays fixed across a project |
| Edits preserve the base aspect ratio | A changed image keeps its frame |
The same goals through an API
On Sume's Image API, the controls are request fields and each model lists which it accepts. A field that a model does not list returns 400 unsupported_parameter, so the catalog is the contract.
- Several style references:
input_references, a per-model range, for example up to 16 on GPT Image 2.5. - A setting that stays fixed: store the request body in your project and send the same fields each time.
- Keeping the frame on an edit: Ideogram 4.5 keeps the source image shape when an edit omits
aspect_ratio. - Repeatability by number:
seedis not served, so pin the model id and settings instead.
A project settings file
A pinnable setting in a chat tool becomes a small file in a pipeline. Keep one JSON per project and merge it into every request.
import json
import os
import requests
def main() -> None:
base = json.load(open("project-settings.json"))
body = {**base, "prompt": "Product on a marble counter, soft window light"}
r = requests.post(
"https://api.sume.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
json=body,
timeout=60,
)
print(r.status_code, r.json().get("usage", {}).get("cost"))
if __name__ == "__main__":
main()Choosing
For exploring looks by hand, an interface with pinning and style pills is pleasant. For anything that must run unattended or be rerun next month, choose a model with a documented request shape and keep the settings file next to the outputs.
Sources
Related posts
More in Comparisons
- MiniMax H3 vs H3-Max limits: the MiniMax page next to Sume's catalog
MiniMax lists H3 at 4 to 15 s and H3-Max at 5 to 15 s with different resolutions. Sume's catalog states its own ranges. Side by side, with the file-size limits.
- Pika API Club: 100+ models at reduced pricing, questions to ask first
Pika's API Club (Aug 5) offers 100+ models at reduced pricing, and the Sep 17 relaunch adds audio models. Seven questions to ask an aggregator.
- Capacity fallbacks: Replicate's model swap vs pinning on Sume
Replicate lists a model falling back to another at capacity. On Sume you pin a model or send sume/auto, and a capacity error is retried with the same key.
- Prediction deadlines vs a Sume client deadline: stopping isn't cancel
A client-side deadline stops you watching a Sume job; it does not cancel it. Cancel works only before generation starts, so a missed deadline still bills.
Written by Sume