Skip to main content
Integrate Bloom into your automation stack so your workflows can generate on-brand images on demand and drop them into the rest of your tools. Whether you’re building in Zapier, n8n, Make, Gumloop, or anything else with an HTTP request step, the integration follows the same pattern below.

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 /brands and copy any id.
    • If you don’t, create one in the Bloom app by onboarding from a URL, or via POST /brands from your workflow.
  • 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

  1. Start a generation. Returns 202 Accepted immediately with an image ID — the actual generation runs in the background.
  2. Get the image. Either pass ?wait=true and 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.
  3. Use the URL. The completed image’s CDN URL is in the response — pipe it into Slack, a Google Sheet, Drive, Webflow, whatever.

When your workflow creates the brand

Brand creation is also asynchronous. Add this sequence before the image-generation pattern:
  1. POST /brands validates the request, creates a provisional brand, durably queues initialization, and returns 202 Accepted with status: "analyzing".
  2. GET /brands/{id}?wait=true waits through the website or Instagram analysis and visual DNA extraction.
  3. Continue only when status is ready. Handle logo_required by providing a logo, and handle failed by showing failure.message or submitting a new brand request.
If the wait times out, Bloom returns the current analyzing resource rather than an error. Fields such as logoUrl and summary can be null until initialization finishes. collectImages: false on POST /brands skips only background image-library collection. Bloom still crawls the source and builds the brand’s visual DNA.

Authentication

For most automation tools, send your API key as the x-api-key header:
Store the key once in your tool’s credential vault and reference it as a variable in each step — don’t paste it directly into the workflow JSON. (Zapier calls this an “auth connection”, n8n calls them “credentials”, Make calls them “connections”, Gumloop calls them “secrets” — same primitive.) The API also accepts 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
Required: brandSessionId, prompt. Everything else is optional. Common optional fields: Response (202 Accepted):
Store 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. 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.
Use this whenever the tool can keep an HTTP request alive long enough. Most generations complete in well under a minute.

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.
Most workflow tools have a built-in “wait + retry” or “delay then continue” primitive — n8n’s Wait node, Make’s Sleep module, Gumloop’s loop primitive. Zapier requires a multi-step zap with a Delay step.

Step 3 — Use the URL

A completed image response includes the CDN URL inside the data envelope:
Pull 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 accepts ids=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:
Branch on code, not on message. Common codes you’ll see while integrating: