What you need before you start
- A Bloom API key. Create one and keep it nearby — you’ll paste it into your tool’s credential vault. App integrations can use Bloom OAuth instead.
- A brand session ID. Every image you generate is scoped to a brand:
- If you already have brands, hit
GET /brandsand copy anyid. - If you don’t, create one in the Bloom app by onboarding from a URL, or via
POST /brandsfrom your workflow.
- If you already have brands, hit
- An HTTP tool in your workflow — every automation platform has one (sometimes called “HTTP request”, “API call”, or similar). That’s the only primitive you need.
The three-call pattern
- Start a generation. Returns
202 Acceptedimmediately with an image ID — the actual generation runs in the background. - Get the image. Either pass
?wait=trueand let Bloom hold the connection open until it’s ready, or poll on a short interval if your tool can’t keep a connection alive. - Use the URL. The completed image’s CDN URL is in the response — pipe it into Slack, a Google Sheet, Drive, Webflow, whatever.
Authentication
For most automation tools, send your API key as thex-api-key header:
Authorization: Bearer bloom_sk_... for API keys and Authorization: Bearer <bloom_oauth_access_token> for app integrations using Bloom OAuth access tokens.
Step 1 — Start a generation
POST https://www.trybloom.ai/api/v1/images/generations
brandSessionId, prompt. Everything else is optional.
Common optional fields:
| Field | Values | Notes |
|---|---|---|
aspectRatio | 1:1, 16:9, 9:16, 4:5, 3:2, 2:3, 3:4, 4:3, 5:4, 21:9 | Defaults to a Bloom-chosen ratio if omitted. |
imageSize | 2K, 4K | 2K = 1 credit (default). 4K = 2 credits (Plus/Pro plans). |
model | fast, standard, pro | pro is the default. fast is cheaper and quicker. |
variantCount | 1–5 | One image by default. Each variant costs the same as one generation. |
referenceImageIds | array of image IDs | Use uploaded or previously generated images as style/content references. |
202 Accepted):
data.imageIds[0] — that’s what the next step needs.
Step 2 — Get the image
You have two ways to retrieve the finished image. Pick based on your tool’s request timeout.Option A — wait=true (recommended)
GET https://www.trybloom.ai/api/v1/images/{id}?wait=true
Holds the connection open until the generation reaches a terminal state. One call, no polling loop, no scheduling. Returns the same shape whether the image was already done or just finished.
Option B — Polling
GET https://www.trybloom.ai/api/v1/images/{id}
If your tool has a hard per-step timeout (Zapier in particular), fire the GET on a loop with a short delay until status is terminal.
Step 3 — Use the URL
A completed image response includes the CDN URL inside thedata envelope:
data.imageUrl and pipe it into whatever downstream step the workflow needs — upload to Drive, post to Slack, write into a Sheet cell, attach to an email.
Batching
If you fire many generations at once (e.g. one per row in a spreadsheet), you don’t have to poll each ID individually. The list endpoint acceptsids=id1,id2,...&wait=true and holds open until every referenced image reaches a terminal state. One call collects the whole batch.
Errors
Failed responses use a consistent envelope:code, not on message. Common codes you’ll see while integrating:
| Code | Meaning |
|---|---|
UNAUTHORIZED (401) | Missing or invalid API key or OAuth access token. |
BRAND_NOT_FOUND (422) | The brandSessionId doesn’t exist or belongs to a different account. |
INSUFFICIENT_CREDITS (402) | Your workspace ran out of credits — top up at trybloom.ai/#pricing. |
TOO_MANY_REQUESTS (429) | Too many requests too fast — back off and retry. |