OpenAI Decisions API (preview): classification and routing for Bubble bulk images via BIAIG
Where to gate async bulk images before catalog commit, how to retry only rejected rows onto another bulk route without rerunning the full generation job, and why Batch Moderation is the documented fallback while Decisions remains preview-only.
Context
At DevDay (2026-09-29), OpenAI announced the Decisions API in limited preview (not GA). An OpenAI Developer Community recap describes Luna-backed classification/routing over a developer-defined finite set of predefined answers. TechCrunch (2026-09-30) reports fixed option sets (including image categories) and claimed low latency with image understanding; no public hands-on validation at launch. A closer look: Flare, Sunburst, and WaveSpeedAI: routing. A closer look: Flare, Sunburst, and WaveSpeedAI: routing.
For high-volume batches, that is a plausible layer between generation and catalog publish: policy, NSFW, brand drift—before commit. This note fits the editorial line of async batch + public result URLs; it complements Batch API vs Flare pieces and does not repeat Midjourney/Qwen vendor-risk coverage.
Source honesty: no verified public Decisions API reference at Scout time. Latency (~150 ms in secondary explainers vs ~1.6 s Luna in press), confidence semantics, and Batch support are unverified until OpenAI publishes docs, pricing, and supported batch endpoints.
Bubble + BIAIG: what we can claim
Public biiaImagine™ marketing covers scalable catalog visuals. Scout found no public spec for a Bubble.io ↔ BIAIG pipeline (catalog write contract, idempotency, bulk-route IDs). The placement below is an architecture hypothesis—validate against internal BIAIG/Bubble docs, not shipped fact. A closer look: The ~500-row bulk-tools ceiling in. Worth reading next: ByteDance–MPA guardrails on Seedream/Seedance: bulk.
Where to insert classification
Typical async chain:
- Bulk generate (Batch
/v1/images/generationsor your BIAIG bulk route) → assets at stable public URLs (OpenAI recommends remoteimage_urlfor moderation batches). - Classify / moderate in a separate batch or sync gate.
- Catalog write only for
approved;quarantine/reviewskips publish. - Regenerate retries for rejected rows only, targeting an alternate bulk route, without a second full JSONL generation job. Same topic: Qwen-Image-2.1 before 28.09 UTC+8: freeze. Same topic: Bubble.io pricing in 2026: which.
OpenAI Community guidance: batch requests are independent; multi-step flows (generate → classify) need app-orchestrated sequential batches (Bubble backend, workflow engine, BIAIG worker).
Decisions (preview), when Batch support exists
If /v1/decisions (or equivalent) lands on the Batch supported endpoints list with image context:
- Questions with your labels: e.g.
approve_catalog | nsfw_block | policy_violation | brand_drift_retry_alt_route | human_review. - Input:
image_urlplus optional metadata (SKU,custom_id, route id). - Output (expected from announcements, not contractual): selected answer + confidence—thresholds are yours.
Custom brand drift and policy labels are not covered by OpenAI’s fixed Moderation categories—Decisions (or Structured Outputs / Luna) may fit if preview stabilizes.
Documented fallback today: Batch + Moderation
The Batch API guide includes /v1/moderations with omni-moderation-latest, multimodal image_url, and custom_id per line. Moderation docs expose flagged, categories, and category_scores; the sync endpoint is documented as free—useful for high-volume harm/safety gates.
Limitation: categories are OpenAI-defined, not your brand checklist. Drift detection stays a separate step or human review.
Retry routing without rerunning the full generation batch
Pattern aligned with batch semantics:
| Step | Action |
|---|---|
| G1 | Generation batch; each line: custom_id = stable catalog key. |
| C1 | Classification/moderation batch; same custom_id; URLs from G1. |
| Merge | Orchestrator state: approved, retry_route_B, quarantine. |
| G2 | New JSONL only for rows marked retry_route_B; different bulk-route id in the request body. |
| C2 | Re-classify G2 outputs only. |
Idempotency: do not regenerate successful G1 assets in G2. One catalog write per custom_id after final approved.
Operational risks (Scout): expired/private URLs break classify batches; wrong thresholds → off-brand publish; preview APIs → breaking changes; sequential batches → harder cost accounting.
Practical checklist for Bubble developers
- Define the pre-commit catalog contract (internal BIAIG): which fields block publish.
- Keep
custom_idend-to-end (generate → classify → retry). - Document bulk-route as (provider, model, prompt profile)—retry means route change, not rerunning the entire catalog job.
- Production gate now: Batch moderations for NSFW/harm; custom labels via a separate layer + human queue for preview models.
- Treat Decisions as pilot traffic until official schema, pricing, and Batch support exist.

Open questions (do not treat as settled)
- Decisions in Batch, image JSONL limits, abstain/unknown behavior.
- Pricing vs free batch moderations.
- How Decisions “safety protections” interact with Moderation for custom labels.
- False positive/negative thresholds at catalog scale and mandatory human review during preview.
Sources: DevDay community recap, TechCrunch, OpenAI Batch/Moderation docs, OpenAI Community (multi-step batch), secondary explainers (The New Stack, Vercel)—treat latency/confidence from the latter as unverified.