Midjourney Style Profiles tab: a style library file for Sume
Midjourney added Style Profiles and Featured tabs with detail pages. For the Sume image API, keep a small JSON style library and merge it into each request.

Midjourney's 9/23/26 changelog adds Style Profiles and Featured tabs, each with detail pages, to its alpha site. The Sume image API has no hosted style library. The equivalent is a JSON file in your repo: each style is a name, a prompt snippet, optional reference images and a pinned model. A helper merges the chosen style into every POST /v1/images body.
What the vendor changed
From the alpha changelog.
| Date | Fact |
|---|---|
| 9/23/26 | New Style Profiles and Featured tabs with detail pages. |
| 9/23/26 | Live preview functionality for browsing styles with real-time prompt application. |
Design the library
Keep it flat and boring. Every entry needs the same keys so the helper stays simple. A suggested shape:
name: the label your team uses.model: the pinned catalog id, such asopenai/gpt-image-2.5.snippet: the words appended to the prompt.refs: zero or more public HTTPS image URLs forinput_references.notes: why this style exists, who approved it.
The helper
The helper reads the library, builds the body, and tags the job through metadata with the style name. metadata is stored on the job and is not sent to the provider, so it is a clean place for the label.
import json, os, requests
LIB = json.load(open("styles.json")) # {"catalog": {"model": ..., "snippet": ..., "refs": []}}
def render(style, subject):
s = LIB[style]
body = {
"model": s["model"],
"prompt": f"{subject}, {s['snippet']}",
"metadata": {"style": style},
}
if s.get("refs"):
body["aspect_ratio"] = "auto"
body["input_references"] = [
{"type": "image_url", "image_url": {"url": u}} for u in s["refs"]
]
r = requests.post(
"https://api.sume.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['SUME_API_KEY']}"},
json=body,
timeout=60,
)
return r.status_code, r.json()Rules that keep a library useful
Pin the model in each entry. The same snippet can look different on another model, and a library that mixes models cannot be reasoned about.
Check the model supports what the entry uses. A request that sets a parameter the model does not list returns 400 unsupported_parameter, and a text-only model rejects references. Read GET /v1/images/models when you add an entry.
Review entries when the catalog changes. The related post on detecting new models shows a diff you can run.
What it will not do
It will not preview a style before you pay for it, and it will not share state across people unless you commit the file. That is the trade for a library you fully control.
Sources
Related posts
More in Developers
- Midjourney V8.1 made HD the default: which Sume image models list 2K?
Midjourney V8.1 defaults to HD at lower cost. On the Sume image API, resolution tiers are per model; this script lists which catalog models advertise 2K or 4K.
- Migrate Veo 3.1 API calls to Gemini Omni Flash 1.1: parameter map
Veo 3.1 previews shut down October 22, 2026. A parameter-by-parameter map from the Veo guide to Gemini Omni Flash 1.1 requests on Sume, with a working curl.
- MiniMax H3-Context-IR returns a prompt, not a video: Sume view
MiniMax's H3-Context-IR endpoint reads text, images, audio and video and returns an enhanced prompt without making a video. What Sume has instead.
- MiniMax task statuses vs Sume job statuses: a mapping table
MiniMax reports queued, running, succeeded, failed, cancelled. Sume job status uses queued, processing, completed, failed, canceled. Map them correctly.
Written by Sume