---
title: "Push a late result onto a quote (unreachable → ok)"
method: POST
path: "/v1/agent-door/results/{quoteId}"
tags: ["platform-push"]
---

# Push a late result onto a quote (unreachable → ok)

`POST /v1/agent-door/results/{quoteId}`

## Request

- Base URL: `https://api.bubblio.dev`
- URL: `https://api.bubblio.dev/v1/agent-door/results/{quoteId}`
- Auth: HTTP bearer

The >20s escape hatch (the SDK's `pushDoorResult`; `createBubblioToolRoute` calls
it automatically when a handler outlives the callback window). Requires the SIGNED
push (API key + V2 signature over `${timestamp}.${rawBody}` with the platform's
webhook secret) and the signed body must name this same quote — a captured push for
quote A can never replay against quote B. Only `unreachable → ok` exists: an
answered attempt is final, and a late FAILURE has nothing to push. The upgrade is
APPEND-shaped (original receipt fields survive verbatim; `result_received_at`
records the landing). A pushed `payment` summary must match the quote's pinned
price exactly — amounts on receipts are never rewritable — and may never carry a
credential (any surplus field is refused).

## Path parameters

- `quoteId` string, required

## Headers

- `X-Bubblio-Signature-V2` string, required
- `X-Bubblio-Timestamp` string, required

## Request body

- object
  - `quoteId` string, required
  - `result` object, required: ≤32KB serialized — refused (not truncated) over the cap.
  - `payment` PaymentSummary: The settled charge as receipts carry it — facts only, never a credential.
    - `rail` string, required
    - `amount_cents` integer, required
    - `currency` string, required
    - `ref` string, required: The provider reference (Stripe PaymentIntent / Checkout Session id).

## Response `200`

Receipt upgraded unreachable → ok.

- object

## Other responses

- `400`: One calm sentence naming the malformed field.
- `404`: UNIFORM: unknown quote, malformed id, stale/absent timestamp, or a signature that did not verify — all read the same body (`RESULT_PUSH_MISS`): "No quote accepts a result push here. Either the quote id is unknown, or the push was not signed correctly — check the webhook secret, the X-Bubblio-Timestamp freshness, and that the signed body carries this same quoteId." (Probing resistance: a rotation-stale secret is indistinguishable from a wrong quote id; the SDK refreshes its cached secret once and retries on this answer.)
- `409`: `code: already_resolved` (benign — the callback made it in time), `not_confirmed`, or `final_outcome`.
- `413`: Body over 64KB / result over 32KB.

---

[API](https://skmtc.dev/bubblio/apis/bubblio-agent-door-api.md) · [All operations](https://skmtc.dev/bubblio/apis/bubblio-agent-door-api/llms.txt) · [OpenAPI document](https://skmtc.dev/bubblio/apis/bubblio-agent-door-api/revisions/d858aff9c01d?raw)
