grok-imagine-image-quality EOL (2 Nov) and 1-hour signed URLs: migrating the xAI bulk route in Bubble via BIAIG before the deadline
xAI retires grok-imagine-image-quality on 2 Nov 2026. Batch media signed URLs expire in about an hour while jobs can run up to ~24h. A BIAIG cutover table: explicit model id, quality, and Bubble File/Image ingest before TTL—without stale scheduled runs.
Why this matters now
My Bubble catalog ingests assets through an internal pipeline called BIAIG (from the editorial plan—not listed in public xAI or Bubble docs). While I was untangling bulk image, two problems landed on the same date. Worth reading next: OpenAI image Batch API (−50%,.
Public xAI documentation sets retirement of grok-imagine-image-quality effective November 2, 2026 (60-day notice from September 2, 2026). Separate from general batch economics: the Batch API exposes signed URLs for bulk image/video results that expire after about one hour, while the batch job itself has a different expires_at and may take up to ~24 hours to finish (best effort). The deprecated model id and 1-hour URL TTL share one deadline window.

This piece is not about OpenAI/xAI batch pricing; it is about this model + EOL date and ingest before URL expiry in Bubble.
What changes after Nov 2
| Previous slug | After EOL | API behavior | Recommendation |
|---|---|---|---|
grok-imagine-image-quality on /v1/images/generations, /v1/images/edits |
Redirect to grok-imagine-image-2.0 with quality: "low" |
Same request/response shapes; slug still resolves | Set model: grok-imagine-image-2.0 and an explicit quality (low, medium, auto)—otherwise redirect forces low and you lose control of quality/billing |
grok-imagine-image-pro (already redirected to quality per May 15 guide) |
Same Nov 2 path → 2.0 @ low |
Legacy slug chain | Audit JSONL/SDK for pro/quality aliases |
grok-imagine-image (1.0) |
Not affected by this EOL | — | Do not confuse with quality retirement |
Batch API: model page grok-imagine-image-quality — Batch API: Not supported; grok-imagine-image-2.0 — Batch API supported. xAI batch examples use grok-imagine-image-2.0. If BIAIG still submits batches under the quality slug, migration is model id change, not calendar hygiene alone.
Sources: Imagine Image Quality Retirement (Nov 2), May 15 retirement, quality / 2.0 model pages.
Two different “expiry” concepts
I mixed these up myself until I wrote them down.
| Concept | Meaning | Bubble ingest impact |
|---|---|---|
| Signed media URL in batch results (~1 hour) | xAI expects prompt download from .url |
A workflow that waits until “batch fully done” may see dead links if ingest lag exceeds one hour |
Batch expires_at |
Job retention window (not the same as URL TTL) | Job metadata may still exist while URLs in old results are gone |
| Batch runtime | Up to ~24h best effort | Long queues + infrequent polling amplify URL expiry risk |
Batch responses also expose image_response.base64 (and video equivalents) beside .url—a path that avoids reliance on signed URLs if your pipeline supports it (verify in BIAIG; do not assume).
Sources: Release notes (March 2026 batch image/video + 1-hour URL note), Batch API.
Bubble: File/Image ingest, not plain URL text
I follow the documented/community pattern for backend ingest:
- Map the xAI URL as file/image type in the API workflow, not plain text.
- Persist to the catalog with
:saved to Bubble storagewhen pulling the remote asset. - Scheduled API workflows snapshot the workflow version at schedule time—after you change model ids or ingest steps, already scheduled runs will not pick up the new logic until cancelled and rescheduled.
Sources: Scheduling API workflows, Forum: uploading public image in backend workflow.
BIAIG cutover table (editorial checklist)
What I walk through before Nov 2, 2026—one checklist, not three separate “later” tasks.
| # | Layer | Action before Nov 2, 2026 | Done when |
|---|---|---|---|
| 1 | Batch submit (JSONL/SDK) | Replace model with grok-imagine-image-2.0; remove grok-imagine-image-quality, -latest, grok-imagine-image-pro |
Staging job diff shows no quality slug in payload |
| 2 | quality |
Set explicit low / medium / auto—do not rely on post-EOL redirect @ low |
Catalog default documented—open product choice (cost vs fidelity) |
| 3 | Result handling | Ingest per completed result (incremental retrieval per docs), not one end-of-day bulk fetch | Internal measure: time from result .url to :saved—not in public docs |
| 4 | Fallback | On expired URL, branch to base64 if supported; never store raw signed URLs in text fields | Catalog fields hold Bubble storage URLs |
| 5 | Scheduler hygiene | Cancel/reschedule queued runs on the old route | No snapshots of old connector + old model |
| 6 | Smoke test | One small 2.0 batch + sync path with chosen quality |
Assets open from Bubble storage without xAI host |

What public docs do not settle
- Exact clock time/timezone for the Nov 2 cutover (migration guide gives a calendar date only, unlike May 15’s 12:00 PM PT).
- Whether BIAIG already uses 2.0—check private config, do not invent.
- Production lag from poll → schedule → ingest—your observability.
Out of scope unless you leave batch-only: Imagine storage_options / Files public URL TTL (1h–30d) on a different API surface (outputs doc).
Bottom line
Before November 2, 2026 I move the bulk image route to grok-imagine-image-2.0, pin quality, and force Bubble storage ingest within the ~1-hour signed URL window. Skip that and post-EOL redirect leaves you on low, while long batch jobs leave catalog entries pointing at expired links. BIAIG cutover is model + ingest timing + scheduler reset in one table. Worth reading next: xAI Batch API: image, edit,.