OpenAI Decisions: a decision model for mail and packages
OpenAI's Decisions API is a decision model: it answers one question from a fixed list of answers, with text or an image as context, and OpenAI reports it answers about ten times faster than GPT-6 Luna through the regular API. Mail gives it three moments: the envelope or label photo at arrival, the page text after a scan, and the mail class of an outgoing reply.
The API is in limited preview (announced 29 Sep 2026), so field names come from OpenAI's current reference; the examples show the pattern, not its schema. An answer is evidence for your policy, never permission: opening, forwarding and discarding stay proposals the owner approves at the quoted price.
open_and_scan becomes type: "scan", certified becomes mail_class: "certified".url (Live keys, one hour; Sandbox keys get the text) and the sender line as read. Answers: open_and_scan, forward_unopened, file_unopened, discard, needs_review. A scan is priced past the monthly allowance, so this is the cheapest point to decide.inbound.pages_ready: pages whose ocr_status is ready or needs_review, joined with page markers. One question per call: which queue owns it; does it ask for a written reply by mail.url, with item.kind package. Keyword rules on a package can only match the label.unknown, rebuilt when the list changes.An answer outside the list, the fallback, a sample: true item or a test-environment event records the decision and proposes nothing.
Scan and forward answers become proposals with expected_version, the current expected_quote and an idempotency key from the event ID. A discard answer is proposed too; the owner still confirms it.
The LLM drafts the reply; the decision model picks mail_class from first_class, priority, certified, certified_return_receipt or needs_review. Price it with dry_run=true, send with requires_approval=true, and set package_id to the inbound item it answers.
// 1. Envelope photo, signed for one hour (Live agent key)
GET https://mailbox.bot/api/v1/inbound-items/:id/pages
?signed_urls=true
→ pages[kind = exterior]: url, url_expires_at, text
// 2. One question, fixed answers, one fallback. Map onto the
// request fields in OpenAI's Decisions reference (preview).
{
"context": ["<exterior page url>",
"sender as read: <item.sender>"],
"question": "What should happen to this envelope?",
"answers": ["open_and_scan", "forward_unopened",
"file_unopened", "discard", "needs_review"]
}
// 3. Policy accepts "open_and_scan": a proposal, not a scan
POST https://mailbox.bot/api/v1/inbound-items/:id/actions
Idempotency-Key: decision-<event_id>
{ "type": "scan", "expected_version": <item.version>,
"expected_quote": <quotes.scan> }
→ 201 action.state "proposed", awaiting_member_approval: trueitem.id, the event ID and the question version. Changing an answer list is a new question, not an edit.inbound.keywords_matched is a free literal gate that decides whether a piece is worth a model call at all.